ETH Price: $2,427.02 (+3.40%)

Mintplex.xyz Pro (MINTPLEX PRO)
 

Overview

TokenID

117

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ERC721Sustainable

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-16
*/

// SPDX-License-Identifier: MIT
// This contract is the standalone version of ERC-721S - meaning deployment without use of a minproxy
// this version is specific to Mintplex.xyz needs and should not be re-used for generic NFT recycle/subscriptions
// Read more @ https://medium.com/@tcarambat/we-can-finally-kill-royalties-as-an-nft-business-model-36502e4938b4
// Twitter: @mintplexnft
//-------------DEPENDENCIES--------------------------//

// File: @openzeppelin/contracts/utils/Address.sol

// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if account is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, isContract will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on isContract to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's transfer: sends amount wei to
     * recipient, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by transfer, making them unable to receive funds via
     * transfer. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to recipient, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level call. A
     * plain call is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If target reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[abi.decode].
     *
     * Requirements:
     *
     * - target must be a contract.
     * - calling target with data must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[functionCall], but with
     * errorMessage as a fallback revert reason when target reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[functionCall],
     * but also transferring value wei to target.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least value.
     * - the called Solidity function must be payable.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[functionCallWithValue], but
     * with errorMessage as a fallback revert reason when target reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[functionCall],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[functionCall],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[functionCall],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[functionCall],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} tokenId token is transferred to this contract via {IERC721-safeTransferFrom}
     * by operator from from, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with IERC721.onERC721Received.selector.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * interfaceId. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 *
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when tokenId token is transferred from from to to.
     */
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );
    event ReclaimedMint(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );

    /**
     * @dev Emitted when owner enables approved to manage the tokenId token.
     */
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );

    /**
     * @dev Emitted when owner enables or disables (approved) operator to manage all of its assets.
     */
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    /**
     * @dev Returns the number of tokens in owner's account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the tokenId token.
     *
     * Requirements:
     *
     * - tokenId must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers tokenId token from from to to, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - from cannot be the zero address.
     * - to cannot be the zero address.
     * - tokenId token must exist and be owned by from.
     * - If the caller is not from, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If to refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers tokenId token from from to to.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - from cannot be the zero address.
     * - to cannot be the zero address.
     * - tokenId token must be owned by from.
     * - If the caller is not from, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to to to transfer tokenId token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - tokenId must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for tokenId token.
     *
     * Requirements:
     *
     * - tokenId must exist.
     */
    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);

    /**
     * @dev Approve or remove operator as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The operator cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the operator is allowed to manage all of the assets of owner.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);

    /**
     * @dev Safely transfers tokenId token from from to to.
     *
     * Requirements:
     *
     * - from cannot be the zero address.
     * - to cannot be the zero address.
     * - tokenId token must exist and be owned by from.
     * - If the caller is not from, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If to refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by owner at a given index of its token list.
     * Use along with {balanceOf} to enumerate all of owner's tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256);

    /**
     * @dev Returns a token ID at a given index of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for tokenId token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/utils/Strings.sol

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a uint256 to its ASCII string hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a uint256 to its ASCII string hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length)
        internal
        pure
        returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol

// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev 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 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].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a nonReentrant function from another nonReentrant
     * function is not supported. It is possible to prevent this from happening
     * by making the nonReentrant function external, and making it call a
     * private function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/utils/Context.sol

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev 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.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * onlyOwner, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    function _onlyOwner() private view {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    modifier onlyOwner() {
        _onlyOwner();
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * onlyOwner functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (newOwner).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (newOwner).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File contracts/OperatorFilter/IOperatorFilterRegistry.sol
pragma solidity ^0.8.9;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator)
        external
        view
        returns (bool);

    function register(address registrant) external;

    function registerAndSubscribe(address registrant, address subscription)
        external;

    function registerAndCopyEntries(
        address registrant,
        address registrantToCopy
    ) external;

    function updateOperator(
        address registrant,
        address operator,
        bool filtered
    ) external;

    function updateOperators(
        address registrant,
        address[] calldata operators,
        bool filtered
    ) external;

    function updateCodeHash(
        address registrant,
        bytes32 codehash,
        bool filtered
    ) external;

    function updateCodeHashes(
        address registrant,
        bytes32[] calldata codeHashes,
        bool filtered
    ) external;

    function subscribe(address registrant, address registrantToSubscribe)
        external;

    function unsubscribe(address registrant, bool copyExistingEntries) external;

    function subscriptionOf(address addr) external returns (address registrant);

    function subscribers(address registrant)
        external
        returns (address[] memory);

    function subscriberAt(address registrant, uint256 index)
        external
        returns (address);

    function copyEntriesOf(address registrant, address registrantToCopy)
        external;

    function isOperatorFiltered(address registrant, address operator)
        external
        returns (bool);

    function isCodeHashOfFiltered(address registrant, address operatorWithCode)
        external
        returns (bool);

    function isCodeHashFiltered(address registrant, bytes32 codeHash)
        external
        returns (bool);

    function filteredOperators(address addr)
        external
        returns (address[] memory);

    function filteredCodeHashes(address addr)
        external
        returns (bytes32[] memory);

    function filteredOperatorAt(address registrant, uint256 index)
        external
        returns (address);

    function filteredCodeHashAt(address registrant, uint256 index)
        external
        returns (bytes32);

    function isRegistered(address addr) external returns (bool);

    function codeHashOf(address addr) external returns (bytes32);
}

// File contracts/OperatorFilter/OperatorFilterer.sol
pragma solidity ^0.8.9;

abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(
                    address(this),
                    subscriptionOrRegistrantToCopy
                );
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(
                        address(this),
                        subscriptionOrRegistrantToCopy
                    );
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    function _onlyAllowedOperator(address from) private view {
        if (
            !(operatorFilterRegistry.isOperatorAllowed(
                address(this),
                msg.sender
            ) && operatorFilterRegistry.isOperatorAllowed(address(this), from))
        ) {
            revert OperatorNotAllowed(msg.sender);
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            _onlyAllowedOperator(from);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (
                !operatorFilterRegistry.isOperatorAllowed(
                    address(this),
                    operator
                )
            ) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

//-------------END DEPENDENCIES------------------------//

error TransactionCapExceeded();
error ExcessiveOwnedMints();
error MintZeroQuantity();
error InvalidPayment();
error CapExceeded();
error ValueCannotBeZero();
error CannotBeNullAddress();
error NoStateChange();
error TokenDoesNotExist();

error PublicMintClosed();
error AllowlistMintClosed();

error AddressNotAllowlisted();
error ERC20InsufficientBalance();
error ERC721RestrictedApprovalAddressRestricted();
error CannotReclaimNonExpiredToken();
error CannotExtendByThatQty();

// Rampp Contracts v2.1 (Teams.sol)
error InvalidTeamAddress();
error DuplicateTeamAddress();

pragma solidity ^0.8.0;

/**
 * Teams is a contract implementation to extend upon Ownable that allows multiple controllers
 * of a single contract to modify specific mint settings but not have overall ownership of the contract.
 * This will easily allow cross-collaboration via Mintplex.xyz.
 **/
abstract contract Teams is Ownable {
    mapping(address => bool) internal team;

    /**
     * @dev Adds an address to the team. Allows them to execute protected functions
     * @param _address the ETH address to add, cannot be 0x and cannot be in team already
     **/
    function addToTeam(address _address) public onlyOwner {
        if (_address == address(0)) revert InvalidTeamAddress();
        if (inTeam(_address)) revert DuplicateTeamAddress();

        team[_address] = true;
    }

    /**
     * @dev Removes an address to the team.
     * @param _address the ETH address to remove, cannot be 0x and must be in team
     **/
    function removeFromTeam(address _address) public onlyOwner {
        if (_address == address(0)) revert InvalidTeamAddress();
        if (!inTeam(_address)) revert InvalidTeamAddress();

        team[_address] = false;
    }

    function isTeamOrOwner(address _address) internal view returns (bool) {
        bool _isOwner = owner() == _address;
        bool _isTeam = inTeam(_address);
        return _isOwner || _isTeam;
    }

    /**
     * @dev Check if an address is valid and active in the team
     * @param _address ETH address to check for truthiness
     **/
    function inTeam(address _address) public view returns (bool) {
        if (_address == address(0)) revert InvalidTeamAddress();
        return team[_address] == true;
    }

    /**
     * @dev Throws if called by any account other than the owner or team member.
     */
    function _onlyTeamOrOwner() private view {
        bool _isOwner = owner() == _msgSender();
        bool _isTeam = inTeam(_msgSender());
        require(
            _isOwner || _isTeam,
            "Team: caller is not the owner or in Team."
        );
    }

    modifier onlyTeamOrOwner() {
        _onlyTeamOrOwner();
        _;
    }
}

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 *
 * 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.
 */
library MerkleProof {
    /**
     * @dev Returns true if a 'leaf' can be proved to be a part of a Merkle tree
     * defined by 'root'. For this, a 'proof' must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from 'leaf' using 'proof'. A 'proof' is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf)
        internal
        pure
        returns (bytes32)
    {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b)
        private
        pure
        returns (bytes32 value)
    {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: SingleStateMintStatus.sol

pragma solidity ^0.8.0;

// @dev Controls the entire state of minting to where only one state can be active at the same time.
// so the contract is either in public mint, or allowlist mint, but not both at the same time.
abstract contract SingleStateMintStatus is Teams {
    bytes32 public merkleRoot;
    bool private allowlistOpen = false;
    bool private publicMint = false;

    /**
     * @dev Update merkle root to reflect changes in Allowlist
     * @param _newMerkleRoot new merkle root to reflect most recent Allowlist
     */
    function updateMerkleRoot(bytes32 _newMerkleRoot) public onlyTeamOrOwner {
        if (_newMerkleRoot == merkleRoot) revert NoStateChange();
        merkleRoot = _newMerkleRoot;
    }

    /**
     * @dev Check the proof of an address if valid for merkle root
     * @param _to address to check for proof
     * @param _merkleProof Proof of the address to validate against root and leaf
     */
    function isAllowlisted(address _to, bytes32[] calldata _merkleProof)
        public
        view
        returns (bool)
    {
        if (merkleRoot == 0) revert CannotBeNullAddress();
        bytes32 leaf = keccak256(abi.encodePacked(_to));

        return MerkleProof.verify(_merkleProof, merkleRoot, leaf);
    }

    function inAllowlistMint() public view returns (bool) {
        return allowlistOpen == true && publicMint == false;
    }

    function inPublicMint() public view returns (bool) {
        return allowlistOpen == false && publicMint == true;
    }

    function openAllowlistMint() public onlyTeamOrOwner {
        allowlistOpen = true;
        publicMint = false;
    }

    function openPublicMint() public onlyTeamOrOwner {
        allowlistOpen = false;
        publicMint = true;
    }

    function closeMint() public onlyTeamOrOwner {
        allowlistOpen = false;
        publicMint = false;
    }
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 * Is Initializable
 * Has added concerns and functions to support subscribable NFTs
 */
abstract contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable,
    Teams,
    OperatorFilterer,
    SingleStateMintStatus
{
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
        uint256 expiryTimestamp;
    }

    uint256 private currentIndex;

    uint256 public collectionSize;
    uint256 public maxBatchSize;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    // however given that minting is restricted to single mint actions - this is true until bulk minting is enabled.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping owner address minted count - replaces AddressData
    mapping(address => uint256) internal _numberMinted;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /* @dev Mapping of restricted operator approvals set by contract Owner
     * This serves as an optional addition to ERC-721 so
     * that the contract owner can elect to prevent specific addresses/contracts
     * from being marked as the approver for a token. The reason for this
     * is that some projects may want to retain control of where their tokens can/can not be listed
     * either due to ethics, loyalty, or wanting trades to only occur on their personal marketplace.
     * By default, there are no restrictions. The contract owner must deliberatly block an address
     */
    mapping(address => bool) public restrictedApprovalAddresses;

    /**
     * @dev
     * maxBatchSize refers to how much a minter can mint at a time.
     * collectionSize_ refers to how many tokens are in the collection.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 collectionSize_
    ) OperatorFilterer(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6, true) {
        if (collectionSize_ == 0) revert ValueCannotBeZero();
        if (maxBatchSize_ == 0) revert ValueCannotBeZero();
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
        currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalMinted();
    }

    function currentTokenId() public view returns (uint256) {
        return _totalMinted();
    }

    function getNextTokenId() public view returns (uint256) {
        return _totalMinted() + 1;
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        unchecked {
            return currentIndex - _startTokenId();
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < totalSupply(), "ERC721A: global index out of bounds");
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("ERC721A: unable to get token of owner by index");
    }

    function _findExpiredSupplyOrToken() internal view returns (uint256, bool) {
        for (uint256 i = 1; i <= totalSupply(); i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                // if token was previously owned and expired the token address is not nullified
                if (isExpiredHelper(ownership)) {
                    // check expiry and if expired we know it is mintable, so return its id.
                    return (i, true);
                }
            }
        }
        return (0, false);
    }

    // @dev allows us to work through the minted stack and find the first available token that has been minted
    // but whos ownership is not null (unminted/burned), but is expired!
    // Okay to leave this publically readable so that buyer can know what they are minting. Useful for frontend?
    // See {IERC721Enumerable-tokenOfOwnerByIndex} for O(n) concerns when calling in contract.
    // @return uint256 tokenId available for reclaim.
    function findExpiredTokenId() public view returns (uint256) {
        (
            uint256 tokenId,
            bool expiredSupplyExists
        ) = _findExpiredSupplyOrToken();
        if (expiredSupplyExists) return tokenId;
        revert("ERC721A: No expired tokens found");
    }

    // @dev validation function to check if there is a possible mint available
    // This is a readable function of convenience of minting frontend.
    // @return bool there is at least 1 token in reclaim queue.
    function hasExpiredSupply() public view returns (bool) {
        (, bool expiredSupplyExists) = _findExpiredSupplyOrToken();
        return expiredSupplyExists;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert CannotBeNullAddress();
        return _balanceOf(owner);
    }

    // @dev this is a helper function for balanceOf that will return the true balance of an accounts ownership
    // by factoring in their balance with their number minted. This is important because typical token gating
    // applications only read this value.
    // @notice this will iterate of the entire collection so be wary of calling this when n >> 10000 from contracts
    function _balanceOf(address _owner) internal view returns (uint256) {
        uint256 count = 0;
        uint256 curr = currentIndex;
        unchecked {
            TokenOwnership memory ownership;
            while (curr != 0) {
                ownership = _ownerships[curr];
                if (ownership.addr == _owner && !isExpiredHelper(ownership)) {
                    count++;
                }
                curr--;
            }
        }

        return count;
    }

    // @dev Modified function that will revert if the ownership record found is also outside of expiry.
    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    if (isExpiredHelper(ownership)) {
                        revert("ERC721A: ownership of token has expired.");
                    }
                    return ownership;
                }

                // Invariant:
                // There will always be an ownership that has an address and is not burned
                // before an ownership that does not have an address and is not burned.
                // Hence, curr will not underflow.
                while (true) {
                    curr--;
                    ownership = _ownerships[curr];
                    if (ownership.addr != address(0)) {
                        if (isExpiredHelper(ownership)) {
                            revert("ERC721A: ownership of token has expired.");
                        }
                        return ownership;
                    }
                }
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }

    // @dev Internal helper function that will return an ownership EVEN if it is expired.
    // This is needed because normal OwnershipOf should return address(0) if the expiry date has passed
    // so that marketplaces and such do not associate ownership on refresh of item if it has expired.
    function ownershipOfExpiry(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }

                // Invariant:
                // There will always be an ownership that has an address and is not burned
                // before an ownership that does not have an address and is not burned.
                // Hence, curr will not underflow.
                while (true) {
                    curr--;
                    ownership = _ownerships[curr];
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                }
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return isExpired(tokenId) ? address(0) : ownershipOf(tokenId).addr;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        string memory baseURI = _baseURI();
        string memory baseURIExtension = _baseURIExtension();
        return
            bytes(baseURI).length > 0
                ? string(
                    abi.encodePacked(
                        baseURI,
                        tokenId.toString(),
                        baseURIExtension
                    )
                )
                : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the baseURI and the tokenId. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    function _baseURIExtension() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev Sets the value for an address to be in the restricted approval address pool.
     * Setting an address to true will disable token owners from being able to mark the address
     * for approval for trading. This would be used in theory to prevent token owners from listing
     * on specific marketplaces or protcols. Only modifible by the contract owner/team.
     * @param _address the marketplace/user to modify restriction status of
     * @param _isRestricted restriction status of the _address to be set. true => Restricted, false => Open
     */
    function setApprovalRestriction(address _address, bool _isRestricted)
        public
        onlyTeamOrOwner
    {
        restrictedApprovalAddresses[_address] = _isRestricted;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId)
        public
        override
        onlyAllowedOperatorApproval(to)
    {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, "ERC721A: approval to current owner");
        if (restrictedApprovalAddresses[to])
            revert ERC721RestrictedApprovalAddressRestricted();
        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721A: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721A: approved query for nonexistent token"
        );
        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        override
        onlyAllowedOperatorApproval(operator)
    {
        require(operator != _msgSender(), "ERC721A: approve to caller");
        if (restrictedApprovalAddresses[operator])
            revert ERC721RestrictedApprovalAddressRestricted();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override onlyAllowedOperator(from) {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override onlyAllowedOperator(from) {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override onlyAllowedOperator(from) {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Returns whether tokenId exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (_mint),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < currentIndex;
    }

    function _safeMint(
        address to,
        uint256 timeUnits,
        bool adminMint
    ) internal {
        _safeMint(to, timeUnits, adminMint, "");
    }

    /**
     * @dev Mints quantity tokens and transfers them to to.
     *
     * Requirements:
     *
     * - there must be quantity tokens remaining unminted in the total collection.
     * - to cannot be the zero address.
     * - quantity statically set to 1.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 timeUnits,
        bool adminMint,
        bytes memory _data
    ) internal {
        uint256 quantity = 1;
        uint256 startTokenId = currentIndex;
        if (to == address(0)) revert CannotBeNullAddress();
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), "ERC721A: token already minted");

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // do not count as mint if minted by admin.
        if (adminMint) {
            _numberMinted[to] = _numberMinted[to] + 1;
        }

        _ownerships[startTokenId] = TokenOwnership(
            to,
            uint64(block.timestamp),
            calcExpiry(timeUnits)
        );

        emit Transfer(address(0), to, startTokenId);
        require(
            _checkOnERC721Received(address(0), to, startTokenId, _data),
            "ERC721A: transfer to non ERC721Receiver implementer"
        );

        currentIndex = startTokenId + 1;
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    // @dev Mints a token that has since reached its expiry date and has returned to minting queue.
    // @notice this function is a fallback for _safemint but must be invoked manually. If findExpiredTokenId()
    // cannot find a pending token in the reclaimation stack - it will revert this call.
    // Only one mint at a time can occur during reclaimation.
    // The end result is it looks like a Transfer from the prev owner to the new owner, but without check for approval of prev owner
    // which is not required since the previous owner forefit their explict ownership via expired token.
    // Reclaim mints do not count as _numberMinted and someone can reclaim as many mints as they like.
    // Emits a {ReclaimedMint} event.
    function _reclaimMint(address to, uint256 timeUnits) internal {
        uint256 tokenId = findExpiredTokenId();
        TokenOwnership memory prevOwnership = ownershipOfExpiry(tokenId);

        if (to == address(0)) revert CannotBeNullAddress();
        if (!isExpiredHelper(prevOwnership))
            revert CannotReclaimNonExpiredToken();

        _beforeTokenTransfers(prevOwnership.addr, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);
        _ownerships[tokenId] = TokenOwnership(
            to,
            uint64(block.timestamp),
            calcExpiry(timeUnits)
        );

        emit ReclaimedMint(prevOwnership.addr, to, tokenId);
        _afterTokenTransfers(prevOwnership.addr, to, tokenId, 1);
    }

    /**
     * @dev Transfers tokenId from from to to.
     *
     * Requirements:
     *
     * - to cannot be the zero address.
     * - tokenId token must be owned by from.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(
            isApprovedOrOwner,
            "ERC721A: transfer caller is not owner nor approved"
        );
        require(
            prevOwnership.addr == from,
            "ERC721A: transfer from incorrect owner"
        );
        if (to == address(0)) revert CannotBeNullAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);
        _ownerships[tokenId] = TokenOwnership(
            to,
            uint64(block.timestamp),
            prevOwnership.expiryTimestamp
        );

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                    prevOwnership.addr,
                    prevOwnership.startTimestamp,
                    prevOwnership.expiryTimestamp
                );
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Approve to to operate on tokenId
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    uint256 public nextOwnerToExplicitlySet = 0;

    /**
     * @dev Explicitly set owners to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "quantity must be nonzero");
        if (currentIndex == _startTokenId()) revert("No Tokens Minted Yet");

        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > collectionSize - 1) {
            endIndex = collectionSize - 1;
        }
        // We know if the last one in the group exists, all in the group exist, due to serial ordering.
        require(_exists(endIndex), "not enough minted yet for this cleanup");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(
                    ownership.addr,
                    ownership.startTimestamp,
                    ownership.expiryTimestamp
                );
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721A: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When from and to are both non-zero, from's tokenId will be
     * transferred to to.
     * - When from is zero, tokenId will be minted for to.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when from and to are both non-zero.
     * - from and to are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    // @dev will return the expiry timestamp of a token in seconds
    // @notice this will still return a timestamp even if the token has long since expired.
    // @param tokenId the token in which you are querying for.
    // @return uint256 representation of seconds since Epoch
    function expiryOf(uint256 tokenId) public view returns (uint256) {
        if (!_exists(tokenId)) revert TokenDoesNotExist();
        return ownershipOfExpiry(tokenId).expiryTimestamp;
    }

    // @dev will return boolean of if expiryTimestamp is old
    // @notice this will still return a timestamp even if the token has long since expired.
    // @param tokenId the token in which you are querying for.
    function isExpired(uint256 tokenId) public view returns (bool) {
        if (!_exists(tokenId)) revert TokenDoesNotExist();
        return ownershipOfExpiry(tokenId).expiryTimestamp < block.timestamp;
    }

    // @dev Used internally only to prevent lookup of token repeatedly with OwnershipOf*
    function isExpiredHelper(TokenOwnership memory ownership)
        internal
        view
        returns (bool)
    {
        return ownership.expiryTimestamp < block.timestamp;
    }

    // @dev Allows any address to extend the ownership of anyones token
    // @notice If a token expires you cannot extend it, as it has gone into the reclaimation queue.
    // @notice Team or Owner do not have to pay the applicable fee that would normally be required.
    // @param tokenId the token in which you are querying for.
    // @param _extendByTimeUnits How many "units of time" you are adding. This is a qty that will be multiplied by baseSubscriptionTime
    function extendOwnership(uint256 tokenId, uint256 _extendByTimeUnits)
        public
        payable
    {
        if (!_exists(tokenId)) revert TokenDoesNotExist();
        if (_extendByTimeUnits == 0) revert ValueCannotBeZero();

        // If not Admin/Team we need to enfore the maximum amount of units that can be bought at once
        // and make sure they are not trying to extend beyond maximum window.
        // Admin/Team does not have to pay to extend time window
        if (!isTeamOrOwner(_msgSender())) {
            if (!canMintQty(_extendByTimeUnits)) revert CannotExtendByThatQty();
            if (msg.value != getPrice(1, _extendByTimeUnits))
                revert InvalidPayment();
        }

        uint256 ownershipKey = tokenId;
        TokenOwnership memory ownership = _ownerships[ownershipKey];

        // Calculate new future date for which expiryTimestamp will be
        // set to. New + added time. If extending time of expired token, it will revive the previous owner's claim.
        bool expired = ownership.expiryTimestamp < block.timestamp;
        uint256 remTime = expired
            ? 0
            : ownership.expiryTimestamp - block.timestamp;
        uint256 newFuture = calcExpiry(_extendByTimeUnits);
        _ownerships[ownershipKey].expiryTimestamp = (remTime + newFuture);
    }

    uint256 public baseSubscriptionTime; // time in seconds that will be base unit eg: 1yr => 31_560_000
    uint256 public pricePerTimeUnit; // public pricing
    uint256 public presalePricePerTimeUnit; // pricing in allowlist
    uint256 public maxQtyPerTxn = 10000; // max amount of time units that can be bought at once.

    function setUnitPrice(uint256 _feeInWei) public onlyTeamOrOwner {
        pricePerTimeUnit = _feeInWei;
    }

    function setPresaleUnitPrice(uint256 _feeInWei) public onlyTeamOrOwner {
        presalePricePerTimeUnit = _feeInWei;
    }

    // @dev Allows Team to set base subscription time unit that expiry time is calculated against. eg = 86400 => 1 day
    // @param _secondsPerUnit How many seconds the base unit will represent.
    function setSubscriptionTimeUnit(uint256 _secondsPerUnit)
        public
        onlyTeamOrOwner
    {
        if (_secondsPerUnit == 0) revert ValueCannotBeZero();
        baseSubscriptionTime = _secondsPerUnit;
    }

    /**
     * @dev Check if you can mint x time units in a single txn.
     * @param _amount amount of time units being purchased at once.
     */
    function canMintQty(uint256 _amount) public view returns (bool) {
        if (_amount == 0) revert ValueCannotBeZero();
        return _amount <= maxQtyPerTxn;
    }

    /**
     * @dev Set the max qty of time units available for purchase at once.
     * @param _newTimeUnitMax the new max of time units (in days, months, etc) a wallet can mint in a single tx. Must be >= 1
     */
    function setMaxQtyPerTx(uint256 _newTimeUnitMax) public onlyTeamOrOwner {
        if (_newTimeUnitMax == 0) revert ValueCannotBeZero();
        maxQtyPerTxn = _newTimeUnitMax;
    }

    // @dev Calculate price to be paid for specific qty and time unit. Will automatically return proper price depending
    // on if in allowlist (pre-sale) mode or not.
    // @param _qty the number of independent tokens that are being purchased
    // @param _timeUnits the number of time units being purchased (eg. days) - depends on baseSubscriptionTime setting
    // @return uint256 fee in wei for entire purchase
    function getPrice(uint256 _qty, uint256 _timeUnits)
        public
        view
        returns (uint256)
    {
        if (_qty == 0) revert MintZeroQuantity();
        if (_timeUnits == 0) revert ValueCannotBeZero();
        uint256 feePerUnit = inAllowlistMint()
            ? presalePricePerTimeUnit
            : pricePerTimeUnit;
        return (feePerUnit * _timeUnits) * _qty;
    }

    // @dev Calculate expiry date in future. This will tell you expiry time a proposed purchase would end at.
    // @param _timeUnits the number of time units being purchased (eg. days) - depends on baseSubscriptionTime setting
    // @return uint256 timestamp of seconds since epoch that sub will expire.
    function calcExpiry(uint256 _timeUnits) internal view returns (uint256) {
        if (_timeUnits == 0) revert ValueCannotBeZero();
        return block.timestamp + (baseSubscriptionTime * _timeUnits);
    }
}

interface IERC20 {
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function transfer(address _to, uint256 _amount) external returns (bool);

    function balanceOf(address account) external view returns (uint256);

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: WithdrawableV2
abstract contract WithdrawableV2 is Teams {
    address[] public payableAddresses;
    uint256[] public payableFees;
    uint256 public payableAddressCount;
    address public erc20Payable;

    /**
     * @dev Calculates the true payable balance of the contract
     */
    function withdrawAll() public onlyTeamOrOwner {
        if (address(this).balance == 0) revert ValueCannotBeZero();
        _withdrawAll(address(this).balance);
    }

    function _withdrawAll(uint256 balance) private {
        for (uint256 i = 0; i < payableAddressCount; i++) {
            _widthdraw(payableAddresses[i], (balance * payableFees[i]) / 100);
        }
    }

    function _widthdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }

    /**
     * @dev Allow contract owner to withdraw ERC-20 balance from contract
     * in the event ERC-20 tokens are paid to the contract for mints.
     * @param _tokenContract contract of ERC-20 token to withdraw
     * @param _amountToWithdraw balance to withdraw according to balanceOf of ERC-20 token in wei
     */
    function withdrawERC20(address _tokenContract, uint256 _amountToWithdraw)
        public
        onlyTeamOrOwner
    {
        if (_amountToWithdraw == 0) revert ValueCannotBeZero();
        IERC20 tokenContract = IERC20(_tokenContract);
        if (tokenContract.balanceOf(address(this)) < _amountToWithdraw)
            revert ERC20InsufficientBalance();
        tokenContract.transfer(erc20Payable, _amountToWithdraw); // Payout ERC-20 tokens to recipient
    }

    /**
     * @dev Set the payout of the ERC-20 token payout to a specific address
     * @param _newErc20Payable new payout addresses of ERC-20 tokens
     */
    function setERC20PayableAddress(address _newErc20Payable)
        public
        onlyTeamOrOwner
    {
        if (_newErc20Payable == address(0)) revert CannotBeNullAddress();
        if (_newErc20Payable == erc20Payable) revert NoStateChange();
        erc20Payable = _newErc20Payable;
    }

    function definePayables(
        address[] memory _newPayables,
        uint256[] memory _newFees
    ) public onlyTeamOrOwner {
        payableAddresses = _newPayables;
        payableFees = _newFees;
        payableAddressCount = _newPayables.length;
    }
}

// @title An implementation of ERC-721 with added benefits of minted tokens that have expiry dates that allow them to be reminted as they expire.
// @author Mintplex.xyz (Mintplex Labs Inc) (Twitter: @MintplexNFT)
// @notice https://medium.com/@tcarambat/we-can-finally-kill-royalties-as-an-nft-business-model-36502e4938b4
// @custom:experimental This is an experimental unaudited contract - Use at your own risk. Mint actions is RESTRICTED to single mints currently.
contract ERC721Sustainable is
    Ownable,
    Teams,
    ERC721A,
    WithdrawableV2,
    ReentrancyGuard
{
    constructor(
        address[] memory _payables,
        uint256[] memory _payouts,
        string memory tokenName,
        string memory tokenSymbol,
        uint256 _collectionSize,
        string memory initTokenUri,
        uint256 initSubTime,
        uint256[2] memory initPricing // public and allowlist pricing.
    ) ERC721A(tokenName, tokenSymbol, 1, _collectionSize) {
        erc20Payable = _msgSender();
        payableAddresses = _payables;
        payableFees = _payouts;
        payableAddressCount = _payables.length;
        _baseTokenURI = initTokenUri;
        baseSubscriptionTime = initSubTime;

        pricePerTimeUnit = initPricing[0];
        presalePricePerTimeUnit = initPricing[1];
    }

    uint256 public maxWalletMints = 1;
    uint8 public immutable CONTRACT_VERSION = 1;
    string public _baseTokenURI;
    string public _tokenExtension = ".json";

    /**
     * @dev Mints a token to an address with time unit multiplier
     * This is owner/team only and allows a fee-free/rule-free drop
     * @param _to address of the future owner of the token
     * @param _timeUnits amount of tokens to drop the owner
     */
    function adminMint(address _to, uint256 _timeUnits) public onlyTeamOrOwner {
        if (currentTokenId() != collectionSize) {
            if (currentTokenId() + 1 > collectionSize) revert CapExceeded();
            _safeMint(_to, _timeUnits, true);
            return;
        }
        _reclaimMint(_to, _timeUnits);
    }

    /**
     * @dev Mints single token to an address.
     * fee may or may not be required
     * @param _to address of the future owner of the token
     * @param _timeUnits time units being paid for (eg. 1 days, 10 mins, 14 months..)
     */
    function mintTo(address _to, uint256 _timeUnits) public payable {
        if (_timeUnits == 0) revert MintZeroQuantity();
        if (!inPublicMint()) revert PublicMintClosed();
        if (msg.value != getPrice(1, _timeUnits)) revert InvalidPayment();
        if (!canMintQty(_timeUnits)) revert TransactionCapExceeded();

        // need to determine if we should be minting from primary supply vs reclaiming an expired token
        if (currentTokenId() != collectionSize) {
            if (currentTokenId() + 1 > collectionSize) revert CapExceeded();
            if (!canMintAmount(_to, 1)) revert ExcessiveOwnedMints();
            _safeMint(_to, _timeUnits, false);
            return;
        }
        _reclaimMint(_to, _timeUnits);
    }

    /**
     * @dev Mints single token to an address using an allowlist.
     * fee may or may not be required
     * @param _to address of the future owner of the token
     * @param _timeUnits time units being paid for (eg. 1 days, 10 mins, 14 months..)
     * @param _merkleProof merkle proof array
     */
    function mintToAL(
        address _to,
        uint256 _timeUnits,
        bytes32[] calldata _merkleProof
    ) public payable {
        if (_timeUnits == 0) revert MintZeroQuantity();
        if (!inAllowlistMint()) revert AllowlistMintClosed();
        if (!isAllowlisted(_to, _merkleProof)) revert AddressNotAllowlisted();
        if (msg.value != getPrice(1, _timeUnits)) revert InvalidPayment();
        if (!canMintQty(_timeUnits)) revert TransactionCapExceeded();

        if (currentTokenId() != collectionSize) {
            if (currentTokenId() + 1 > collectionSize) revert CapExceeded();
            if (!canMintAmount(_to, 1)) revert ExcessiveOwnedMints();
            _safeMint(_to, _timeUnits, false);
            return;
        }
        _reclaimMint(_to, _timeUnits);
    }

    /**
     * @dev Check if wallet over maxWalletMints of tokens ever minted into existence.
     * @param _address address in question to check if minted count exceeds max
     * @notice this check is only ever applied when minting NEW tokens into existence. Otherwise
     * it would fall under a reclaim mint and would therefore not apply, since it is reviving a token.
     */
    function canMintAmount(address _address, uint256 _amount)
        public
        view
        returns (bool)
    {
        if (_amount == 0) revert ValueCannotBeZero();
        return (_numberMinted[_address] + _amount) <= maxWalletMints;
    }

    /**
     * @dev Update the maximum amount of tokens that can be minted by a unique wallet
     * @param _newWalletMax the new max of tokens a wallet can mint. Must be >= 1
     */
    function setWalletMax(uint256 _newWalletMax) public onlyTeamOrOwner {
        if (_newWalletMax == 0) revert ValueCannotBeZero();
        maxWalletMints = _newWalletMax;
    }

    /**
     * @dev Allows owner to set Max mints per tx. Useless currently as mints are limited to single mints.
     * @param _newMaxMint maximum amount of tokens allowed to mint per tx. Must be >= 1
     */
    function setMaxMint(uint256 _newMaxMint) public onlyTeamOrOwner {
        if (_newMaxMint == 0) revert ValueCannotBeZero();
        maxBatchSize = _newMaxMint;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    function _baseURIExtension()
        internal
        view
        virtual
        override
        returns (string memory)
    {
        return _tokenExtension;
    }

    function baseTokenURI() public view returns (string memory) {
        return _baseTokenURI;
    }

    function setBaseURI(string calldata baseURI) external onlyTeamOrOwner {
        _baseTokenURI = baseURI;
    }

    function setTokenExtension(string calldata newExtension)
        external
        onlyTeamOrOwner
    {
        _tokenExtension = newExtension;
    }

    function getOwnershipData(uint256 tokenId)
        external
        view
        returns (TokenOwnership memory)
    {
        return ownershipOf(tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"_payables","type":"address[]"},{"internalType":"uint256[]","name":"_payouts","type":"uint256[]"},{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint256","name":"_collectionSize","type":"uint256"},{"internalType":"string","name":"initTokenUri","type":"string"},{"internalType":"uint256","name":"initSubTime","type":"uint256"},{"internalType":"uint256[2]","name":"initPricing","type":"uint256[2]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AddressNotAllowlisted","type":"error"},{"inputs":[],"name":"AllowlistMintClosed","type":"error"},{"inputs":[],"name":"CannotBeNullAddress","type":"error"},{"inputs":[],"name":"CannotExtendByThatQty","type":"error"},{"inputs":[],"name":"CannotReclaimNonExpiredToken","type":"error"},{"inputs":[],"name":"CapExceeded","type":"error"},{"inputs":[],"name":"DuplicateTeamAddress","type":"error"},{"inputs":[],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[],"name":"ERC721RestrictedApprovalAddressRestricted","type":"error"},{"inputs":[],"name":"ExcessiveOwnedMints","type":"error"},{"inputs":[],"name":"InvalidPayment","type":"error"},{"inputs":[],"name":"InvalidTeamAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NoStateChange","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"PublicMintClosed","type":"error"},{"inputs":[],"name":"TokenDoesNotExist","type":"error"},{"inputs":[],"name":"TransactionCapExceeded","type":"error"},{"inputs":[],"name":"ValueCannotBeZero","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":"ReclaimedMint","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":"CONTRACT_VERSION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addToTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_timeUnits","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","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":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseSubscriptionTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"canMintAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"canMintQty","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_newPayables","type":"address[]"},{"internalType":"uint256[]","name":"_newFees","type":"uint256[]"}],"name":"definePayables","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"erc20Payable","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"expiryOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"_extendByTimeUnits","type":"uint256"}],"name":"extendOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"findExpiredTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint256","name":"expiryTimestamp","type":"uint256"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_qty","type":"uint256"},{"internalType":"uint256","name":"_timeUnits","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasExpiredSupply","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inAllowlistMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inPublicMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"inTeam","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isAllowlisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isExpired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxQtyPerTxn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_timeUnits","type":"uint256"}],"name":"mintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_timeUnits","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintToAL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openAllowlistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openPublicMint","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":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payableAddressCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payableAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payableFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePricePerTimeUnit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePerTimeUnit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeFromTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"restrictedApprovalAddresses","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":"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":"_address","type":"address"},{"internalType":"bool","name":"_isRestricted","type":"bool"}],"name":"setApprovalRestriction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newErc20Payable","type":"address"}],"name":"setERC20PayableAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTimeUnitMax","type":"uint256"}],"name":"setMaxQtyPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeInWei","type":"uint256"}],"name":"setPresaleUnitPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_secondsPerUnit","type":"uint256"}],"name":"setSubscriptionTimeUnit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newExtension","type":"string"}],"name":"setTokenExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeInWei","type":"uint256"}],"name":"setUnitPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWalletMax","type":"uint256"}],"name":"setWalletMax","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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":"bytes32","name":"_newMerkleRoot","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_amountToWithdraw","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6003805461ffff191690556000600e556127106012556001601881905560805260e0604052600560a081905264173539b7b760d91b60c09081526200004891601a91906200032d565b503480156200005657600080fd5b50604051620045af380380620045af8339810160408190526200007991620006ce565b8585600186733cc6cdda760b79bafa08df41ecfa224f810dceb6826200009f33620002dd565b6daaeb6d7670e522a718067333cd4e3b15620001e45780156200013257604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200011357600080fd5b505af115801562000128573d6000803e3d6000fd5b50505050620001e4565b6001600160a01b03821615620001835760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000f8565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001ca57600080fd5b505af1158015620001df573d6000803e3d6000fd5b505050505b50508062000205576040516363868c5560e11b815260040160405180910390fd5b8162000224576040516363868c5560e11b815260040160405180910390fd5b8351620002399060079060208701906200032d565b5082516200024f9060089060208601906200032d565b50600691909155600555505060016004819055601755601680546001600160a01b0319163317905587516200028c9060139060208b0190620003bc565b508651620002a29060149060208a019062000414565b5087516015558251620002bd9060199060208601906200032d565b50600f919091558051601055602001516011555062000813945050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200033b90620007d6565b90600052602060002090601f0160209004810192826200035f5760008555620003aa565b82601f106200037a57805160ff1916838001178555620003aa565b82800160010185558215620003aa579182015b82811115620003aa5782518255916020019190600101906200038d565b50620003b892915062000451565b5090565b828054828255906000526020600020908101928215620003aa579160200282015b82811115620003aa57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620003dd565b828054828255906000526020600020908101928215620003aa5791602002820182811115620003aa5782518255916020019190600101906200038d565b5b80821115620003b8576000815560010162000452565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620004a957620004a962000468565b604052919050565b60006001600160401b03821115620004cd57620004cd62000468565b5060051b60200190565b600082601f830112620004e957600080fd5b8151602062000502620004fc83620004b1565b6200047e565b82815260059290921b840181019181810190868411156200052257600080fd5b8286015b84811015620005565780516001600160a01b0381168114620005485760008081fd5b835291830191830162000526565b509695505050505050565b600082601f8301126200057357600080fd5b8151602062000586620004fc83620004b1565b82815260059290921b84018101918181019086841115620005a657600080fd5b8286015b84811015620005565780518352918301918301620005aa565b600082601f830112620005d557600080fd5b81516001600160401b03811115620005f157620005f162000468565b602062000607601f8301601f191682016200047e565b82815285828487010111156200061c57600080fd5b60005b838110156200063c5785810183015182820184015282016200061f565b838111156200064e5760008385840101525b5095945050505050565b600082601f8301126200066a57600080fd5b604080519081016001600160401b03811182821017156200068f576200068f62000468565b8060405250806040840185811115620006a757600080fd5b845b81811015620006c3578051835260209283019201620006a9565b509195945050505050565b600080600080600080600080610120898b031215620006ec57600080fd5b88516001600160401b03808211156200070457600080fd5b620007128c838d01620004d7565b995060208b01519150808211156200072957600080fd5b620007378c838d0162000561565b985060408b01519150808211156200074e57600080fd5b6200075c8c838d01620005c3565b975060608b01519150808211156200077357600080fd5b620007818c838d01620005c3565b965060808b0151955060a08b01519150808211156200079f57600080fd5b50620007ae8b828c01620005c3565b93505060c08901519150620007c78a60e08b0162000658565b90509295985092959890939650565b600181811c90821680620007eb57607f821691505b602082108114156200080d57634e487b7160e01b600052602260045260246000fd5b50919050565b608051613d806200082f60003960006106990152613d806000f3fe6080604052600436106104305760003560e01c80636e5e74d511610229578063a91bd1a91161012e578063d7224ba0116100b6578063e985e9c51161007a578063e985e9c514610c42578063eaf24ec014610c8b578063f2fde38b14610ca0578063f8c0fd2014610cc0578063fd19eaf014610cd557600080fd5b8063d7224ba014610bac578063d9548e5314610bc2578063dc1b732814610be2578063dfdedf6914610c02578063e58306f914610c2257600080fd5b8063c87b56dd116100fd578063c87b56dd14610b3a578063c94d8e7314610b5a578063caa0f92a14610b6d578063cfc86f7b14610b82578063d547cfb714610b9757600080fd5b8063a91bd1a914610ac4578063b88d4fde14610ae4578063baef73e914610b04578063c53a319e14610b2457600080fd5b80638da5cb5b116101b157806397fbe7dd1161018057806397fbe7dd14610a39578063a1af10ca14610a4e578063a1db978214610a6e578063a22cb46514610a8e578063a52d2fc214610aae57600080fd5b80638da5cb5b146109925780638ff4013f146109b05780639231ab2a146109d057806395d89b4114610a2457600080fd5b806383c81c41116101f857806383c81c4114610908578063853828b61461092857806385a65f6e1461093d57806388993c811461095d578063891bbe731461097257600080fd5b80636e5e74d51461089357806370a08231146108b3578063715018a6146108d35780637fb8c6d3146108e857600080fd5b806334d007661161033a5780634c23ce91116102c257806355f804b31161028657806355f804b3146108095780635b5d558d146108295780635cf4ee911461083e5780636352211e1461085e57806364f101f01461087e57600080fd5b80634c23ce91146107815780634c563215146107965780634c565f7c146107b65780634f6ccce7146107c9578063547520fe146107e957600080fd5b806343696f181161030957806343696f1814610703578063449a52f81461072357806345c0f5331461073657806345f7e06e1461074c5780634783f0ef1461076157600080fd5b806334d007661461067157806338b90333146106875780633e07311c146106cd57806342842e0e146106e357600080fd5b806318160ddd116103bd5780632913daa01161038c5780632913daa0146105ef5780632c9f9a32146106055780632eb4a7ab1461061b5780632f745c5914610631578063330067861461065157600080fd5b806318160ddd1461043557806323b872dd1461058f578063286c8137146105af57806328ff1b51146105cf57600080fd5b8063081812fc11610404578063081812fc146104df57806308ce9efc14610517578063095ea7b3146105395780630c76924414610559578063147c07181461056f57600080fd5b80629a9b7b1461043557806301ffc9a71461045d578063043a2a401461048d57806306fdde03146104bd575b600080fd5b34801561044157600080fd5b5061044a610cf5565b6040519081526020015b60405180910390f35b34801561046957600080fd5b5061047d610478366004613585565b610d09565b6040519015158152602001610454565b34801561049957600080fd5b5061047d6104a83660046135be565b600d6020526000908152604090205460ff1681565b3480156104c957600080fd5b506104d2610d76565b6040516104549190613631565b3480156104eb57600080fd5b506104ff6104fa366004613644565b610e08565b6040516001600160a01b039091168152602001610454565b34801561052357600080fd5b50610537610532366004613644565b610e96565b005b34801561054557600080fd5b5061053761055436600461365d565b610ec1565b34801561056557600080fd5b5061044a600f5481565b34801561057b57600080fd5b5061053761058a366004613687565b61101e565b34801561059b57600080fd5b506105376105aa3660046136f8565b611037565b3480156105bb57600080fd5b5061044a6105ca366004613644565b611082565b3480156105db57600080fd5b506105376105ea366004613808565b6110a3565b3480156105fb57600080fd5b5061044a60065481565b34801561061157600080fd5b5061044a60125481565b34801561062757600080fd5b5061044a60025481565b34801561063d57600080fd5b5061044a61064c36600461365d565b6110da565b34801561065d57600080fd5b5061047d61066c366004613912565b61125f565b34801561067d57600080fd5b5061044a60185481565b34801561069357600080fd5b506106bb7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610454565b3480156106d957600080fd5b5061044a60155481565b3480156106ef57600080fd5b506105376106fe3660046136f8565b611306565b34801561070f57600080fd5b5061053761071e3660046135be565b61136c565b61053761073136600461365d565b6113e8565b34801561074257600080fd5b5061044a60055481565b34801561075857600080fd5b50610537611502565b34801561076d57600080fd5b5061053761077c366004613644565b61151b565b34801561078d57600080fd5b5061047d61154b565b3480156107a257600080fd5b506105376107b1366004613644565b611570565b6105376107c4366004613964565b61157d565b3480156107d557600080fd5b5061044a6107e4366004613644565b6116c1565b3480156107f557600080fd5b50610537610804366004613644565b611729565b34801561081557600080fd5b50610537610824366004613687565b611754565b34801561083557600080fd5b5061044a611768565b34801561084a57600080fd5b5061044a610859366004613964565b6117cd565b34801561086a57600080fd5b506104ff610879366004613644565b611844565b34801561088a57600080fd5b5061053761186a565b34801561089f57600080fd5b5061047d6108ae366004613644565b61187f565b3480156108bf57600080fd5b5061044a6108ce3660046135be565b6118a8565b3480156108df57600080fd5b506105376118da565b3480156108f457600080fd5b506016546104ff906001600160a01b031681565b34801561091457600080fd5b50610537610923366004613994565b6118ee565b34801561093457600080fd5b50610537611921565b34801561094957600080fd5b50610537610958366004613644565b611950565b34801561096957600080fd5b5061047d61197b565b34801561097e57600080fd5b506104ff61098d366004613644565b6119a1565b34801561099e57600080fd5b506000546001600160a01b03166104ff565b3480156109bc57600080fd5b506105376109cb366004613644565b6119cb565b3480156109dc57600080fd5b506109f06109eb366004613644565b6119f6565b6040805182516001600160a01b031681526020808401516001600160401b0316908201529181015190820152606001610454565b348015610a3057600080fd5b506104d2611a1c565b348015610a4557600080fd5b5061047d611a2b565b348015610a5a57600080fd5b5061047d610a693660046135be565b611a3d565b348015610a7a57600080fd5b50610537610a8936600461365d565b611a8a565b348015610a9a57600080fd5b50610537610aa9366004613994565b611bd0565b348015610aba57600080fd5b5061044a60105481565b348015610ad057600080fd5b50610537610adf3660046135be565b611cda565b348015610af057600080fd5b50610537610aff3660046139cb565b611d5a565b348015610b1057600080fd5b5061044a610b1f366004613644565b611dfc565b348015610b3057600080fd5b5061044a60115481565b348015610b4657600080fd5b506104d2610b55366004613644565b611e37565b610537610b68366004613a8a565b611ea3565b348015610b7957600080fd5b5061044a611fe1565b348015610b8e57600080fd5b506104d2611ffb565b348015610ba357600080fd5b506104d2612089565b348015610bb857600080fd5b5061044a600e5481565b348015610bce57600080fd5b5061047d610bdd366004613644565b612098565b348015610bee57600080fd5b50610537610bfd366004613644565b6120d5565b348015610c0e57600080fd5b50610537610c1d3660046135be565b6120e2565b348015610c2e57600080fd5b50610537610c3d36600461365d565b612156565b348015610c4e57600080fd5b5061047d610c5d366004613ae3565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205460ff1690565b348015610c9757600080fd5b506104d26121af565b348015610cac57600080fd5b50610537610cbb3660046135be565b6121bc565b348015610ccc57600080fd5b50610537612235565b348015610ce157600080fd5b5061047d610cf036600461365d565b61224d565b6000610d046004546000190190565b905090565b60006001600160e01b031982166380ac58cd60e01b1480610d3a57506001600160e01b03198216635b5e139f60e01b145b80610d5557506001600160e01b0319821663780e9d6360e01b145b80610d7057506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060078054610d8590613b16565b80601f0160208091040260200160405190810160405280929190818152602001828054610db190613b16565b8015610dfe5780601f10610dd357610100808354040283529160200191610dfe565b820191906000526020600020905b815481529060010190602001808311610de157829003601f168201915b5050505050905090565b6000610e138261229d565b610e7a5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600a60205260409020546001600160a01b031690565b610e9e6122b3565b80610ebc576040516363868c5560e11b815260040160405180910390fd5b600f55565b81610ecb81612338565b6000610ed683611844565b9050806001600160a01b0316846001600160a01b03161415610f455760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610e71565b6001600160a01b0384166000908152600d602052604090205460ff1615610f7f5760405163d947c35f60e01b815260040160405180910390fd5b336001600160a01b0382161480610f9b5750610f9b8133610c5d565b61100d5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610e71565b611018848483612400565b50505050565b6110266122b3565b611032601a838361344a565b505050565b826daaeb6d7670e522a718067333cd4e3b15611077576001600160a01b03811633141561106e5761106984848461245c565b611018565b6110778161272b565b61101884848461245c565b6014818154811061109257600080fd5b600091825260209091200154905081565b6110ab6122b3565b81516110be9060139060208501906134ca565b5080516110d290601490602084019061351f565b505051601555565b60006110e5836118a8565b821061113e5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610e71565b6000611148610cf5565b905060008060005b838110156111ff57600081815260096020908152604091829020825160608101845281546001600160a01b038116808352600160a01b9091046001600160401b03169382019390935260019091015492810192909252156111b057805192505b876001600160a01b0316836001600160a01b031614156111ec57868414156111de57509350610d7092505050565b836111e881613b67565b9450505b50806111f781613b67565b915050611150565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610e71565b600254600090611282576040516322646a9760e21b815260040160405180910390fd5b6040516bffffffffffffffffffffffff19606086901b1660208201526000906034016040516020818303038152906040528051906020012090506112fd84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600254915084905061285e565b95945050505050565b826daaeb6d7670e522a718067333cd4e3b15611351576001600160a01b0381163314156113485761106984848460405180602001604052806000815250611d5a565b6113518161272b565b61101884848460405180602001604052806000815250611d5a565b611374612874565b6001600160a01b03811661139a5760405162afb37360e31b815260040160405180910390fd5b6113a381611a3d565b156113c157604051631002377360e01b815260040160405180910390fd5b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b806114065760405163b562e8dd60e01b815260040160405180910390fd5b61140e61197b565b61142b576040516316851fc760e11b815260040160405180910390fd5b6114366001826117cd565b34146114555760405163078d696560e31b815260040160405180910390fd5b61145e8161187f565b61147b576040516393eeb41560e01b815260040160405180910390fd5b600554611486610cf5565b146114f857600554611496610cf5565b6114a1906001613b82565b11156114c05760405163a4875a4960e01b815260040160405180910390fd5b6114cb82600161224d565b6114e8576040516366be767160e11b815260040160405180910390fd5b6114f4828260006128ce565b5050565b6114f482826128e9565b61150a6122b3565b6003805461ffff1916610100179055565b6115236122b3565b6002548114156115465760405163a28a88c160e01b815260040160405180910390fd5b600255565b60035460009060ff1615156001148015610d04575050600354610100900460ff161590565b6115786122b3565b601155565b6115868261229d565b6115a35760405163677510db60e11b815260040160405180910390fd5b806115c1576040516363868c5560e11b815260040160405180910390fd5b6115ca33612a21565b61161e576115d78161187f565b6115f457604051636e8522e760e11b815260040160405180910390fd5b6115ff6001826117cd565b341461161e5760405163078d696560e31b815260040160405180910390fd5b6000828152600960209081526040808320815160608101835281546001600160a01b0381168252600160a01b90046001600160401b031693810193909352600101549082018190528492429091109081611687574283604001516116829190613b9a565b61168a565b60005b9050600061169786612a67565b90506116a38183613b82565b60009586526009602052604090952060010194909455505050505050565b60006116cb610cf5565b82106117255760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610e71565b5090565b6117316122b3565b8061174f576040516363868c5560e11b815260040160405180910390fd5b600655565b61175c6122b3565b6110326019838361344a565b6000806000611775612a9f565b9150915080156117855750919050565b60405162461bcd60e51b815260206004820181905260248201527f455243373231413a204e6f206578706972656420746f6b656e7320666f756e646044820152606401610e71565b6000826117ed5760405163b562e8dd60e01b815260040160405180910390fd5b8161180b576040516363868c5560e11b815260040160405180910390fd5b600061181561154b565b61182157601054611825565b6011545b9050836118328483613bb1565b61183c9190613bb1565b949350505050565b600061184f82612098565b6118625761185c82612b3a565b51610d70565b600092915050565b6118726122b3565b6003805461ffff19169055565b60008161189f576040516363868c5560e11b815260040160405180910390fd5b50601254101590565b60006001600160a01b0382166118d1576040516322646a9760e21b815260040160405180910390fd5b610d7082612cf1565b6118e2612874565b6118ec6000612da0565b565b6118f66122b3565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b6119296122b3565b47611947576040516363868c5560e11b815260040160405180910390fd5b6118ec47612df0565b6119586122b3565b80611976576040516363868c5560e11b815260040160405180910390fd5b601255565b60035460009060ff16158015610d04575050600354600161010090910460ff1615151490565b601381815481106119b157600080fd5b6000918252602090912001546001600160a01b0316905081565b6119d36122b3565b806119f1576040516363868c5560e11b815260040160405180910390fd5b601855565b6040805160608101825260008082526020820181905291810191909152610d7082612b3a565b606060088054610d8590613b16565b600080611a36612a9f565b9392505050565b60006001600160a01b038216611a655760405162afb37360e31b815260040160405180910390fd5b506001600160a01b031660009081526001602081905260409091205460ff1615151490565b611a926122b3565b80611ab0576040516363868c5560e11b815260040160405180910390fd5b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a082319060240160206040518083038186803b158015611af357600080fd5b505afa158015611b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2b9190613bd0565b1015611b4a57604051631642df1760e21b815260040160405180910390fd5b60165460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490529082169063a9059cbb90604401602060405180830381600087803b158015611b9857600080fd5b505af1158015611bac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110189190613be9565b81611bda81612338565b6001600160a01b038316331415611c335760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610e71565b6001600160a01b0383166000908152600d602052604090205460ff1615611c6d5760405163d947c35f60e01b815260040160405180910390fd5b336000818152600c602090815260408083206001600160a01b03881680855290835292819020805460ff191687151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611ce26122b3565b6001600160a01b038116611d09576040516322646a9760e21b815260040160405180910390fd5b6016546001600160a01b0382811691161415611d385760405163a28a88c160e01b815260040160405180910390fd5b601680546001600160a01b0319166001600160a01b0392909216919091179055565b836daaeb6d7670e522a718067333cd4e3b15611dc2576001600160a01b038116331415611db957611d8c85858561245c565b611d9885858585612e7d565b611db45760405162461bcd60e51b8152600401610e7190613c06565b611df5565b611dc28161272b565b611dcd85858561245c565b611dd985858585612e7d565b611df55760405162461bcd60e51b8152600401610e7190613c06565b5050505050565b6000611e078261229d565b611e245760405163677510db60e11b815260040160405180910390fd5b611e2d82612f8a565b6040015192915050565b60606000611e43612089565b90506000611e4f61307d565b90506000825111611e6f576040518060200160405280600081525061183c565b81611e798561308c565b82604051602001611e8c93929190613c59565b604051602081830303815290604052949350505050565b82611ec15760405163b562e8dd60e01b815260040160405180910390fd5b611ec961154b565b611ee6576040516309c7220160e31b815260040160405180910390fd5b611ef184838361125f565b611f0e5760405163097b24df60e41b815260040160405180910390fd5b611f196001846117cd565b3414611f385760405163078d696560e31b815260040160405180910390fd5b611f418361187f565b611f5e576040516393eeb41560e01b815260040160405180910390fd5b600554611f69610cf5565b14611fd757600554611f79610cf5565b611f84906001613b82565b1115611fa35760405163a4875a4960e01b815260040160405180910390fd5b611fae84600161224d565b611fcb576040516366be767160e11b815260040160405180910390fd5b611069848460006128ce565b61101884846128e9565b6000611ff06004546000190190565b610d04906001613b82565b6019805461200890613b16565b80601f016020809104026020016040519081016040528092919081815260200182805461203490613b16565b80156120815780601f1061205657610100808354040283529160200191612081565b820191906000526020600020905b81548152906001019060200180831161206457829003601f168201915b505050505081565b606060198054610d8590613b16565b60006120a38261229d565b6120c05760405163677510db60e11b815260040160405180910390fd5b426120ca83612f8a565b604001511092915050565b6120dd6122b3565b601055565b6120ea612874565b6001600160a01b0381166121105760405162afb37360e31b815260040160405180910390fd5b61211981611a3d565b6121355760405162afb37360e31b815260040160405180910390fd5b6001600160a01b03166000908152600160205260409020805460ff19169055565b61215e6122b3565b600554612169610cf5565b146114f857600554612179610cf5565b612184906001613b82565b11156121a35760405163a4875a4960e01b815260040160405180910390fd5b6114f4828260016128ce565b601a805461200890613b16565b6121c4612874565b6001600160a01b0381166122295760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e71565b61223281612da0565b50565b61223d6122b3565b6003805461ffff19166001179055565b60008161226d576040516363868c5560e11b815260040160405180910390fd5b6018546001600160a01b0384166000908152600b6020526040902054612294908490613b82565b11159392505050565b600081600111158015610d705750506004541190565b600080546001600160a01b03163390811491906122cf90611a3d565b905081806122da5750805b6114f45760405162461bcd60e51b815260206004820152602960248201527f5465616d3a2063616c6c6572206973206e6f7420746865206f776e6572206f726044820152681034b7102a32b0b69760b91b6064820152608401610e71565b6daaeb6d7670e522a718067333cd4e3b1561223257604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b1580156123a057600080fd5b505afa1580156123b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d89190613be9565b61223257604051633b79c77360e21b81526001600160a01b0382166004820152602401610e71565b6000828152600a602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061246782612b3a565b80519091506000906001600160a01b0316336001600160a01b0316148061249e57503361249384610e08565b6001600160a01b0316145b806124b0575081516124b09033610c5d565b90508061251a5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610e71565b846001600160a01b031682600001516001600160a01b03161461258e5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610e71565b6001600160a01b0384166125b5576040516322646a9760e21b815260040160405180910390fd5b6125c56000848460000151612400565b604080516060810182526001600160a01b0380871682526001600160401b0342811660208085019182528786015185870190815260008a81526009909252958120945185549251909316600160a01b026001600160e01b03199092169290931691909117178255915160019182015561263f908590613b82565b6000818152600960205260409020549091506001600160a01b03166126e1576126678161229d565b156126e1576040805160608101825284516001600160a01b0390811682526020808701516001600160401b03908116828501908152888601518587019081526000888152600990945295909220935184549251909116600160a01b026001600160e01b031990921692169190911717815590516001909101555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b15801561277557600080fd5b505afa158015612789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ad9190613be9565b801561283f5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b15801561280757600080fd5b505afa15801561281b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283f9190613be9565b61223257604051633b79c77360e21b8152336004820152602401610e71565b60008261286b8584613189565b14949350505050565b6000546001600160a01b031633146118ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e71565b611032838383604051806020016040528060008152506131fd565b60006128f3611768565b9050600061290082612f8a565b90506001600160a01b038416612929576040516322646a9760e21b815260040160405180910390fd5b6040810151421161294d5760405163f7216c2360e01b815260040160405180910390fd5b61295d6000838360000151612400565b6040518060600160405280856001600160a01b03168152602001426001600160401b0316815260200161298f85612a67565b9052600083815260096020908152604080832084518154938601516001600160401b0316600160a01b026001600160e01b03199094166001600160a01b039182161793909317815593810151600190940193909355835192518593888316939216917f5962832d892fcadf37789c70f6f0526df4a1e0d8323d5027484dd9304187ced891a48051611018908584600184565b600080826001600160a01b0316612a406000546001600160a01b031690565b6001600160a01b03161490506000612a5784611a3d565b9050818061183c57509392505050565b600081612a87576040516363868c5560e11b815260040160405180910390fd5b81600f54612a959190613bb1565b610d709042613b82565b60008060015b612aad610cf5565b8111612b2f57600081815260096020908152604091829020825160608101845281546001600160a01b038116808352600160a01b9091046001600160401b0316938201939093526001909101549281019290925215612b1c576040810151421115612b1c575092600192509050565b5080612b2781613b67565b915050612aa5565b506000928392509050565b60408051606081018252600080825260208201819052918101919091528180600111158015612b6a575060045481105b15612c9157600081815260096020908152604091829020825160608101845281546001600160a01b038116808352600160a01b9091046001600160401b0316938201939093526001909101549281019290925215612c2857604081015142115b15611a365760405162461bcd60e51b815260206004820152602860248201527f455243373231413a206f776e657273686970206f6620746f6b656e206861732060448201526732bc3834b932b21760c11b6064820152608401610e71565b5060001901600081815260096020908152604091829020825160608101845281546001600160a01b038116808352600160a01b9091046001600160401b0316938201939093526001909101549281019290925215612c8c5760408101514211612bca565b612c28565b60405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610e71565b60045460408051606081018252600080825260208201819052918101829052909182915b8115612d975750600081815260096020908152604091829020825160608101845281546001600160a01b03808216808452600160a01b9092046001600160401b03169483019490945260019092015493810193909352908616148015612d7f575060408101514211155b15612d8b576001909201915b60001990910190612d15565b50909392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005b6015548110156114f457612e6b60138281548110612e1357612e13613c9c565b9060005260206000200160009054906101000a90046001600160a01b0316606460148481548110612e4657612e46613c9c565b906000526020600020015485612e5c9190613bb1565b612e669190613cc8565b6133b4565b80612e7581613b67565b915050612df3565b60006001600160a01b0384163b15612f7f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612ec1903390899088908890600401613cdc565b602060405180830381600087803b158015612edb57600080fd5b505af1925050508015612f0b575060408051601f3d908101601f19168201909252612f0891810190613d19565b60015b612f65573d808015612f39576040519150601f19603f3d011682016040523d82523d6000602084013e612f3e565b606091505b508051612f5d5760405162461bcd60e51b8152600401610e7190613c06565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061183c565b506001949350505050565b60408051606081018252600080825260208201819052918101919091528180600111158015612fba575060045481105b15612c9157600081815260096020908152604091829020825160608101845281546001600160a01b038116808352600160a01b9091046001600160401b0316938201939093526001909101549281019290925215613019579392505050565b5060001901600081815260096020908152604091829020825160608101845281546001600160a01b038116808352600160a01b9091046001600160401b0316938201939093526001909101549281019290925215613078579392505050565b613019565b6060601a8054610d8590613b16565b6060816130b05750506040805180820190915260018152600360fc1b602082015290565b8160005b81156130da57806130c481613b67565b91506130d39050600a83613cc8565b91506130b4565b6000816001600160401b038111156130f4576130f4613734565b6040519080825280601f01601f19166020018201604052801561311e576020820181803683370190505b5090505b841561183c57613133600183613b9a565b9150613140600a86613d36565b61314b906030613b82565b60f81b81838151811061316057613160613c9c565b60200101906001600160f81b031916908160001a905350613182600a86613cc8565b9450613122565b600081815b84518110156131f55760008582815181106131ab576131ab613c9c565b602002602001015190508083116131d157600083815260208290526040902092506131e2565b600081815260208490526040902092505b50806131ed81613b67565b91505061318e565b509392505050565b6004546001906001600160a01b03861661322a576040516322646a9760e21b815260040160405180910390fd5b6132338161229d565b156132805760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610e71565b83156132c4576001600160a01b0386166000908152600b60205260409020546132aa906001613b82565b6001600160a01b0387166000908152600b60205260409020555b6040518060600160405280876001600160a01b03168152602001426001600160401b031681526020016132f687612a67565b9052600082815260096020908152604080832084518154938601516001600160401b0316600160a01b026001600160e01b03199094166001600160a01b03918216179390931781559381015160019094019390935591518392891691907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46133856000878386612e7d565b6133a15760405162461bcd60e51b8152600401610e7190613c06565b6133ac816001613b82565b600455612723565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613401576040519150601f19603f3d011682016040523d82523d6000602084013e613406565b606091505b50509050806110325760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610e71565b82805461345690613b16565b90600052602060002090601f01602090048101928261347857600085556134be565b82601f106134915782800160ff198235161785556134be565b828001600101855582156134be579182015b828111156134be5782358255916020019190600101906134a3565b5061172592915061355a565b8280548282559060005260206000209081019282156134be579160200282015b828111156134be57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906134ea565b8280548282559060005260206000209081019282156134be579160200282015b828111156134be57825182559160200191906001019061353f565b5b80821115611725576000815560010161355b565b6001600160e01b03198116811461223257600080fd5b60006020828403121561359757600080fd5b8135611a368161356f565b80356001600160a01b03811681146135b957600080fd5b919050565b6000602082840312156135d057600080fd5b611a36826135a2565b60005b838110156135f45781810151838201526020016135dc565b838111156110185750506000910152565b6000815180845261361d8160208601602086016135d9565b601f01601f19169290920160200192915050565b602081526000611a366020830184613605565b60006020828403121561365657600080fd5b5035919050565b6000806040838503121561367057600080fd5b613679836135a2565b946020939093013593505050565b6000806020838503121561369a57600080fd5b82356001600160401b03808211156136b157600080fd5b818501915085601f8301126136c557600080fd5b8135818111156136d457600080fd5b8660208285010111156136e657600080fd5b60209290920196919550909350505050565b60008060006060848603121561370d57600080fd5b613716846135a2565b9250613724602085016135a2565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561377257613772613734565b604052919050565b60006001600160401b0382111561379357613793613734565b5060051b60200190565b600082601f8301126137ae57600080fd5b813560206137c36137be8361377a565b61374a565b82815260059290921b840181019181810190868411156137e257600080fd5b8286015b848110156137fd57803583529183019183016137e6565b509695505050505050565b6000806040838503121561381b57600080fd5b82356001600160401b038082111561383257600080fd5b818501915085601f83011261384657600080fd5b813560206138566137be8361377a565b82815260059290921b8401810191818101908984111561387557600080fd5b948201945b8386101561389a5761388b866135a2565b8252948201949082019061387a565b965050860135925050808211156138b057600080fd5b506138bd8582860161379d565b9150509250929050565b60008083601f8401126138d957600080fd5b5081356001600160401b038111156138f057600080fd5b6020830191508360208260051b850101111561390b57600080fd5b9250929050565b60008060006040848603121561392757600080fd5b613930846135a2565b925060208401356001600160401b0381111561394b57600080fd5b613957868287016138c7565b9497909650939450505050565b6000806040838503121561397757600080fd5b50508035926020909101359150565b801515811461223257600080fd5b600080604083850312156139a757600080fd5b6139b0836135a2565b915060208301356139c081613986565b809150509250929050565b600080600080608085870312156139e157600080fd5b6139ea856135a2565b935060206139f98187016135a2565b93506040860135925060608601356001600160401b0380821115613a1c57600080fd5b818801915088601f830112613a3057600080fd5b813581811115613a4257613a42613734565b613a54601f8201601f1916850161374a565b91508082528984828501011115613a6a57600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060008060608587031215613aa057600080fd5b613aa9856135a2565b93506020850135925060408501356001600160401b03811115613acb57600080fd5b613ad7878288016138c7565b95989497509550505050565b60008060408385031215613af657600080fd5b613aff836135a2565b9150613b0d602084016135a2565b90509250929050565b600181811c90821680613b2a57607f821691505b60208210811415613b4b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415613b7b57613b7b613b51565b5060010190565b60008219821115613b9557613b95613b51565b500190565b600082821015613bac57613bac613b51565b500390565b6000816000190483118215151615613bcb57613bcb613b51565b500290565b600060208284031215613be257600080fd5b5051919050565b600060208284031215613bfb57600080fd5b8151611a3681613986565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008451613c6b8184602089016135d9565b845190830190613c7f8183602089016135d9565b8451910190613c928183602088016135d9565b0195945050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082613cd757613cd7613cb2565b500490565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d0f90830184613605565b9695505050505050565b600060208284031215613d2b57600080fd5b8151611a368161356f565b600082613d4557613d45613cb2565b50069056fea2646970667358221220e146311acbfe9b03f4a6758ca778c07128caf41f389eb7653f6073eae1bf4f8e64736f6c634300080900330000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000028217000000000000000000000000000000000000000000000000000232bff5f46c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a9dac8f3aedc55d0fe707b86b8a45d246858d2e10000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000104d696e74706c65782e78797a2050726f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4d494e54504c45582050524f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569637a693471777064333336677a73346d7a6837756c35777674657776746977366f67746f78656c776e746d6b323636706f3778692f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106104305760003560e01c80636e5e74d511610229578063a91bd1a91161012e578063d7224ba0116100b6578063e985e9c51161007a578063e985e9c514610c42578063eaf24ec014610c8b578063f2fde38b14610ca0578063f8c0fd2014610cc0578063fd19eaf014610cd557600080fd5b8063d7224ba014610bac578063d9548e5314610bc2578063dc1b732814610be2578063dfdedf6914610c02578063e58306f914610c2257600080fd5b8063c87b56dd116100fd578063c87b56dd14610b3a578063c94d8e7314610b5a578063caa0f92a14610b6d578063cfc86f7b14610b82578063d547cfb714610b9757600080fd5b8063a91bd1a914610ac4578063b88d4fde14610ae4578063baef73e914610b04578063c53a319e14610b2457600080fd5b80638da5cb5b116101b157806397fbe7dd1161018057806397fbe7dd14610a39578063a1af10ca14610a4e578063a1db978214610a6e578063a22cb46514610a8e578063a52d2fc214610aae57600080fd5b80638da5cb5b146109925780638ff4013f146109b05780639231ab2a146109d057806395d89b4114610a2457600080fd5b806383c81c41116101f857806383c81c4114610908578063853828b61461092857806385a65f6e1461093d57806388993c811461095d578063891bbe731461097257600080fd5b80636e5e74d51461089357806370a08231146108b3578063715018a6146108d35780637fb8c6d3146108e857600080fd5b806334d007661161033a5780634c23ce91116102c257806355f804b31161028657806355f804b3146108095780635b5d558d146108295780635cf4ee911461083e5780636352211e1461085e57806364f101f01461087e57600080fd5b80634c23ce91146107815780634c563215146107965780634c565f7c146107b65780634f6ccce7146107c9578063547520fe146107e957600080fd5b806343696f181161030957806343696f1814610703578063449a52f81461072357806345c0f5331461073657806345f7e06e1461074c5780634783f0ef1461076157600080fd5b806334d007661461067157806338b90333146106875780633e07311c146106cd57806342842e0e146106e357600080fd5b806318160ddd116103bd5780632913daa01161038c5780632913daa0146105ef5780632c9f9a32146106055780632eb4a7ab1461061b5780632f745c5914610631578063330067861461065157600080fd5b806318160ddd1461043557806323b872dd1461058f578063286c8137146105af57806328ff1b51146105cf57600080fd5b8063081812fc11610404578063081812fc146104df57806308ce9efc14610517578063095ea7b3146105395780630c76924414610559578063147c07181461056f57600080fd5b80629a9b7b1461043557806301ffc9a71461045d578063043a2a401461048d57806306fdde03146104bd575b600080fd5b34801561044157600080fd5b5061044a610cf5565b6040519081526020015b60405180910390f35b34801561046957600080fd5b5061047d610478366004613585565b610d09565b6040519015158152602001610454565b34801561049957600080fd5b5061047d6104a83660046135be565b600d6020526000908152604090205460ff1681565b3480156104c957600080fd5b506104d2610d76565b6040516104549190613631565b3480156104eb57600080fd5b506104ff6104fa366004613644565b610e08565b6040516001600160a01b039091168152602001610454565b34801561052357600080fd5b50610537610532366004613644565b610e96565b005b34801561054557600080fd5b5061053761055436600461365d565b610ec1565b34801561056557600080fd5b5061044a600f5481565b34801561057b57600080fd5b5061053761058a366004613687565b61101e565b34801561059b57600080fd5b506105376105aa3660046136f8565b611037565b3480156105bb57600080fd5b5061044a6105ca366004613644565b611082565b3480156105db57600080fd5b506105376105ea366004613808565b6110a3565b3480156105fb57600080fd5b5061044a60065481565b34801561061157600080fd5b5061044a60125481565b34801561062757600080fd5b5061044a60025481565b34801561063d57600080fd5b5061044a61064c36600461365d565b6110da565b34801561065d57600080fd5b5061047d61066c366004613912565b61125f565b34801561067d57600080fd5b5061044a60185481565b34801561069357600080fd5b506106bb7f000000000000000000000000000000000000000000000000000000000000000181565b60405160ff9091168152602001610454565b3480156106d957600080fd5b5061044a60155481565b3480156106ef57600080fd5b506105376106fe3660046136f8565b611306565b34801561070f57600080fd5b5061053761071e3660046135be565b61136c565b61053761073136600461365d565b6113e8565b34801561074257600080fd5b5061044a60055481565b34801561075857600080fd5b50610537611502565b34801561076d57600080fd5b5061053761077c366004613644565b61151b565b34801561078d57600080fd5b5061047d61154b565b3480156107a257600080fd5b506105376107b1366004613644565b611570565b6105376107c4366004613964565b61157d565b3480156107d557600080fd5b5061044a6107e4366004613644565b6116c1565b3480156107f557600080fd5b50610537610804366004613644565b611729565b34801561081557600080fd5b50610537610824366004613687565b611754565b34801561083557600080fd5b5061044a611768565b34801561084a57600080fd5b5061044a610859366004613964565b6117cd565b34801561086a57600080fd5b506104ff610879366004613644565b611844565b34801561088a57600080fd5b5061053761186a565b34801561089f57600080fd5b5061047d6108ae366004613644565b61187f565b3480156108bf57600080fd5b5061044a6108ce3660046135be565b6118a8565b3480156108df57600080fd5b506105376118da565b3480156108f457600080fd5b506016546104ff906001600160a01b031681565b34801561091457600080fd5b50610537610923366004613994565b6118ee565b34801561093457600080fd5b50610537611921565b34801561094957600080fd5b50610537610958366004613644565b611950565b34801561096957600080fd5b5061047d61197b565b34801561097e57600080fd5b506104ff61098d366004613644565b6119a1565b34801561099e57600080fd5b506000546001600160a01b03166104ff565b3480156109bc57600080fd5b506105376109cb366004613644565b6119cb565b3480156109dc57600080fd5b506109f06109eb366004613644565b6119f6565b6040805182516001600160a01b031681526020808401516001600160401b0316908201529181015190820152606001610454565b348015610a3057600080fd5b506104d2611a1c565b348015610a4557600080fd5b5061047d611a2b565b348015610a5a57600080fd5b5061047d610a693660046135be565b611a3d565b348015610a7a57600080fd5b50610537610a8936600461365d565b611a8a565b348015610a9a57600080fd5b50610537610aa9366004613994565b611bd0565b348015610aba57600080fd5b5061044a60105481565b348015610ad057600080fd5b50610537610adf3660046135be565b611cda565b348015610af057600080fd5b50610537610aff3660046139cb565b611d5a565b348015610b1057600080fd5b5061044a610b1f366004613644565b611dfc565b348015610b3057600080fd5b5061044a60115481565b348015610b4657600080fd5b506104d2610b55366004613644565b611e37565b610537610b68366004613a8a565b611ea3565b348015610b7957600080fd5b5061044a611fe1565b348015610b8e57600080fd5b506104d2611ffb565b348015610ba357600080fd5b506104d2612089565b348015610bb857600080fd5b5061044a600e5481565b348015610bce57600080fd5b5061047d610bdd366004613644565b612098565b348015610bee57600080fd5b50610537610bfd366004613644565b6120d5565b348015610c0e57600080fd5b50610537610c1d3660046135be565b6120e2565b348015610c2e57600080fd5b50610537610c3d36600461365d565b612156565b348015610c4e57600080fd5b5061047d610c5d366004613ae3565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205460ff1690565b348015610c9757600080fd5b506104d26121af565b348015610cac57600080fd5b50610537610cbb3660046135be565b6121bc565b348015610ccc57600080fd5b50610537612235565b348015610ce157600080fd5b5061047d610cf036600461365d565b61224d565b6000610d046004546000190190565b905090565b60006001600160e01b031982166380ac58cd60e01b1480610d3a57506001600160e01b03198216635b5e139f60e01b145b80610d5557506001600160e01b0319821663780e9d6360e01b145b80610d7057506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060078054610d8590613b16565b80601f0160208091040260200160405190810160405280929190818152602001828054610db190613b16565b8015610dfe5780601f10610dd357610100808354040283529160200191610dfe565b820191906000526020600020905b815481529060010190602001808311610de157829003601f168201915b5050505050905090565b6000610e138261229d565b610e7a5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600a60205260409020546001600160a01b031690565b610e9e6122b3565b80610ebc576040516363868c5560e11b815260040160405180910390fd5b600f55565b81610ecb81612338565b6000610ed683611844565b9050806001600160a01b0316846001600160a01b03161415610f455760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610e71565b6001600160a01b0384166000908152600d602052604090205460ff1615610f7f5760405163d947c35f60e01b815260040160405180910390fd5b336001600160a01b0382161480610f9b5750610f9b8133610c5d565b61100d5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610e71565b611018848483612400565b50505050565b6110266122b3565b611032601a838361344a565b505050565b826daaeb6d7670e522a718067333cd4e3b15611077576001600160a01b03811633141561106e5761106984848461245c565b611018565b6110778161272b565b61101884848461245c565b6014818154811061109257600080fd5b600091825260209091200154905081565b6110ab6122b3565b81516110be9060139060208501906134ca565b5080516110d290601490602084019061351f565b505051601555565b60006110e5836118a8565b821061113e5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610e71565b6000611148610cf5565b905060008060005b838110156111ff57600081815260096020908152604091829020825160608101845281546001600160a01b038116808352600160a01b9091046001600160401b03169382019390935260019091015492810192909252156111b057805192505b876001600160a01b0316836001600160a01b031614156111ec57868414156111de57509350610d7092505050565b836111e881613b67565b9450505b50806111f781613b67565b915050611150565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610e71565b600254600090611282576040516322646a9760e21b815260040160405180910390fd5b6040516bffffffffffffffffffffffff19606086901b1660208201526000906034016040516020818303038152906040528051906020012090506112fd84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600254915084905061285e565b95945050505050565b826daaeb6d7670e522a718067333cd4e3b15611351576001600160a01b0381163314156113485761106984848460405180602001604052806000815250611d5a565b6113518161272b565b61101884848460405180602001604052806000815250611d5a565b611374612874565b6001600160a01b03811661139a5760405162afb37360e31b815260040160405180910390fd5b6113a381611a3d565b156113c157604051631002377360e01b815260040160405180910390fd5b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b806114065760405163b562e8dd60e01b815260040160405180910390fd5b61140e61197b565b61142b576040516316851fc760e11b815260040160405180910390fd5b6114366001826117cd565b34146114555760405163078d696560e31b815260040160405180910390fd5b61145e8161187f565b61147b576040516393eeb41560e01b815260040160405180910390fd5b600554611486610cf5565b146114f857600554611496610cf5565b6114a1906001613b82565b11156114c05760405163a4875a4960e01b815260040160405180910390fd5b6114cb82600161224d565b6114e8576040516366be767160e11b815260040160405180910390fd5b6114f4828260006128ce565b5050565b6114f482826128e9565b61150a6122b3565b6003805461ffff1916610100179055565b6115236122b3565b6002548114156115465760405163a28a88c160e01b815260040160405180910390fd5b600255565b60035460009060ff1615156001148015610d04575050600354610100900460ff161590565b6115786122b3565b601155565b6115868261229d565b6115a35760405163677510db60e11b815260040160405180910390fd5b806115c1576040516363868c5560e11b815260040160405180910390fd5b6115ca33612a21565b61161e576115d78161187f565b6115f457604051636e8522e760e11b815260040160405180910390fd5b6115ff6001826117cd565b341461161e5760405163078d696560e31b815260040160405180910390fd5b6000828152600960209081526040808320815160608101835281546001600160a01b0381168252600160a01b90046001600160401b031693810193909352600101549082018190528492429091109081611687574283604001516116829190613b9a565b61168a565b60005b9050600061169786612a67565b90506116a38183613b82565b60009586526009602052604090952060010194909455505050505050565b60006116cb610cf5565b82106117255760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610e71565b5090565b6117316122b3565b8061174f576040516363868c5560e11b815260040160405180910390fd5b600655565b61175c6122b3565b6110326019838361344a565b6000806000611775612a9f565b9150915080156117855750919050565b60405162461bcd60e51b815260206004820181905260248201527f455243373231413a204e6f206578706972656420746f6b656e7320666f756e646044820152606401610e71565b6000826117ed5760405163b562e8dd60e01b815260040160405180910390fd5b8161180b576040516363868c5560e11b815260040160405180910390fd5b600061181561154b565b61182157601054611825565b6011545b9050836118328483613bb1565b61183c9190613bb1565b949350505050565b600061184f82612098565b6118625761185c82612b3a565b51610d70565b600092915050565b6118726122b3565b6003805461ffff19169055565b60008161189f576040516363868c5560e11b815260040160405180910390fd5b50601254101590565b60006001600160a01b0382166118d1576040516322646a9760e21b815260040160405180910390fd5b610d7082612cf1565b6118e2612874565b6118ec6000612da0565b565b6118f66122b3565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b6119296122b3565b47611947576040516363868c5560e11b815260040160405180910390fd5b6118ec47612df0565b6119586122b3565b80611976576040516363868c5560e11b815260040160405180910390fd5b601255565b60035460009060ff16158015610d04575050600354600161010090910460ff1615151490565b601381815481106119b157600080fd5b6000918252602090912001546001600160a01b0316905081565b6119d36122b3565b806119f1576040516363868c5560e11b815260040160405180910390fd5b601855565b6040805160608101825260008082526020820181905291810191909152610d7082612b3a565b606060088054610d8590613b16565b600080611a36612a9f565b9392505050565b60006001600160a01b038216611a655760405162afb37360e31b815260040160405180910390fd5b506001600160a01b031660009081526001602081905260409091205460ff1615151490565b611a926122b3565b80611ab0576040516363868c5560e11b815260040160405180910390fd5b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a082319060240160206040518083038186803b158015611af357600080fd5b505afa158015611b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2b9190613bd0565b1015611b4a57604051631642df1760e21b815260040160405180910390fd5b60165460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490529082169063a9059cbb90604401602060405180830381600087803b158015611b9857600080fd5b505af1158015611bac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110189190613be9565b81611bda81612338565b6001600160a01b038316331415611c335760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610e71565b6001600160a01b0383166000908152600d602052604090205460ff1615611c6d5760405163d947c35f60e01b815260040160405180910390fd5b336000818152600c602090815260408083206001600160a01b03881680855290835292819020805460ff191687151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611ce26122b3565b6001600160a01b038116611d09576040516322646a9760e21b815260040160405180910390fd5b6016546001600160a01b0382811691161415611d385760405163a28a88c160e01b815260040160405180910390fd5b601680546001600160a01b0319166001600160a01b0392909216919091179055565b836daaeb6d7670e522a718067333cd4e3b15611dc2576001600160a01b038116331415611db957611d8c85858561245c565b611d9885858585612e7d565b611db45760405162461bcd60e51b8152600401610e7190613c06565b611df5565b611dc28161272b565b611dcd85858561245c565b611dd985858585612e7d565b611df55760405162461bcd60e51b8152600401610e7190613c06565b5050505050565b6000611e078261229d565b611e245760405163677510db60e11b815260040160405180910390fd5b611e2d82612f8a565b6040015192915050565b60606000611e43612089565b90506000611e4f61307d565b90506000825111611e6f576040518060200160405280600081525061183c565b81611e798561308c565b82604051602001611e8c93929190613c59565b604051602081830303815290604052949350505050565b82611ec15760405163b562e8dd60e01b815260040160405180910390fd5b611ec961154b565b611ee6576040516309c7220160e31b815260040160405180910390fd5b611ef184838361125f565b611f0e5760405163097b24df60e41b815260040160405180910390fd5b611f196001846117cd565b3414611f385760405163078d696560e31b815260040160405180910390fd5b611f418361187f565b611f5e576040516393eeb41560e01b815260040160405180910390fd5b600554611f69610cf5565b14611fd757600554611f79610cf5565b611f84906001613b82565b1115611fa35760405163a4875a4960e01b815260040160405180910390fd5b611fae84600161224d565b611fcb576040516366be767160e11b815260040160405180910390fd5b611069848460006128ce565b61101884846128e9565b6000611ff06004546000190190565b610d04906001613b82565b6019805461200890613b16565b80601f016020809104026020016040519081016040528092919081815260200182805461203490613b16565b80156120815780601f1061205657610100808354040283529160200191612081565b820191906000526020600020905b81548152906001019060200180831161206457829003601f168201915b505050505081565b606060198054610d8590613b16565b60006120a38261229d565b6120c05760405163677510db60e11b815260040160405180910390fd5b426120ca83612f8a565b604001511092915050565b6120dd6122b3565b601055565b6120ea612874565b6001600160a01b0381166121105760405162afb37360e31b815260040160405180910390fd5b61211981611a3d565b6121355760405162afb37360e31b815260040160405180910390fd5b6001600160a01b03166000908152600160205260409020805460ff19169055565b61215e6122b3565b600554612169610cf5565b146114f857600554612179610cf5565b612184906001613b82565b11156121a35760405163a4875a4960e01b815260040160405180910390fd5b6114f4828260016128ce565b601a805461200890613b16565b6121c4612874565b6001600160a01b0381166122295760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e71565b61223281612da0565b50565b61223d6122b3565b6003805461ffff19166001179055565b60008161226d576040516363868c5560e11b815260040160405180910390fd5b6018546001600160a01b0384166000908152600b6020526040902054612294908490613b82565b11159392505050565b600081600111158015610d705750506004541190565b600080546001600160a01b03163390811491906122cf90611a3d565b905081806122da5750805b6114f45760405162461bcd60e51b815260206004820152602960248201527f5465616d3a2063616c6c6572206973206e6f7420746865206f776e6572206f726044820152681034b7102a32b0b69760b91b6064820152608401610e71565b6daaeb6d7670e522a718067333cd4e3b1561223257604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b1580156123a057600080fd5b505afa1580156123b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d89190613be9565b61223257604051633b79c77360e21b81526001600160a01b0382166004820152602401610e71565b6000828152600a602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061246782612b3a565b80519091506000906001600160a01b0316336001600160a01b0316148061249e57503361249384610e08565b6001600160a01b0316145b806124b0575081516124b09033610c5d565b90508061251a5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610e71565b846001600160a01b031682600001516001600160a01b03161461258e5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610e71565b6001600160a01b0384166125b5576040516322646a9760e21b815260040160405180910390fd5b6125c56000848460000151612400565b604080516060810182526001600160a01b0380871682526001600160401b0342811660208085019182528786015185870190815260008a81526009909252958120945185549251909316600160a01b026001600160e01b03199092169290931691909117178255915160019182015561263f908590613b82565b6000818152600960205260409020549091506001600160a01b03166126e1576126678161229d565b156126e1576040805160608101825284516001600160a01b0390811682526020808701516001600160401b03908116828501908152888601518587019081526000888152600990945295909220935184549251909116600160a01b026001600160e01b031990921692169190911717815590516001909101555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b15801561277557600080fd5b505afa158015612789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ad9190613be9565b801561283f5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b15801561280757600080fd5b505afa15801561281b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283f9190613be9565b61223257604051633b79c77360e21b8152336004820152602401610e71565b60008261286b8584613189565b14949350505050565b6000546001600160a01b031633146118ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e71565b611032838383604051806020016040528060008152506131fd565b60006128f3611768565b9050600061290082612f8a565b90506001600160a01b038416612929576040516322646a9760e21b815260040160405180910390fd5b6040810151421161294d5760405163f7216c2360e01b815260040160405180910390fd5b61295d6000838360000151612400565b6040518060600160405280856001600160a01b03168152602001426001600160401b0316815260200161298f85612a67565b9052600083815260096020908152604080832084518154938601516001600160401b0316600160a01b026001600160e01b03199094166001600160a01b039182161793909317815593810151600190940193909355835192518593888316939216917f5962832d892fcadf37789c70f6f0526df4a1e0d8323d5027484dd9304187ced891a48051611018908584600184565b600080826001600160a01b0316612a406000546001600160a01b031690565b6001600160a01b03161490506000612a5784611a3d565b9050818061183c57509392505050565b600081612a87576040516363868c5560e11b815260040160405180910390fd5b81600f54612a959190613bb1565b610d709042613b82565b60008060015b612aad610cf5565b8111612b2f57600081815260096020908152604091829020825160608101845281546001600160a01b038116808352600160a01b9091046001600160401b0316938201939093526001909101549281019290925215612b1c576040810151421115612b1c575092600192509050565b5080612b2781613b67565b915050612aa5565b506000928392509050565b60408051606081018252600080825260208201819052918101919091528180600111158015612b6a575060045481105b15612c9157600081815260096020908152604091829020825160608101845281546001600160a01b038116808352600160a01b9091046001600160401b0316938201939093526001909101549281019290925215612c2857604081015142115b15611a365760405162461bcd60e51b815260206004820152602860248201527f455243373231413a206f776e657273686970206f6620746f6b656e206861732060448201526732bc3834b932b21760c11b6064820152608401610e71565b5060001901600081815260096020908152604091829020825160608101845281546001600160a01b038116808352600160a01b9091046001600160401b0316938201939093526001909101549281019290925215612c8c5760408101514211612bca565b612c28565b60405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610e71565b60045460408051606081018252600080825260208201819052918101829052909182915b8115612d975750600081815260096020908152604091829020825160608101845281546001600160a01b03808216808452600160a01b9092046001600160401b03169483019490945260019092015493810193909352908616148015612d7f575060408101514211155b15612d8b576001909201915b60001990910190612d15565b50909392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005b6015548110156114f457612e6b60138281548110612e1357612e13613c9c565b9060005260206000200160009054906101000a90046001600160a01b0316606460148481548110612e4657612e46613c9c565b906000526020600020015485612e5c9190613bb1565b612e669190613cc8565b6133b4565b80612e7581613b67565b915050612df3565b60006001600160a01b0384163b15612f7f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612ec1903390899088908890600401613cdc565b602060405180830381600087803b158015612edb57600080fd5b505af1925050508015612f0b575060408051601f3d908101601f19168201909252612f0891810190613d19565b60015b612f65573d808015612f39576040519150601f19603f3d011682016040523d82523d6000602084013e612f3e565b606091505b508051612f5d5760405162461bcd60e51b8152600401610e7190613c06565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061183c565b506001949350505050565b60408051606081018252600080825260208201819052918101919091528180600111158015612fba575060045481105b15612c9157600081815260096020908152604091829020825160608101845281546001600160a01b038116808352600160a01b9091046001600160401b0316938201939093526001909101549281019290925215613019579392505050565b5060001901600081815260096020908152604091829020825160608101845281546001600160a01b038116808352600160a01b9091046001600160401b0316938201939093526001909101549281019290925215613078579392505050565b613019565b6060601a8054610d8590613b16565b6060816130b05750506040805180820190915260018152600360fc1b602082015290565b8160005b81156130da57806130c481613b67565b91506130d39050600a83613cc8565b91506130b4565b6000816001600160401b038111156130f4576130f4613734565b6040519080825280601f01601f19166020018201604052801561311e576020820181803683370190505b5090505b841561183c57613133600183613b9a565b9150613140600a86613d36565b61314b906030613b82565b60f81b81838151811061316057613160613c9c565b60200101906001600160f81b031916908160001a905350613182600a86613cc8565b9450613122565b600081815b84518110156131f55760008582815181106131ab576131ab613c9c565b602002602001015190508083116131d157600083815260208290526040902092506131e2565b600081815260208490526040902092505b50806131ed81613b67565b91505061318e565b509392505050565b6004546001906001600160a01b03861661322a576040516322646a9760e21b815260040160405180910390fd5b6132338161229d565b156132805760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610e71565b83156132c4576001600160a01b0386166000908152600b60205260409020546132aa906001613b82565b6001600160a01b0387166000908152600b60205260409020555b6040518060600160405280876001600160a01b03168152602001426001600160401b031681526020016132f687612a67565b9052600082815260096020908152604080832084518154938601516001600160401b0316600160a01b026001600160e01b03199094166001600160a01b03918216179390931781559381015160019094019390935591518392891691907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46133856000878386612e7d565b6133a15760405162461bcd60e51b8152600401610e7190613c06565b6133ac816001613b82565b600455612723565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613401576040519150601f19603f3d011682016040523d82523d6000602084013e613406565b606091505b50509050806110325760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610e71565b82805461345690613b16565b90600052602060002090601f01602090048101928261347857600085556134be565b82601f106134915782800160ff198235161785556134be565b828001600101855582156134be579182015b828111156134be5782358255916020019190600101906134a3565b5061172592915061355a565b8280548282559060005260206000209081019282156134be579160200282015b828111156134be57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906134ea565b8280548282559060005260206000209081019282156134be579160200282015b828111156134be57825182559160200191906001019061353f565b5b80821115611725576000815560010161355b565b6001600160e01b03198116811461223257600080fd5b60006020828403121561359757600080fd5b8135611a368161356f565b80356001600160a01b03811681146135b957600080fd5b919050565b6000602082840312156135d057600080fd5b611a36826135a2565b60005b838110156135f45781810151838201526020016135dc565b838111156110185750506000910152565b6000815180845261361d8160208601602086016135d9565b601f01601f19169290920160200192915050565b602081526000611a366020830184613605565b60006020828403121561365657600080fd5b5035919050565b6000806040838503121561367057600080fd5b613679836135a2565b946020939093013593505050565b6000806020838503121561369a57600080fd5b82356001600160401b03808211156136b157600080fd5b818501915085601f8301126136c557600080fd5b8135818111156136d457600080fd5b8660208285010111156136e657600080fd5b60209290920196919550909350505050565b60008060006060848603121561370d57600080fd5b613716846135a2565b9250613724602085016135a2565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561377257613772613734565b604052919050565b60006001600160401b0382111561379357613793613734565b5060051b60200190565b600082601f8301126137ae57600080fd5b813560206137c36137be8361377a565b61374a565b82815260059290921b840181019181810190868411156137e257600080fd5b8286015b848110156137fd57803583529183019183016137e6565b509695505050505050565b6000806040838503121561381b57600080fd5b82356001600160401b038082111561383257600080fd5b818501915085601f83011261384657600080fd5b813560206138566137be8361377a565b82815260059290921b8401810191818101908984111561387557600080fd5b948201945b8386101561389a5761388b866135a2565b8252948201949082019061387a565b965050860135925050808211156138b057600080fd5b506138bd8582860161379d565b9150509250929050565b60008083601f8401126138d957600080fd5b5081356001600160401b038111156138f057600080fd5b6020830191508360208260051b850101111561390b57600080fd5b9250929050565b60008060006040848603121561392757600080fd5b613930846135a2565b925060208401356001600160401b0381111561394b57600080fd5b613957868287016138c7565b9497909650939450505050565b6000806040838503121561397757600080fd5b50508035926020909101359150565b801515811461223257600080fd5b600080604083850312156139a757600080fd5b6139b0836135a2565b915060208301356139c081613986565b809150509250929050565b600080600080608085870312156139e157600080fd5b6139ea856135a2565b935060206139f98187016135a2565b93506040860135925060608601356001600160401b0380821115613a1c57600080fd5b818801915088601f830112613a3057600080fd5b813581811115613a4257613a42613734565b613a54601f8201601f1916850161374a565b91508082528984828501011115613a6a57600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060008060608587031215613aa057600080fd5b613aa9856135a2565b93506020850135925060408501356001600160401b03811115613acb57600080fd5b613ad7878288016138c7565b95989497509550505050565b60008060408385031215613af657600080fd5b613aff836135a2565b9150613b0d602084016135a2565b90509250929050565b600181811c90821680613b2a57607f821691505b60208210811415613b4b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415613b7b57613b7b613b51565b5060010190565b60008219821115613b9557613b95613b51565b500190565b600082821015613bac57613bac613b51565b500390565b6000816000190483118215151615613bcb57613bcb613b51565b500290565b600060208284031215613be257600080fd5b5051919050565b600060208284031215613bfb57600080fd5b8151611a3681613986565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008451613c6b8184602089016135d9565b845190830190613c7f8183602089016135d9565b8451910190613c928183602088016135d9565b0195945050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082613cd757613cd7613cb2565b500490565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d0f90830184613605565b9695505050505050565b600060208284031215613d2b57600080fd5b8151611a368161356f565b600082613d4557613d45613cb2565b50069056fea2646970667358221220e146311acbfe9b03f4a6758ca778c07128caf41f389eb7653f6073eae1bf4f8e64736f6c63430008090033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000028217000000000000000000000000000000000000000000000000000232bff5f46c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a9dac8f3aedc55d0fe707b86b8a45d246858d2e10000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000104d696e74706c65782e78797a2050726f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4d494e54504c45582050524f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569637a693471777064333336677a73346d7a6837756c35777674657776746977366f67746f78656c776e746d6b323636706f3778692f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _payables (address[]): 0xa9dAC8f3aEDC55D0FE707B86B8A45d246858d2E1
Arg [1] : _payouts (uint256[]): 100
Arg [2] : tokenName (string): Mintplex.xyz Pro
Arg [3] : tokenSymbol (string): MINTPLEX PRO
Arg [4] : _collectionSize (uint256): 10000
Arg [5] : initTokenUri (string): ipfs://bafybeiczi4qwpd336gzs4mzh7ul5wvtewvtiw6ogtoxelwntmk266po7xi/
Arg [6] : initSubTime (uint256): 2630000
Arg [7] : initPricing (uint256[2]): 9900000000000000,0

-----Encoded View---------------
21 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [6] : 0000000000000000000000000000000000000000000000000000000000282170
Arg [7] : 00000000000000000000000000000000000000000000000000232bff5f46c000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 000000000000000000000000a9dac8f3aedc55d0fe707b86b8a45d246858d2e1
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [14] : 4d696e74706c65782e78797a2050726f00000000000000000000000000000000
Arg [15] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [16] : 4d494e54504c45582050524f0000000000000000000000000000000000000000
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [18] : 697066733a2f2f62616679626569637a693471777064333336677a73346d7a68
Arg [19] : 37756c35777674657776746977366f67746f78656c776e746d6b323636706f37
Arg [20] : 78692f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

77092:6079:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44250:96;;;;;;;;;;;;;:::i;:::-;;;160:25:1;;;148:2;133:18;44250:96:0;;;;;;;;47997:422;;;;;;;;;;-1:-1:-1;47997:422:0;;;;;:::i;:::-;;:::i;:::-;;;747:14:1;;740:22;722:41;;710:2;695:18;47997:422:0;582:187:1;43113:59:0;;;;;;;;;;-1:-1:-1;43113:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;52674:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;55518:290::-;;;;;;;;;;-1:-1:-1;55518:290:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2243:32:1;;;2225:51;;2213:2;2198:18;55518:290:0;2079:203:1;71415:224:0;;;;;;;;;;-1:-1:-1;71415:224:0;;;;;:::i;:::-;;:::i;:::-;;54866:586;;;;;;;;;;-1:-1:-1;54866:586:0;;;;;:::i;:::-;;:::i;70634:35::-;;;;;;;;;;;;;;;;82839:154;;;;;;;;;;-1:-1:-1;82839:154:0;;;;;:::i;:::-;;:::i;56707:188::-;;;;;;;;;;-1:-1:-1;56707:188:0;;;;;:::i;:::-;;:::i;74288:28::-;;;;;;;;;;-1:-1:-1;74288:28:0;;;;;:::i;:::-;;:::i;76348:265::-;;;;;;;;;;-1:-1:-1;76348:265:0;;;;;:::i;:::-;;:::i;41655:27::-;;;;;;;;;;;;;;;;70865:35;;;;;;;;;;;;;;;;38985:25;;;;;;;;;;;;;;;;45303:864;;;;;;;;;;-1:-1:-1;45303:864:0;;;;;:::i;:::-;;:::i;39668:324::-;;;;;;;;;;-1:-1:-1;39668:324:0;;;;;:::i;:::-;;:::i;77956:33::-;;;;;;;;;;;;;;;;77996:43;;;;;;;;;;;;;;;;;;7136:4:1;7124:17;;;7106:36;;7094:2;7079:18;77996:43:0;6964:184:1;74323:34:0;;;;;;;;;;;;;;;;56966:203;;;;;;;;;;-1:-1:-1;56966:203:0;;;;;:::i;:::-;;:::i;34539:224::-;;;;;;;;;;-1:-1:-1;34539:224:0;;;;;:::i;:::-;;:::i;78993:760::-;;;;;;:::i;:::-;;:::i;41619:29::-;;;;;;;;;;;;;;;;40389:117;;;;;;;;;;;;;:::i;39259:186::-;;;;;;;;;;-1:-1:-1;39259:186:0;;;;;:::i;:::-;;:::i;40000:124::-;;;;;;;;;;;;;:::i;71084:125::-;;;;;;;;;;-1:-1:-1;71084:125:0;;;;;:::i;:::-;;:::i;69269:1357::-;;;;;;:::i;:::-;;:::i;44772:228::-;;;;;;;;;;-1:-1:-1;44772:228:0;;;;;:::i;:::-;;:::i;82131:168::-;;;;;;;;;;-1:-1:-1;82131:168:0;;;;;:::i;:::-;;:::i;82719:112::-;;;;;;;;;;-1:-1:-1;82719:112:0;;;;;:::i;:::-;;:::i;47239:292::-;;;;;;;;;;;;;:::i;72812:401::-;;;;;;;;;;-1:-1:-1;72812:401:0;;;;;:::i;:::-;;:::i;52449:158::-;;;;;;;;;;-1:-1:-1;52449:158:0;;;;;:::i;:::-;;:::i;40514:113::-;;;;;;;;;;;;;:::i;71799:168::-;;;;;;;;;;-1:-1:-1;71799:168:0;;;;;:::i;:::-;;:::i;48483:180::-;;;;;;;;;;-1:-1:-1;48483:180:0;;;;;:::i;:::-;;:::i;26877:103::-;;;;;;;;;;;;;:::i;74364:27::-;;;;;;;;;;-1:-1:-1;74364:27:0;;;;-1:-1:-1;;;;;74364:27:0;;;54616:188;;;;;;;;;;-1:-1:-1;54616:188:0;;;;;:::i;:::-;;:::i;74483:169::-;;;;;;;;;;;;;:::i;72195:184::-;;;;;;;;;;-1:-1:-1;72195:184:0;;;;;:::i;:::-;;:::i;40132:121::-;;;;;;;;;;;;;:::i;74248:33::-;;;;;;;;;;-1:-1:-1;74248:33:0;;;;;:::i;:::-;;:::i;26154:87::-;;;;;;;;;;-1:-1:-1;26200:7:0;26227:6;-1:-1:-1;;;;;26227:6:0;26154:87;;81731:178;;;;;;;;;;-1:-1:-1;81731:178:0;;;;;:::i;:::-;;:::i;83001:167::-;;;;;;;;;;-1:-1:-1;83001:167:0;;;;;:::i;:::-;;:::i;:::-;;;;8266:13:1;;-1:-1:-1;;;;;8262:39:1;8244:58;;8362:4;8350:17;;;8344:24;-1:-1:-1;;;;;8340:49:1;8318:20;;;8311:79;8434:17;;;8428:24;8406:20;;;8399:54;8232:2;8217:18;83001:167:0;8034:425:1;52843:104:0;;;;;;;;;;;;;:::i;47756:169::-;;;;;;;;;;;;;:::i;35511:175::-;;;;;;;;;;-1:-1:-1;35511:175:0;;;;;:::i;:::-;;:::i;75394:473::-;;;;;;;;;;-1:-1:-1;75394:473:0;;;;;:::i;:::-;;:::i;55880:475::-;;;;;;;;;;-1:-1:-1;55880:475:0;;;;;:::i;:::-;;:::i;70740:31::-;;;;;;;;;;;;;;;;76040:300;;;;;;;;;;-1:-1:-1;76040:300:0;;;;;:::i;:::-;;:::i;57240:381::-;;;;;;;;;;-1:-1:-1;57240:381:0;;;;;:::i;:::-;;:::i;67870:193::-;;;;;;;;;;-1:-1:-1;67870:193:0;;;;;:::i;:::-;;:::i;70796:38::-;;;;;;;;;;;;;;;;53018:561;;;;;;;;;;-1:-1:-1;53018:561:0;;;;;:::i;:::-;;:::i;80078:810::-;;;;;;:::i;:::-;;:::i;44354:100::-;;;;;;;;;;;;;:::i;78046:27::-;;;;;;;;;;;;;:::i;82612:99::-;;;;;;;;;;;;;:::i;63602:43::-;;;;;;;;;;;;;;;;68290:209;;;;;;;;;;-1:-1:-1;68290:209:0;;;;;:::i;:::-;;:::i;70965:111::-;;;;;;;;;;-1:-1:-1;70965:111:0;;;;;:::i;:::-;;:::i;34919:229::-;;;;;;;;;;-1:-1:-1;34919:229:0;;;;;:::i;:::-;;:::i;78403:331::-;;;;;;;;;;-1:-1:-1;78403:331:0;;;;;:::i;:::-;;:::i;56426:214::-;;;;;;;;;;-1:-1:-1;56426:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;56597:25:0;;;56568:4;56597:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;56426:214;78080:39;;;;;;;;;;;;;:::i;27133:238::-;;;;;;;;;;-1:-1:-1;27133:238:0;;;;;:::i;:::-;;:::i;40261:120::-;;;;;;;;;;;;;:::i;81284:251::-;;;;;;;;;;-1:-1:-1;81284:251:0;;;;;:::i;:::-;;:::i;44250:96::-;44297:7;44324:14;44646:12;;-1:-1:-1;;44646:30:0;;44547:148;44324:14;44317:21;;44250:96;:::o;47997:422::-;48144:4;-1:-1:-1;;;;;;48186:40:0;;-1:-1:-1;;;48186:40:0;;:105;;-1:-1:-1;;;;;;;48243:48:0;;-1:-1:-1;;;48243:48:0;48186:105;:172;;;-1:-1:-1;;;;;;;48308:50:0;;-1:-1:-1;;;48308:50:0;48186:172;:225;;;-1:-1:-1;;;;;;;;;;12303:40:0;;;48375:36;48166:245;47997:422;-1:-1:-1;;47997:422:0:o;52674:100::-;52728:13;52761:5;52754:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52674:100;:::o;55518:290::-;55622:7;55669:16;55677:7;55669;:16::i;:::-;55647:111;;;;-1:-1:-1;;;55647:111:0;;10885:2:1;55647:111:0;;;10867:21:1;10924:2;10904:18;;;10897:30;10963:34;10943:18;;;10936:62;-1:-1:-1;;;11014:18:1;;;11007:43;11067:19;;55647:111:0;;;;;;;;;-1:-1:-1;55776:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;55776:24:0;;55518:290::o;71415:224::-;36106:18;:16;:18::i;:::-;71534:20;71530:52:::1;;71563:19;;-1:-1:-1::0;;;71563:19:0::1;;;;;;;;;;;71530:52;71593:20;:38:::0;71415:224::o;54866:586::-;54983:2;32718:30;32739:8;32718:20;:30::i;:::-;55003:13:::1;55019:24;55035:7;55019:15;:24::i;:::-;55003:40;;55068:5;-1:-1:-1::0;;;;;55062:11:0::1;:2;-1:-1:-1::0;;;;;55062:11:0::1;;;55054:58;;;::::0;-1:-1:-1;;;55054:58:0;;11299:2:1;55054:58:0::1;::::0;::::1;11281:21:1::0;11338:2;11318:18;;;11311:30;11377:34;11357:18;;;11350:62;-1:-1:-1;;;11428:18:1;;;11421:32;11470:19;;55054:58:0::1;11097:398:1::0;55054:58:0::1;-1:-1:-1::0;;;;;55127:31:0;::::1;;::::0;;;:27:::1;:31;::::0;;;;;::::1;;55123:100;;;55180:43;;-1:-1:-1::0;;;55180:43:0::1;;;;;;;;;;;55123:100;24939:10:::0;-1:-1:-1;;;;;55256:21:0;::::1;;::::0;:62:::1;;-1:-1:-1::0;55281:37:0::1;55298:5:::0;24939:10;56426:214;:::i;55281:37::-:1;55234:169;;;::::0;-1:-1:-1;;;55234:169:0;;11702:2:1;55234:169:0::1;::::0;::::1;11684:21:1::0;11741:2;11721:18;;;11714:30;11780:34;11760:18;;;11753:62;11851:27;11831:18;;;11824:55;11896:19;;55234:169:0::1;11500:421:1::0;55234:169:0::1;55416:28;55425:2;55429:7;55438:5;55416:8;:28::i;:::-;54992:460;54866:586:::0;;;:::o;82839:154::-;36106:18;:16;:18::i;:::-;82955:30:::1;:15;82973:12:::0;;82955:30:::1;:::i;:::-;;82839:154:::0;;:::o;56707:188::-;56842:4;30570:42;32205:43;:47;32201:416;;-1:-1:-1;;;;;32484:18:0;;32492:10;32484:18;32480:85;;;56859:28:::1;56869:4;56875:2;56879:7;56859:9;:28::i;:::-;32543:7:::0;;32480:85;32579:26;32600:4;32579:20;:26::i;:::-;56859:28:::1;56869:4;56875:2;56879:7;56859:9;:28::i;74288:::-:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74288:28:0;:::o;76348:265::-;36106:18;:16;:18::i;:::-;76489:31;;::::1;::::0;:16:::1;::::0;:31:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;76531:22:0;;::::1;::::0;:11:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;76586:19:0;76564::::1;:41:::0;76348:265::o;45303:864::-;45428:7;45469:16;45479:5;45469:9;:16::i;:::-;45461:5;:24;45453:71;;;;-1:-1:-1;;;45453:71:0;;12128:2:1;45453:71:0;;;12110:21:1;12167:2;12147:18;;;12140:30;12206:34;12186:18;;;12179:62;-1:-1:-1;;;12257:18:1;;;12250:32;12299:19;;45453:71:0;11926:398:1;45453:71:0;45535:22;45560:13;:11;:13::i;:::-;45535:38;;45584:19;45618:25;45672:9;45667:426;45691:14;45687:1;:18;45667:426;;;45727:31;45761:14;;;:11;:14;;;;;;;;;45727:48;;;;;;;;;-1:-1:-1;;;;;45727:48:0;;;;;-1:-1:-1;;;45727:48:0;;;-1:-1:-1;;;;;45727:48:0;;;;;;;;;;;;;;;;;;;;45794:28;45790:103;;45863:14;;;-1:-1:-1;45790:103:0;45932:5;-1:-1:-1;;;;;45911:26:0;:17;-1:-1:-1;;;;;45911:26:0;;45907:175;;;45977:5;45962:11;:20;45958:77;;;-1:-1:-1;46014:1:0;-1:-1:-1;46007:8:0;;-1:-1:-1;;;46007:8:0;45958:77;46053:13;;;;:::i;:::-;;;;45907:175;-1:-1:-1;45707:3:0;;;;:::i;:::-;;;;45667:426;;;-1:-1:-1;46103:56:0;;-1:-1:-1;;;46103:56:0;;12803:2:1;46103:56:0;;;12785:21:1;12842:2;12822:18;;;12815:30;12881:34;12861:18;;;12854:62;-1:-1:-1;;;12932:18:1;;;12925:44;12986:19;;46103:56:0;12601:410:1;39668:324:0;39811:10;;39785:4;;39807:49;;39835:21;;-1:-1:-1;;;39835:21:0;;;;;;;;;;;39807:49;39892:21;;-1:-1:-1;;13165:2:1;13161:15;;;13157:53;39892:21:0;;;13145:66:1;39867:12:0;;13227::1;;39892:21:0;;;;;;;;;;;;39882:32;;;;;;39867:47;;39934:50;39953:12;;39934:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39967:10:0;;;-1:-1:-1;39979:4:0;;-1:-1:-1;39934:18:0;:50::i;:::-;39927:57;39668:324;-1:-1:-1;;;;;39668:324:0:o;56966:203::-;57105:4;30570:42;32205:43;:47;32201:416;;-1:-1:-1;;;;;32484:18:0;;32492:10;32484:18;32480:85;;;57122:39:::1;57139:4;57145:2;57149:7;57122:39;;;;;;;;;;;::::0;:16:::1;:39::i;32480:85::-:0;32579:26;32600:4;32579:20;:26::i;:::-;57122:39:::1;57139:4;57145:2;57149:7;57122:39;;;;;;;;;;;::::0;:16:::1;:39::i;34539:224::-:0;26496:12;:10;:12::i;:::-;-1:-1:-1;;;;;34608:22:0;::::1;34604:55;;34639:20;;-1:-1:-1::0;;;34639:20:0::1;;;;;;;;;;;34604:55;34674:16;34681:8;34674:6;:16::i;:::-;34670:51;;;34699:22;;-1:-1:-1::0;;;34699:22:0::1;;;;;;;;;;;34670:51;-1:-1:-1::0;;;;;34734:14:0::1;;::::0;;;34751:4:::1;34734:14;::::0;;;;;;;:21;;-1:-1:-1;;34734:21:0::1;::::0;;::::1;::::0;;34539:224::o;78993:760::-;79072:15;79068:46;;79096:18;;-1:-1:-1;;;79096:18:0;;;;;;;;;;;79068:46;79130:14;:12;:14::i;:::-;79125:46;;79153:18;;-1:-1:-1;;;79153:18:0;;;;;;;;;;;79125:46;79199:23;79208:1;79211:10;79199:8;:23::i;:::-;79186:9;:36;79182:65;;79231:16;;-1:-1:-1;;;79231:16:0;;;;;;;;;;;79182:65;79263:22;79274:10;79263;:22::i;:::-;79258:60;;79294:24;;-1:-1:-1;;;79294:24:0;;;;;;;;;;;79258:60;79460:14;;79440:16;:14;:16::i;:::-;:34;79436:270;;79518:14;;79495:16;:14;:16::i;:::-;:20;;79514:1;79495:20;:::i;:::-;:37;79491:63;;;79541:13;;-1:-1:-1;;;79541:13:0;;;;;;;;;;;79491:63;79574:21;79588:3;79593:1;79574:13;:21::i;:::-;79569:56;;79604:21;;-1:-1:-1;;;79604:21:0;;;;;;;;;;;79569:56;79640:33;79650:3;79655:10;79667:5;79640:9;:33::i;:::-;78993:760;;:::o;79436:270::-;79716:29;79729:3;79734:10;79716:12;:29::i;40389:117::-;36106:18;:16;:18::i;:::-;40449:13:::1;:21:::0;;-1:-1:-1;;40481:17:0;40449:21:::1;40481:17;::::0;;40389:117::o;39259:186::-;36106:18;:16;:18::i;:::-;39365:10:::1;;39347:14;:28;39343:56;;;39384:15;;-1:-1:-1::0;;;39384:15:0::1;;;;;;;;;;;39343:56;39410:10;:27:::0;39259:186::o;40000:124::-;40072:13;;40048:4;;40072:13;;:21;;:13;:21;:44;;;;-1:-1:-1;;40097:10:0;;;;;;;:19;;40000:124::o;71084:125::-;36106:18;:16;:18::i;:::-;71166:23:::1;:35:::0;71084:125::o;69269:1357::-;69393:16;69401:7;69393;:16::i;:::-;69388:49;;69418:19;;-1:-1:-1;;;69418:19:0;;;;;;;;;;;69388:49;69452:23;69448:55;;69484:19;;-1:-1:-1;;;69484:19:0;;;;;;;;;;;69448:55;69769:27;24939:10;69769:13;:27::i;:::-;69764:233;;69818:30;69829:18;69818:10;:30::i;:::-;69813:67;;69857:23;;-1:-1:-1;;;69857:23:0;;;;;;;;;;;69813:67;69912:31;69921:1;69924:18;69912:8;:31::i;:::-;69899:9;:44;69895:90;;69969:16;;-1:-1:-1;;;69969:16:0;;;;;;;;;;;69895:90;70009:20;70084:25;;;:11;:25;;;;;;;;70050:59;;;;;;;;;-1:-1:-1;;;;;70050:59:0;;;;-1:-1:-1;;;70050:59:0;;-1:-1:-1;;;;;70050:59:0;;;;;;;;;;;;;;;;;70084:25;;70354:15;70326:43;;;;;70398:83;;70466:15;70438:9;:25;;;:43;;;;:::i;:::-;70398:83;;;70421:1;70398:83;70380:101;;70492:17;70512:30;70523:18;70512:10;:30::i;:::-;70492:50;-1:-1:-1;70598:19:0;70492:50;70598:7;:19;:::i;:::-;70553:25;;;;:11;:25;;;;;;:41;;:65;;;;-1:-1:-1;;;;;;69269:1357:0:o;44772:228::-;44875:7;44916:13;:11;:13::i;:::-;44908:5;:21;44900:69;;;;-1:-1:-1;;;44900:69:0;;13715:2:1;44900:69:0;;;13697:21:1;13754:2;13734:18;;;13727:30;13793:34;13773:18;;;13766:62;-1:-1:-1;;;13844:18:1;;;13837:33;13887:19;;44900:69:0;13513:399:1;44900:69:0;-1:-1:-1;44987:5:0;44772:228::o;82131:168::-;36106:18;:16;:18::i;:::-;82210:16;82206:48:::1;;82235:19;;-1:-1:-1::0;;;82235:19:0::1;;;;;;;;;;;82206:48;82265:12;:26:::0;82131:168::o;82719:112::-;36106:18;:16;:18::i;:::-;82800:23:::1;:13;82816:7:::0;;82800:23:::1;:::i;47239:292::-:0;47290:7;47325:15;47355:24;47393:27;:25;:27::i;:::-;47310:110;;;;47435:19;47431:39;;;-1:-1:-1;47463:7:0;47239:292;-1:-1:-1;47239:292:0:o;47431:39::-;47481:42;;-1:-1:-1;;;47481:42:0;;14119:2:1;47481:42:0;;;14101:21:1;;;14138:18;;;14131:30;14197:34;14177:18;;;14170:62;14249:18;;47481:42:0;13917:356:1;72812:401:0;72912:7;72941:9;72937:40;;72959:18;;-1:-1:-1;;;72959:18:0;;;;;;;;;;;72937:40;72992:15;72988:47;;73016:19;;-1:-1:-1;;;73016:19:0;;;;;;;;;;;72988:47;73046:18;73067:17;:15;:17::i;:::-;:88;;73139:16;;73067:88;;;73100:23;;73067:88;73046:109;-1:-1:-1;73201:4:0;73174:23;73187:10;73046:109;73174:23;:::i;:::-;73173:32;;;;:::i;:::-;73166:39;72812:401;-1:-1:-1;;;;72812:401:0:o;52449:158::-;52513:7;52540:18;52550:7;52540:9;:18::i;:::-;:59;;52574:20;52586:7;52574:11;:20::i;:::-;:25;52540:59;;;52569:1;52533:66;52449:158;-1:-1:-1;;52449:158:0:o;40514:113::-;36106:18;:16;:18::i;:::-;40569:13:::1;:21:::0;;-1:-1:-1;;40601:18:0;;;40514:113::o;71799:168::-;71857:4;71878:12;71874:44;;71899:19;;-1:-1:-1;;;71899:19:0;;;;;;;;;;;71874:44;-1:-1:-1;71947:12:0;;-1:-1:-1;71936:23:0;;71799:168::o;48483:180::-;48547:7;-1:-1:-1;;;;;48571:19:0;;48567:53;;48599:21;;-1:-1:-1;;;48599:21:0;;;;;;;;;;;48567:53;48638:17;48649:5;48638:10;:17::i;26877:103::-;26496:12;:10;:12::i;:::-;26942:30:::1;26969:1;26942:18;:30::i;:::-;26877:103::o:0;54616:188::-;36106:18;:16;:18::i;:::-;-1:-1:-1;;;;;54743:37:0;;;::::1;;::::0;;;:27:::1;:37;::::0;;;;:53;;-1:-1:-1;;54743:53:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54616:188::o;74483:169::-;36106:18;:16;:18::i;:::-;74544:21:::1;74540:58;;74579:19;;-1:-1:-1::0;;;74579:19:0::1;;;;;;;;;;;74540:58;74609:35;74622:21;74609:12;:35::i;72195:184::-:0;36106:18;:16;:18::i;:::-;72282:20;72278:52:::1;;72311:19;;-1:-1:-1::0;;;72311:19:0::1;;;;;;;;;;;72278:52;72341:12;:30:::0;72195:184::o;40132:121::-;40201:13;;40177:4;;40201:13;;:22;;;:44;;-1:-1:-1;;40227:10:0;;;;;;;;;:18;;;;40132:121::o;74248:33::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;74248:33:0;;-1:-1:-1;74248:33:0;:::o;81731:178::-;36106:18;:16;:18::i;:::-;81814;81810:50:::1;;81841:19;;-1:-1:-1::0;;;81841:19:0::1;;;;;;;;;;;81810:50;81871:14;:30:::0;81731:178::o;83001:167::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;83140:20:0;83152:7;83140:11;:20::i;52843:104::-;52899:13;52932:7;52925:14;;;;;:::i;47756:169::-;47805:4;47825:24;47853:27;:25;:27::i;:::-;47822:58;47756:169;-1:-1:-1;;;47756:169:0:o;35511:175::-;35566:4;-1:-1:-1;;;;;35587:22:0;;35583:55;;35618:20;;-1:-1:-1;;;35618:20:0;;;;;;;;;;;35583:55;-1:-1:-1;;;;;;35656:14:0;;;;;:4;:14;;;;;;;;;;;:22;;;;35511:175::o;75394:473::-;36106:18;:16;:18::i;:::-;75529:22;75525:54:::1;;75560:19;;-1:-1:-1::0;;;75560:19:0::1;;;;;;;;;;;75525:54;75650:38;::::0;-1:-1:-1;;;75650:38:0;;75682:4:::1;75650:38;::::0;::::1;2225:51:1::0;75620:14:0;;75691:17;;-1:-1:-1;;;;;75650:23:0;::::1;::::0;::::1;::::0;2198:18:1;;75650:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;75646:110;;;75730:26;;-1:-1:-1::0;;;75730:26:0::1;;;;;;;;;;;75646:110;75790:12;::::0;75767:55:::1;::::0;-1:-1:-1;;;75767:55:0;;-1:-1:-1;;;;;75790:12:0;;::::1;75767:55;::::0;::::1;14814:51:1::0;14881:18;;;14874:34;;;75767:22:0;;::::1;::::0;::::1;::::0;14787:18:1;;75767:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;55880:475::-:0;56011:8;32718:30;32739:8;32718:20;:30::i;:::-;-1:-1:-1;;;;;56045:24:0;::::1;24939:10:::0;56045:24:::1;;56037:63;;;::::0;-1:-1:-1;;;56037:63:0;;15371:2:1;56037:63:0::1;::::0;::::1;15353:21:1::0;15410:2;15390:18;;;15383:30;15449:28;15429:18;;;15422:56;15495:18;;56037:63:0::1;15169:350:1::0;56037:63:0::1;-1:-1:-1::0;;;;;56115:37:0;::::1;;::::0;;;:27:::1;:37;::::0;;;;;::::1;;56111:106;;;56174:43;;-1:-1:-1::0;;;56174:43:0::1;;;;;;;;;;;56111:106;24939:10:::0;56230:32:::1;::::0;;;:18:::1;:32;::::0;;;;;;;-1:-1:-1;;;;;56230:42:0;::::1;::::0;;;;;;;;;;:53;;-1:-1:-1;;56230:53:0::1;::::0;::::1;;::::0;;::::1;::::0;;;56299:48;;722:41:1;;;56230:42:0;;24939:10;56299:48:::1;::::0;695:18:1;56299:48:0::1;;;;;;;55880:475:::0;;;:::o;76040:300::-;36106:18;:16;:18::i;:::-;-1:-1:-1;;;;;76159:30:0;::::1;76155:64;;76198:21;;-1:-1:-1::0;;;76198:21:0::1;;;;;;;;;;;76155:64;76254:12;::::0;-1:-1:-1;;;;;76234:32:0;;::::1;76254:12:::0;::::1;76234:32;76230:60;;;76275:15;;-1:-1:-1::0;;;76275:15:0::1;;;;;;;;;;;76230:60;76301:12;:31:::0;;-1:-1:-1;;;;;;76301:31:0::1;-1:-1:-1::0;;;;;76301:31:0;;;::::1;::::0;;;::::1;::::0;;76040:300::o;57240:381::-;57408:4;30570:42;32205:43;:47;32201:416;;-1:-1:-1;;;;;32484:18:0;;32492:10;32484:18;32480:85;;;57425:28:::1;57435:4;57441:2;57445:7;57425:9;:28::i;:::-;57486:48;57509:4;57515:2;57519:7;57528:5;57486:22;:48::i;:::-;57464:149;;;;-1:-1:-1::0;;;57464:149:0::1;;;;;;;:::i;:::-;32543:7:::0;;32480:85;32579:26;32600:4;32579:20;:26::i;:::-;57425:28:::1;57435:4;57441:2;57445:7;57425:9;:28::i;:::-;57486:48;57509:4;57515:2;57519:7;57528:5;57486:22;:48::i;:::-;57464:149;;;;-1:-1:-1::0;;;57464:149:0::1;;;;;;;:::i;:::-;57240:381:::0;;;;;:::o;67870:193::-;67926:7;67951:16;67959:7;67951;:16::i;:::-;67946:49;;67976:19;;-1:-1:-1;;;67976:19:0;;;;;;;;;;;67946:49;68013:26;68031:7;68013:17;:26::i;:::-;:42;;;;67870:193;-1:-1:-1;;67870:193:0:o;53018:561::-;53136:13;53167:21;53191:10;:8;:10::i;:::-;53167:34;;53212:30;53245:19;:17;:19::i;:::-;53212:52;;53319:1;53301:7;53295:21;:25;:276;;;;;;;;;;;;;;;;;53412:7;53446:18;:7;:16;:18::i;:::-;53491:16;53369:161;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53275:296;53018:561;-1:-1:-1;;;;53018:561:0:o;80078:810::-;80226:15;80222:46;;80250:18;;-1:-1:-1;;;80250:18:0;;;;;;;;;;;80222:46;80284:17;:15;:17::i;:::-;80279:52;;80310:21;;-1:-1:-1;;;80310:21:0;;;;;;;;;;;80279:52;80347:32;80361:3;80366:12;;80347:13;:32::i;:::-;80342:69;;80388:23;;-1:-1:-1;;;80388:23:0;;;;;;;;;;;80342:69;80439:23;80448:1;80451:10;80439:8;:23::i;:::-;80426:9;:36;80422:65;;80471:16;;-1:-1:-1;;;80471:16:0;;;;;;;;;;;80422:65;80503:22;80514:10;80503;:22::i;:::-;80498:60;;80534:24;;-1:-1:-1;;;80534:24:0;;;;;;;;;;;80498:60;80595:14;;80575:16;:14;:16::i;:::-;:34;80571:270;;80653:14;;80630:16;:14;:16::i;:::-;:20;;80649:1;80630:20;:::i;:::-;:37;80626:63;;;80676:13;;-1:-1:-1;;;80676:13:0;;;;;;;;;;;80626:63;80709:21;80723:3;80728:1;80709:13;:21::i;:::-;80704:56;;80739:21;;-1:-1:-1;;;80739:21:0;;;;;;;;;;;80704:56;80775:33;80785:3;80790:10;80802:5;80775:9;:33::i;80571:270::-;80851:29;80864:3;80869:10;80851:12;:29::i;44354:100::-;44401:7;44428:14;44646:12;;-1:-1:-1;;44646:30:0;;44547:148;44428:14;:18;;44445:1;44428:18;:::i;78046:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;82612:99::-;82657:13;82690;82683:20;;;;;:::i;68290:209::-;68347:4;68369:16;68377:7;68369;:16::i;:::-;68364:49;;68394:19;;-1:-1:-1;;;68394:19:0;;;;;;;;;;;68364:49;68476:15;68431:26;68449:7;68431:17;:26::i;:::-;:42;;;:60;;68290:209;-1:-1:-1;;68290:209:0:o;70965:111::-;36106:18;:16;:18::i;:::-;71040:16:::1;:28:::0;70965:111::o;34919:229::-;26496:12;:10;:12::i;:::-;-1:-1:-1;;;;;34993:22:0;::::1;34989:55;;35024:20;;-1:-1:-1::0;;;35024:20:0::1;;;;;;;;;;;34989:55;35060:16;35067:8;35060:6;:16::i;:::-;35055:50;;35085:20;;-1:-1:-1::0;;;35085:20:0::1;;;;;;;;;;;35055:50;-1:-1:-1::0;;;;;35118:14:0::1;35135:5;35118:14:::0;;;:4:::1;:14;::::0;;;;:22;;-1:-1:-1;;35118:22:0::1;::::0;;34919:229::o;78403:331::-;36106:18;:16;:18::i;:::-;78513:14:::1;;78493:16;:14;:16::i;:::-;:34;78489:198;;78571:14;;78548:16;:14;:16::i;:::-;:20;::::0;78567:1:::1;78548:20;:::i;:::-;:37;78544:63;;;78594:13;;-1:-1:-1::0;;;78594:13:0::1;;;;;;;;;;;78544:63;78622:32;78632:3;78637:10;78649:4;78622:9;:32::i;78080:39::-:0;;;;;;;:::i;27133:238::-;26496:12;:10;:12::i;:::-;-1:-1:-1;;;;;27236:22:0;::::1;27214:110;;;::::0;-1:-1:-1;;;27214:110:0;;16815:2:1;27214:110:0::1;::::0;::::1;16797:21:1::0;16854:2;16834:18;;;16827:30;16893:34;16873:18;;;16866:62;-1:-1:-1;;;16944:18:1;;;16937:36;16990:19;;27214:110:0::1;16613:402:1::0;27214:110:0::1;27335:28;27354:8;27335:18;:28::i;:::-;27133:238:::0;:::o;40261:120::-;36106:18;:16;:18::i;:::-;40324:13:::1;:20:::0;;-1:-1:-1;;40355:18:0;40340:4:::1;40355:18:::0;;;40261:120::o;81284:251::-;81390:4;81416:12;81412:44;;81437:19;;-1:-1:-1;;;81437:19:0;;;;;;;;;;;81412:44;81513:14;;-1:-1:-1;;;;;81475:23:0;;;;;;:13;:23;;;;;;:33;;81501:7;;81475:33;:::i;:::-;81474:53;;;81284:251;-1:-1:-1;;;81284:251:0:o;57872:141::-;57929:4;57972:7;44055:1;57953:26;;:52;;;;-1:-1:-1;;57993:12:0;;-1:-1:-1;57983:22:0;57872:141::o;35794:266::-;35846:13;26227:6;;-1:-1:-1;;;;;26227:6:0;24939:10;35862:23;;;;35846:13;35911:20;;35511:175;:::i;35911:20::-;35896:35;;35964:8;:19;;;;35976:7;35964:19;35942:110;;;;-1:-1:-1;;;35942:110:0;;17222:2:1;35942:110:0;;;17204:21:1;17261:2;17241:18;;;17234:30;17300:34;17280:18;;;17273:62;-1:-1:-1;;;17351:18:1;;;17344:39;17400:19;;35942:110:0;17020:405:1;32776:508:0;30570:42;32967:43;:47;32963:314;;33054:126;;-1:-1:-1;;;33054:126:0;;33125:4;33054:126;;;17642:34:1;-1:-1:-1;;;;;17712:15:1;;17692:18;;;17685:43;30570:42:0;;33054:40;;17577:18:1;;33054:126:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33031:235;;33222:28;;-1:-1:-1;;;33222:28:0;;-1:-1:-1;;;;;2243:32:1;;33222:28:0;;;2225:51:1;2198:18;;33222:28:0;2079:203:1;63398:196:0;63513:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;63513:29:0;-1:-1:-1;;;;;63513:29:0;;;;;;;;;63558:28;;63513:24;;63558:28;;;;;;;63398:196;;;:::o;61544:1740::-;61659:35;61697:20;61709:7;61697:11;:20::i;:::-;61772:18;;61659:58;;-1:-1:-1;61730:22:0;;-1:-1:-1;;;;;61756:34:0;24939:10;-1:-1:-1;;;;;61756:34:0;;:87;;;-1:-1:-1;24939:10:0;61807:20;61819:7;61807:11;:20::i;:::-;-1:-1:-1;;;;;61807:36:0;;61756:87;:154;;;-1:-1:-1;61877:18:0;;61860:50;;24939:10;56426:214;:::i;61860:50::-;61730:181;;61946:17;61924:117;;;;-1:-1:-1;;;61924:117:0;;17941:2:1;61924:117:0;;;17923:21:1;17980:2;17960:18;;;17953:30;18019:34;17999:18;;;17992:62;-1:-1:-1;;;18070:18:1;;;18063:48;18128:19;;61924:117:0;17739:414:1;61924:117:0;62096:4;-1:-1:-1;;;;;62074:26:0;:13;:18;;;-1:-1:-1;;;;;62074:26:0;;62052:114;;;;-1:-1:-1;;;62052:114:0;;18360:2:1;62052:114:0;;;18342:21:1;18399:2;18379:18;;;18372:30;18438:34;18418:18;;;18411:62;-1:-1:-1;;;18489:18:1;;;18482:36;18535:19;;62052:114:0;18158:402:1;62052:114:0;-1:-1:-1;;;;;62181:16:0;;62177:50;;62206:21;;-1:-1:-1;;;62206:21:0;;;;;;;;;;;62177:50;62348:49;62365:1;62369:7;62378:13;:18;;;62348:8;:49::i;:::-;62431:124;;;;;;;;-1:-1:-1;;;;;62431:124:0;;;;;-1:-1:-1;;;;;62484:15:0;62431:124;;;;;;;;;62515:29;;;;62431:124;;;;;;-1:-1:-1;62408:20:0;;;:11;:20;;;;;;:147;;;;;;;;;-1:-1:-1;;;62408:147:0;-1:-1:-1;;;;;;62408:147:0;;;;;;;;;;;;;;;;;;;;;62817:11;;62420:7;;62817:11;:::i;:::-;62884:1;62843:24;;;:11;:24;;;;;:29;62795:33;;-1:-1:-1;;;;;;62843:29:0;62839:340;;62907:20;62915:11;62907:7;:20::i;:::-;62903:265;;;62975:177;;;;;;;;63012:18;;-1:-1:-1;;;;;62975:177:0;;;;;;63053:28;;;;-1:-1:-1;;;;;62975:177:0;;;;;;;;;63104:29;;;;62975:177;;;;;;-1:-1:-1;62948:24:0;;;:11;:24;;;;;;;:204;;;;;;;;;-1:-1:-1;;;62948:204:0;-1:-1:-1;;;;;;62948:204:0;;;;;;;;;;;;;;;;;;;62903:265;63215:7;63211:2;-1:-1:-1;;;;;63196:27:0;63205:4;-1:-1:-1;;;;;63196:27:0;;;;;;;;;;;63234:42;61648:1636;;;61544:1740;;;:::o;31672:353::-;31760:116;;-1:-1:-1;;;31760:116:0;;31827:4;31760:116;;;17642:34:1;31851:10:0;17692:18:1;;;17685:43;30570:42:0;;31760:40;;17577:18:1;;31760:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:181;;;;-1:-1:-1;31880:61:0;;-1:-1:-1;;;31880:61:0;;31929:4;31880:61;;;17642:34:1;-1:-1:-1;;;;;17712:15:1;;17692:18;;;17685:43;30570:42:0;;31880:40;;17577:18:1;;31880:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31740:278;;31976:30;;-1:-1:-1;;;31976:30:0;;31995:10;31976:30;;;2225:51:1;2198:18;;31976:30:0;2079:203:1;37137:190:0;37262:4;37315;37286:25;37299:5;37306:4;37286:12;:25::i;:::-;:33;;37137:190;-1:-1:-1;;;;37137:190:0:o;26334:122::-;26200:7;26227:6;-1:-1:-1;;;;;26227:6:0;24939:10;26388:23;26380:68;;;;-1:-1:-1;;;26380:68:0;;18767:2:1;26380:68:0;;;18749:21:1;;;18786:18;;;18779:30;18845:34;18825:18;;;18818:62;18897:18;;26380:68:0;18565:356:1;58021:167:0;58141:39;58151:2;58155:9;58166;58141:39;;;;;;;;;;;;:9;:39::i;60482:820::-;60555:15;60573:20;:18;:20::i;:::-;60555:38;;60604:35;60642:26;60660:7;60642:17;:26::i;:::-;60604:64;-1:-1:-1;;;;;;60685:16:0;;60681:50;;60710:21;;-1:-1:-1;;;60710:21:0;;;;;;;;;;;60681:50;68734:25;;;;68762:15;-1:-1:-1;60742:87:0;;60799:30;;-1:-1:-1;;;60799:30:0;;;;;;;;;;;60742:87;60964:49;60981:1;60985:7;60994:13;:18;;;60964:8;:49::i;:::-;61047:116;;;;;;;;61076:2;-1:-1:-1;;;;;61047:116:0;;;;;61100:15;-1:-1:-1;;;;;61047:116:0;;;;;61131:21;61142:9;61131:10;:21::i;:::-;61047:116;;61024:20;;;;:11;:20;;;;;;;;:139;;;;;;;;-1:-1:-1;;;;;61024:139:0;-1:-1:-1;;;61024:139:0;-1:-1:-1;;;;;;61024:139:0;;;-1:-1:-1;;;;;61024:139:0;;;;;;;;;;;;;;;;;;;;;;61195:18;;61181:46;;61036:7;;61181:46;;;;;;;;;;61259:18;;61238:56;;61279:2;61283:7;61292:1;61238:56;:::i;35156:203::-;35220:4;35237:13;35264:8;-1:-1:-1;;;;;35253:19:0;:7;26200;26227:6;-1:-1:-1;;;;;26227:6:0;;26154:87;35253:7;-1:-1:-1;;;;;35253:19:0;;35237:35;;35283:12;35298:16;35305:8;35298:6;:16::i;:::-;35283:31;;35332:8;:19;;;-1:-1:-1;35344:7:0;35325:26;-1:-1:-1;;;35156:203:0:o;73531:209::-;73594:7;73618:15;73614:47;;73642:19;;-1:-1:-1;;;73642:19:0;;;;;;;;;;;73614:47;73721:10;73698:20;;:33;;;;:::i;:::-;73679:53;;:15;:53;:::i;46175:605::-;46235:7;;46278:1;46261:484;46286:13;:11;:13::i;:::-;46281:1;:18;46261:484;;46321:31;46355:14;;;:11;:14;;;;;;;;;46321:48;;;;;;;;;-1:-1:-1;;;;;46321:48:0;;;;;-1:-1:-1;;;46321:48:0;;;-1:-1:-1;;;;;46321:48:0;;;;;;;;;;;;;;;;;;;;46388:28;46384:350;;68734:25;;;;68762:15;-1:-1:-1;46534:185:0;;;-1:-1:-1;46691:1:0;46694:4;;-1:-1:-1;46175:605:0;-1:-1:-1;46175:605:0:o;46534:185::-;-1:-1:-1;46301:3:0;;;;:::i;:::-;;;;46261:484;;;-1:-1:-1;46763:1:0;;;;-1:-1:-1;46175:605:0;-1:-1:-1;46175:605:0:o;49662:1367::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;49804:7:0;;44055:1;49853:23;;:46;;;;;49887:12;;49880:4;:19;49853:46;49849:1092;;;49920:31;49954:17;;;:11;:17;;;;;;;;;49920:51;;;;;;;;;-1:-1:-1;;;;;49920:51:0;;;;;-1:-1:-1;;;49920:51:0;;;-1:-1:-1;;;;;49920:51:0;;;;;;;;;;;;;;;;;;;;49994:28;49990:248;;68734:25;;;;68762:15;-1:-1:-1;50051:26:0;50047:133;;;50106:50;;-1:-1:-1;;;50106:50:0;;19128:2:1;50106:50:0;;;19110:21:1;19167:2;19147:18;;;19140:30;19206:34;19186:18;;;19179:62;-1:-1:-1;;;19257:18:1;;;19250:38;19305:19;;50106:50:0;18926:404:1;49990:248:0;-1:-1:-1;;;50558:6:0;50599:17;;;;:11;:17;;;;;;;;;50587:29;;;;;;;;;-1:-1:-1;;;;;50587:29:0;;;;;-1:-1:-1;;;50587:29:0;;;-1:-1:-1;;;;;50587:29:0;;;;;;;;50558:6;50587:29;;;;;;;;;;;50643:28;50639:268;;68734:25;;;;68762:15;-1:-1:-1;50704:26:0;68597:188;50639:268;50522:404;;49849:1092;50964:57;;-1:-1:-1;;;50964:57:0;;19537:2:1;50964:57:0;;;19519:21:1;19576:2;19556:18;;;19549:30;19615:34;19595:18;;;19588:62;-1:-1:-1;;;19666:18:1;;;19659:45;19721:19;;50964:57:0;19335:411:1;49054:495:0;49176:12;;-1:-1:-1;;;;;;;;49113:7:0;-1:-1:-1;;;;;;;;;;;;;;;49113:7:0;;;;49224:31;49277:9;;49270:236;;-1:-1:-1;49319:17:0;;;;:11;:17;;;;;;;;;49307:29;;;;;;;;;-1:-1:-1;;;;;49307:29:0;;;;;;-1:-1:-1;;;49307:29:0;;;-1:-1:-1;;;;;49307:29:0;;;;;;;;;;;;;;;;;;;;49359:24;;;;:55;;;;-1:-1:-1;68734:25:0;;;;68762:15;-1:-1:-1;49387:27:0;49359:55;49355:111;;;49439:7;;;;;49355:111;-1:-1:-1;;49484:6:0;;;;49270:236;;;-1:-1:-1;49536:5:0;;49054:495;-1:-1:-1;;;49054:495:0:o;27529:191::-;27603:16;27622:6;;-1:-1:-1;;;;;27639:17:0;;;-1:-1:-1;;;;;;27639:17:0;;;;;;27672:40;;27622:6;;;;;;;27672:40;;27603:16;27672:40;27592:128;27529:191;:::o;74660:207::-;74723:9;74718:142;74742:19;;74738:1;:23;74718:142;;;74783:65;74794:16;74811:1;74794:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;74794:19:0;74844:3;74826:11;74838:1;74826:14;;;;;;;;:::i;:::-;;;;;;;;;74816:7;:24;;;;:::i;:::-;74815:32;;;;:::i;:::-;74783:10;:65::i;:::-;74763:3;;;;:::i;:::-;;;;74718:142;;65399:985;65554:4;-1:-1:-1;;;;;65575:13:0;;1970:19;:23;65571:806;;65628:175;;-1:-1:-1;;;65628:175:0;;-1:-1:-1;;;;;65628:36:0;;;;;:175;;24939:10;;65722:4;;65749:7;;65779:5;;65628:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65628:175:0;;;;;;;;-1:-1:-1;;65628:175:0;;;;;;;;;;;;:::i;:::-;;;65607:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65990:13:0;;65986:321;;66033:109;;-1:-1:-1;;;66033:109:0;;;;;;;:::i;65986:321::-;66257:6;66251:13;66242:6;66238:2;66234:15;66227:38;65607:715;-1:-1:-1;;;;;;65867:55:0;-1:-1:-1;;;65867:55:0;;-1:-1:-1;65860:62:0;;65571:806;-1:-1:-1;66361:4:0;65399:985;;;;;;:::o;51336:1051::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;51484:7:0;;44055:1;51533:23;;:46;;;;;51567:12;;51560:4;:19;51533:46;51529:770;;;51600:31;51634:17;;;:11;:17;;;;;;;;;51600:51;;;;;;;;;-1:-1:-1;;;;;51600:51:0;;;;;-1:-1:-1;;;51600:51:0;;;-1:-1:-1;;;;;51600:51:0;;;;;;;;;;;;;;;;;;;;51674:28;51670:93;;51734:9;51336:1051;-1:-1:-1;;;51336:1051:0:o;51670:93::-;-1:-1:-1;;;52083:6:0;52124:17;;;;:11;:17;;;;;;;;;52112:29;;;;;;;;;-1:-1:-1;;;;;52112:29:0;;;;;-1:-1:-1;;;52112:29:0;;;-1:-1:-1;;;;;52112:29:0;;;;;;;;52083:6;52112:29;;;;;;;;;;;52168:28;52164:101;;52232:9;51336:1051;-1:-1:-1;;;51336:1051:0:o;52164:101::-;52047:237;;82429:175;82543:13;82581:15;82574:22;;;;;:::i;19662:723::-;19718:13;19939:10;19935:53;;-1:-1:-1;;19966:10:0;;;;;;;;;;;;-1:-1:-1;;;19966:10:0;;;;;19662:723::o;19935:53::-;20013:5;19998:12;20054:78;20061:9;;20054:78;;20087:8;;;;:::i;:::-;;-1:-1:-1;20110:10:0;;-1:-1:-1;20118:2:0;20110:10;;:::i;:::-;;;20054:78;;;20142:19;20174:6;-1:-1:-1;;;;;20164:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20164:17:0;;20142:39;;20192:154;20199:10;;20192:154;;20226:11;20236:1;20226:11;;:::i;:::-;;-1:-1:-1;20295:10:0;20303:2;20295:5;:10;:::i;:::-;20282:24;;:2;:24;:::i;:::-;20269:39;;20252:6;20259;20252:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;20252:56:0;;;;;;;;-1:-1:-1;20323:11:0;20332:2;20323:11;;:::i;:::-;;;20192:154;;37688:707;37798:7;37846:4;37798:7;37861:497;37885:5;:12;37881:1;:16;37861:497;;;37919:20;37942:5;37948:1;37942:8;;;;;;;;:::i;:::-;;;;;;;37919:31;;37985:12;37969;:28;37965:382;;38498:13;38553:15;;;38589:4;38582:15;;;38636:4;38620:21;;38097:57;;37965:382;;;38498:13;38553:15;;;38589:4;38582:15;;;38636:4;38620:21;;38274:57;;37965:382;-1:-1:-1;37899:3:0;;;;:::i;:::-;;;;37861:497;;;-1:-1:-1;38375:12:0;37688:707;-1:-1:-1;;;37688:707:0:o;58520:1205::-;58723:12;;58688:1;;-1:-1:-1;;;;;58750:16:0;;58746:50;;58775:21;;-1:-1:-1;;;58775:21:0;;;;;;;;;;;58746:50;58941:21;58949:12;58941:7;:21::i;:::-;58940:22;58932:64;;;;-1:-1:-1;;;58932:64:0;;21207:2:1;58932:64:0;;;21189:21:1;21246:2;21226:18;;;21219:30;21285:31;21265:18;;;21258:59;21334:18;;58932:64:0;21005:353:1;58932:64:0;59140:9;59136:83;;;-1:-1:-1;;;;;59186:17:0;;;;;;:13;:17;;;;;;:21;;59206:1;59186:21;:::i;:::-;-1:-1:-1;;;;;59166:17:0;;;;;;:13;:17;;;;;:41;59136:83;59259:116;;;;;;;;59288:2;-1:-1:-1;;;;;59259:116:0;;;;;59312:15;-1:-1:-1;;;;;59259:116:0;;;;;59343:21;59354:9;59343:10;:21::i;:::-;59259:116;;59231:25;;;;:11;:25;;;;;;;;:144;;;;;;;;-1:-1:-1;;;;;59231:144:0;-1:-1:-1;;;59231:144:0;-1:-1:-1;;;;;;59231:144:0;;;-1:-1:-1;;;;;59231:144:0;;;;;;;;;;;;;;;;;;;;;;59393:38;;59243:12;;59393:38;;;59231:25;59393:38;;59231:25;;59393:38;59464:59;59495:1;59499:2;59503:12;59517:5;59464:22;:59::i;:::-;59442:160;;;;-1:-1:-1;;;59442:160:0;;;;;;;:::i;:::-;59630:16;:12;59645:1;59630:16;:::i;:::-;59615:12;:31;59657:60;54866:586;74875:181;74950:12;74968:8;-1:-1:-1;;;;;74968:13:0;74989:7;74968:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74949:52;;;75020:7;75012:36;;;;-1:-1:-1;;;75012:36:0;;21775:2:1;75012:36:0;;;21757:21:1;21814:2;21794:18;;;21787:30;-1:-1:-1;;;21833:18:1;;;21826:46;21889:18;;75012:36:0;21573:340:1;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;196:131:1;-1:-1:-1;;;;;;270:32:1;;260:43;;250:71;;317:1;314;307:12;332:245;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;774:173::-;842:20;;-1:-1:-1;;;;;891:31:1;;881:42;;871:70;;937:1;934;927:12;871:70;774:173;;;:::o;952:186::-;1011:6;1064:2;1052:9;1043:7;1039:23;1035:32;1032:52;;;1080:1;1077;1070:12;1032:52;1103:29;1122:9;1103:29;:::i;1143:258::-;1215:1;1225:113;1239:6;1236:1;1233:13;1225:113;;;1315:11;;;1309:18;1296:11;;;1289:39;1261:2;1254:10;1225:113;;;1356:6;1353:1;1350:13;1347:48;;;-1:-1:-1;;1391:1:1;1373:16;;1366:27;1143:258::o;1406:::-;1448:3;1486:5;1480:12;1513:6;1508:3;1501:19;1529:63;1585:6;1578:4;1573:3;1569:14;1562:4;1555:5;1551:16;1529:63;:::i;:::-;1646:2;1625:15;-1:-1:-1;;1621:29:1;1612:39;;;;1653:4;1608:50;;1406:258;-1:-1:-1;;1406:258:1:o;1669:220::-;1818:2;1807:9;1800:21;1781:4;1838:45;1879:2;1868:9;1864:18;1856:6;1838:45;:::i;1894:180::-;1953:6;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;-1:-1:-1;2045:23:1;;1894:180;-1:-1:-1;1894:180:1:o;2287:254::-;2355:6;2363;2416:2;2404:9;2395:7;2391:23;2387:32;2384:52;;;2432:1;2429;2422:12;2384:52;2455:29;2474:9;2455:29;:::i;:::-;2445:39;2531:2;2516:18;;;;2503:32;;-1:-1:-1;;;2287:254:1:o;2546:592::-;2617:6;2625;2678:2;2666:9;2657:7;2653:23;2649:32;2646:52;;;2694:1;2691;2684:12;2646:52;2734:9;2721:23;-1:-1:-1;;;;;2804:2:1;2796:6;2793:14;2790:34;;;2820:1;2817;2810:12;2790:34;2858:6;2847:9;2843:22;2833:32;;2903:7;2896:4;2892:2;2888:13;2884:27;2874:55;;2925:1;2922;2915:12;2874:55;2965:2;2952:16;2991:2;2983:6;2980:14;2977:34;;;3007:1;3004;2997:12;2977:34;3052:7;3047:2;3038:6;3034:2;3030:15;3026:24;3023:37;3020:57;;;3073:1;3070;3063:12;3020:57;3104:2;3096:11;;;;;3126:6;;-1:-1:-1;2546:592:1;;-1:-1:-1;;;;2546:592:1:o;3143:328::-;3220:6;3228;3236;3289:2;3277:9;3268:7;3264:23;3260:32;3257:52;;;3305:1;3302;3295:12;3257:52;3328:29;3347:9;3328:29;:::i;:::-;3318:39;;3376:38;3410:2;3399:9;3395:18;3376:38;:::i;:::-;3366:48;;3461:2;3450:9;3446:18;3433:32;3423:42;;3143:328;;;;;:::o;3476:127::-;3537:10;3532:3;3528:20;3525:1;3518:31;3568:4;3565:1;3558:15;3592:4;3589:1;3582:15;3608:275;3679:2;3673:9;3744:2;3725:13;;-1:-1:-1;;3721:27:1;3709:40;;-1:-1:-1;;;;;3764:34:1;;3800:22;;;3761:62;3758:88;;;3826:18;;:::i;:::-;3862:2;3855:22;3608:275;;-1:-1:-1;3608:275:1:o;3888:183::-;3948:4;-1:-1:-1;;;;;3973:6:1;3970:30;3967:56;;;4003:18;;:::i;:::-;-1:-1:-1;4048:1:1;4044:14;4060:4;4040:25;;3888:183::o;4076:662::-;4130:5;4183:3;4176:4;4168:6;4164:17;4160:27;4150:55;;4201:1;4198;4191:12;4150:55;4237:6;4224:20;4263:4;4287:60;4303:43;4343:2;4303:43;:::i;:::-;4287:60;:::i;:::-;4381:15;;;4467:1;4463:10;;;;4451:23;;4447:32;;;4412:12;;;;4491:15;;;4488:35;;;4519:1;4516;4509:12;4488:35;4555:2;4547:6;4543:15;4567:142;4583:6;4578:3;4575:15;4567:142;;;4649:17;;4637:30;;4687:12;;;;4600;;4567:142;;;-1:-1:-1;4727:5:1;4076:662;-1:-1:-1;;;;;;4076:662:1:o;4743:1146::-;4861:6;4869;4922:2;4910:9;4901:7;4897:23;4893:32;4890:52;;;4938:1;4935;4928:12;4890:52;4978:9;4965:23;-1:-1:-1;;;;;5048:2:1;5040:6;5037:14;5034:34;;;5064:1;5061;5054:12;5034:34;5102:6;5091:9;5087:22;5077:32;;5147:7;5140:4;5136:2;5132:13;5128:27;5118:55;;5169:1;5166;5159:12;5118:55;5205:2;5192:16;5227:4;5251:60;5267:43;5307:2;5267:43;:::i;5251:60::-;5345:15;;;5427:1;5423:10;;;;5415:19;;5411:28;;;5376:12;;;;5451:19;;;5448:39;;;5483:1;5480;5473:12;5448:39;5507:11;;;;5527:148;5543:6;5538:3;5535:15;5527:148;;;5609:23;5628:3;5609:23;:::i;:::-;5597:36;;5560:12;;;;5653;;;;5527:148;;;5694:5;-1:-1:-1;;5737:18:1;;5724:32;;-1:-1:-1;;5768:16:1;;;5765:36;;;5797:1;5794;5787:12;5765:36;;5820:63;5875:7;5864:8;5853:9;5849:24;5820:63;:::i;:::-;5810:73;;;4743:1146;;;;;:::o;6076:367::-;6139:8;6149:6;6203:3;6196:4;6188:6;6184:17;6180:27;6170:55;;6221:1;6218;6211:12;6170:55;-1:-1:-1;6244:20:1;;-1:-1:-1;;;;;6276:30:1;;6273:50;;;6319:1;6316;6309:12;6273:50;6356:4;6348:6;6344:17;6332:29;;6416:3;6409:4;6399:6;6396:1;6392:14;6384:6;6380:27;6376:38;6373:47;6370:67;;;6433:1;6430;6423:12;6370:67;6076:367;;;;;:::o;6448:511::-;6543:6;6551;6559;6612:2;6600:9;6591:7;6587:23;6583:32;6580:52;;;6628:1;6625;6618:12;6580:52;6651:29;6670:9;6651:29;:::i;:::-;6641:39;;6731:2;6720:9;6716:18;6703:32;-1:-1:-1;;;;;6750:6:1;6747:30;6744:50;;;6790:1;6787;6780:12;6744:50;6829:70;6891:7;6882:6;6871:9;6867:22;6829:70;:::i;:::-;6448:511;;6918:8;;-1:-1:-1;6803:96:1;;-1:-1:-1;;;;6448:511:1:o;7338:248::-;7406:6;7414;7467:2;7455:9;7446:7;7442:23;7438:32;7435:52;;;7483:1;7480;7473:12;7435:52;-1:-1:-1;;7506:23:1;;;7576:2;7561:18;;;7548:32;;-1:-1:-1;7338:248:1:o;7591:118::-;7677:5;7670:13;7663:21;7656:5;7653:32;7643:60;;7699:1;7696;7689:12;7714:315;7779:6;7787;7840:2;7828:9;7819:7;7815:23;7811:32;7808:52;;;7856:1;7853;7846:12;7808:52;7879:29;7898:9;7879:29;:::i;:::-;7869:39;;7958:2;7947:9;7943:18;7930:32;7971:28;7993:5;7971:28;:::i;:::-;8018:5;8008:15;;;7714:315;;;;;:::o;8464:980::-;8559:6;8567;8575;8583;8636:3;8624:9;8615:7;8611:23;8607:33;8604:53;;;8653:1;8650;8643:12;8604:53;8676:29;8695:9;8676:29;:::i;:::-;8666:39;;8724:2;8745:38;8779:2;8768:9;8764:18;8745:38;:::i;:::-;8735:48;;8830:2;8819:9;8815:18;8802:32;8792:42;;8885:2;8874:9;8870:18;8857:32;-1:-1:-1;;;;;8949:2:1;8941:6;8938:14;8935:34;;;8965:1;8962;8955:12;8935:34;9003:6;8992:9;8988:22;8978:32;;9048:7;9041:4;9037:2;9033:13;9029:27;9019:55;;9070:1;9067;9060:12;9019:55;9106:2;9093:16;9128:2;9124;9121:10;9118:36;;;9134:18;;:::i;:::-;9176:53;9219:2;9200:13;;-1:-1:-1;;9196:27:1;9192:36;;9176:53;:::i;:::-;9163:66;;9252:2;9245:5;9238:17;9292:7;9287:2;9282;9278;9274:11;9270:20;9267:33;9264:53;;;9313:1;9310;9303:12;9264:53;9368:2;9363;9359;9355:11;9350:2;9343:5;9339:14;9326:45;9412:1;9407:2;9402;9395:5;9391:14;9387:23;9380:34;;9433:5;9423:15;;;;;8464:980;;;;;;;:::o;9449:579::-;9553:6;9561;9569;9577;9630:2;9618:9;9609:7;9605:23;9601:32;9598:52;;;9646:1;9643;9636:12;9598:52;9669:29;9688:9;9669:29;:::i;:::-;9659:39;;9745:2;9734:9;9730:18;9717:32;9707:42;;9800:2;9789:9;9785:18;9772:32;-1:-1:-1;;;;;9819:6:1;9816:30;9813:50;;;9859:1;9856;9849:12;9813:50;9898:70;9960:7;9951:6;9940:9;9936:22;9898:70;:::i;:::-;9449:579;;;;-1:-1:-1;9987:8:1;-1:-1:-1;;;;9449:579:1:o;10033:260::-;10101:6;10109;10162:2;10150:9;10141:7;10137:23;10133:32;10130:52;;;10178:1;10175;10168:12;10130:52;10201:29;10220:9;10201:29;:::i;:::-;10191:39;;10249:38;10283:2;10272:9;10268:18;10249:38;:::i;:::-;10239:48;;10033:260;;;;;:::o;10298:380::-;10377:1;10373:12;;;;10420;;;10441:61;;10495:4;10487:6;10483:17;10473:27;;10441:61;10548:2;10540:6;10537:14;10517:18;10514:38;10511:161;;;10594:10;10589:3;10585:20;10582:1;10575:31;10629:4;10626:1;10619:15;10657:4;10654:1;10647:15;10511:161;;10298:380;;;:::o;12329:127::-;12390:10;12385:3;12381:20;12378:1;12371:31;12421:4;12418:1;12411:15;12445:4;12442:1;12435:15;12461:135;12500:3;-1:-1:-1;;12521:17:1;;12518:43;;;12541:18;;:::i;:::-;-1:-1:-1;12588:1:1;12577:13;;12461:135::o;13250:128::-;13290:3;13321:1;13317:6;13314:1;13311:13;13308:39;;;13327:18;;:::i;:::-;-1:-1:-1;13363:9:1;;13250:128::o;13383:125::-;13423:4;13451:1;13448;13445:8;13442:34;;;13456:18;;:::i;:::-;-1:-1:-1;13493:9:1;;13383:125::o;14278:168::-;14318:7;14384:1;14380;14376:6;14372:14;14369:1;14366:21;14361:1;14354:9;14347:17;14343:45;14340:71;;;14391:18;;:::i;:::-;-1:-1:-1;14431:9:1;;14278:168::o;14451:184::-;14521:6;14574:2;14562:9;14553:7;14549:23;14545:32;14542:52;;;14590:1;14587;14580:12;14542:52;-1:-1:-1;14613:16:1;;14451:184;-1:-1:-1;14451:184:1:o;14919:245::-;14986:6;15039:2;15027:9;15018:7;15014:23;15010:32;15007:52;;;15055:1;15052;15045:12;15007:52;15087:9;15081:16;15106:28;15128:5;15106:28;:::i;15524:415::-;15726:2;15708:21;;;15765:2;15745:18;;;15738:30;15804:34;15799:2;15784:18;;15777:62;-1:-1:-1;;;15870:2:1;15855:18;;15848:49;15929:3;15914:19;;15524:415::o;15944:664::-;16171:3;16209:6;16203:13;16225:53;16271:6;16266:3;16259:4;16251:6;16247:17;16225:53;:::i;:::-;16341:13;;16300:16;;;;16363:57;16341:13;16300:16;16397:4;16385:17;;16363:57;:::i;:::-;16487:13;;16442:20;;;16509:57;16487:13;16442:20;16543:4;16531:17;;16509:57;:::i;:::-;16582:20;;15944:664;-1:-1:-1;;;;;15944:664:1:o;19751:127::-;19812:10;19807:3;19803:20;19800:1;19793:31;19843:4;19840:1;19833:15;19867:4;19864:1;19857:15;19883:127;19944:10;19939:3;19935:20;19932:1;19925:31;19975:4;19972:1;19965:15;19999:4;19996:1;19989:15;20015:120;20055:1;20081;20071:35;;20086:18;;:::i;:::-;-1:-1:-1;20120:9:1;;20015:120::o;20140:489::-;-1:-1:-1;;;;;20409:15:1;;;20391:34;;20461:15;;20456:2;20441:18;;20434:43;20508:2;20493:18;;20486:34;;;20556:3;20551:2;20536:18;;20529:31;;;20334:4;;20577:46;;20603:19;;20595:6;20577:46;:::i;:::-;20569:54;20140:489;-1:-1:-1;;;;;;20140:489:1:o;20634:249::-;20703:6;20756:2;20744:9;20735:7;20731:23;20727:32;20724:52;;;20772:1;20769;20762:12;20724:52;20804:9;20798:16;20823:30;20847:5;20823:30;:::i;20888:112::-;20920:1;20946;20936:35;;20951:18;;:::i;:::-;-1:-1:-1;20985:9:1;;20888:112::o

Swarm Source

ipfs://e146311acbfe9b03f4a6758ca778c07128caf41f389eb7653f6073eae1bf4f8e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.