ETH Price: $3,283.14 (+0.55%)
Gas: 13 Gwei

Token

Mirage Gallery Dreamers (MGD)
 

Overview

Max Total Supply

1,488 MGD

Holders

299

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
3 MGD
0x2719Ae45285B243d1Fe59D8898C16f35897Df824
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:
mirageDreamers

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-21
*/

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// 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/Strings.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

    /**
     * @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);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @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: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;




/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: @openzeppelin/contracts/finance/PaymentSplitter.sol


// OpenZeppelin Contracts (last updated v4.7.0) (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;




/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned. The distribution of shares is set at the
 * time of contract deployment and can't be updated thereafter.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Getter for the amount of payee's releasable Ether.
     */
    function releasable(address account) public view returns (uint256) {
        uint256 totalReceived = address(this).balance + totalReleased();
        return _pendingPayment(account, totalReceived, released(account));
    }

    /**
     * @dev Getter for the amount of payee's releasable `token` tokens. `token` should be the address of an
     * IERC20 contract.
     */
    function releasable(IERC20 token, address account) public view returns (uint256) {
        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        return _pendingPayment(account, totalReceived, released(token, account));
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 payment = releasable(account);

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 payment = releasable(token, account);

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.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 (last updated v4.7.0) (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);

    /**
     * @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`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);
}

// 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: tinyERC721_ID.sol


pragma solidity ^0.8.0;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error TokenDataQueryForNonexistentToken();
error OwnerQueryForNonexistentToken();
error OperatorQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

contract TinyERC721 is Context, ERC165, IERC721, IERC721Metadata {
  using Address for address;
  using Strings for uint256;

  struct TokenData {
    address owner;
    bytes12 aux;
  }

  uint256 private immutable _maxBatchSize;

  mapping(uint256 => TokenData) private _tokens;
  uint256 private _mintCounter = 151;
  uint256 private _claimCounter;

  string private _name;
  string private _symbol;

  mapping(uint256 => address) private _tokenApprovals;
  mapping(address => mapping(address => bool)) private _operatorApprovals;

  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_
  ) {
    _name = name_;
    _symbol = symbol_;
    _maxBatchSize = maxBatchSize_;
  }

  function totalSupply() public view virtual returns (uint256) {
    return (_mintCounter - 151 + _claimCounter);
  }

  function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
    return
      interfaceId == type(IERC721).interfaceId ||
      interfaceId == type(IERC721Metadata).interfaceId ||
      super.supportsInterface(interfaceId);
  }

  function name() public view virtual override returns (string memory) {
    return _name;
  }

  function symbol() public view virtual override returns (string memory) {
    return _symbol;
  }

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

    string memory baseURI = _baseURI();
    return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
  }

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

  function balanceOf(address owner) public view virtual override returns (uint256) {
    if (owner == address(0)) revert BalanceQueryForZeroAddress();

    uint256 total = totalSupply() + 150 - _claimCounter;
    uint256 count;
    address lastOwner;
    for (uint256 i; i <= total; ++i) {
      if(_exists(i)) {
        address tokenOwner = _tokens[i].owner;
        if (tokenOwner != address(0)) lastOwner = tokenOwner;
        if (lastOwner == owner) ++count;
      }
    }

    return count;
  }

  function _tokenData(uint256 tokenId) internal view returns (TokenData storage) {
    if (!_exists(tokenId)) revert TokenDataQueryForNonexistentToken();

    TokenData storage token = _tokens[tokenId];
    uint256 currentIndex = tokenId;
    while (token.owner == address(0)) {
      unchecked {
        --currentIndex;
      }
      token = _tokens[currentIndex];
    }

    return token;
  }

  function ownerOf(uint256 tokenId) public view virtual override returns (address) {
    if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken();
    return _tokenData(tokenId).owner;
  }

  function approve(address to, uint256 tokenId) public virtual override {
    TokenData memory token = _tokenData(tokenId);
    address owner = token.owner;
    if (to == owner) revert ApprovalToCurrentOwner();

    if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
      revert ApprovalCallerNotOwnerNorApproved();
    }

    _approve(to, tokenId, token);
  }

  function getApproved(uint256 tokenId) public view virtual override returns (address) {
    if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

    return _tokenApprovals[tokenId];
  }

  function setApprovalForAll(address operator, bool approved) public virtual override {
    if (operator == _msgSender()) revert ApproveToCaller();

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

  function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
    return _operatorApprovals[owner][operator];
  }

  function transferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public virtual override {
    TokenData memory token = _tokenData(tokenId);
    if (!_isApprovedOrOwner(_msgSender(), tokenId, token)) revert TransferCallerNotOwnerNorApproved();

    _transfer(from, to, tokenId, token);
  }

  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public virtual override {
    safeTransferFrom(from, to, tokenId, '');
  }

  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public virtual override {
    TokenData memory token = _tokenData(tokenId);
    if (!_isApprovedOrOwner(_msgSender(), tokenId, token)) revert TransferCallerNotOwnerNorApproved();

    _safeTransfer(from, to, tokenId, token, _data);
  }

  function _safeTransfer(
    address from,
    address to,
    uint256 tokenId,
    TokenData memory token,
    bytes memory _data
  ) internal virtual {
    _transfer(from, to, tokenId, token);

    if (to.isContract() && !_checkOnERC721Received(from, to, tokenId, _data))
      revert TransferToNonERC721ReceiverImplementer();
  }

  function _exists(uint256 tokenId) internal view virtual returns (bool) {
    if (tokenId > 150) {
      return tokenId < _mintCounter;
    } else if (tokenId <= 150) {
      return tokenId <= _claimCounter;
    } else {
      return false;
    }
  }

  function _isApprovedOrOwner(
    address spender,
    uint256 tokenId,
    TokenData memory token
  ) internal view virtual returns (bool) {
    address owner = token.owner;
    return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
  }

  function _safeMint(address to, uint256 quantity) internal virtual {
    _safeMint(to, quantity, '');
  }

  function _safeMintID(address to, uint256 _id, uint256 quantity) internal virtual {
    _safeMintID(to, _id, quantity, '');
  }

  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal virtual {
    uint256 startTokenId = _mintCounter;
    _mint(to, quantity);

    if (to.isContract()) {
      unchecked {
        for (uint256 i; i < quantity; ++i) {
          if (!_checkOnERC721Received(address(0), to, startTokenId + i, _data))
            revert TransferToNonERC721ReceiverImplementer();
        }
      }
    }
  }

  function _safeMintID(
    address to,
    uint256 _id,
    uint256 quantity,
    bytes memory _data
  ) internal virtual {
    _mintID(to, _id, quantity);
    _claimCounter += quantity;
    if (to.isContract()) {
      unchecked {
        if (!_checkOnERC721Received(address(0), to, _id, _data))
            revert TransferToNonERC721ReceiverImplementer();
      }
    }
  }

  function _mint(address to, uint256 quantity) internal virtual {
    if (to == address(0)) revert MintToZeroAddress();
    if (quantity == 0) revert MintZeroQuantity();

    uint256 startTokenId = _mintCounter;
    _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    unchecked {
      for (uint256 i; i < quantity; ++i) {
        if (_maxBatchSize == 0 ? i == 0 : i % _maxBatchSize == 0) {
          TokenData storage token = _tokens[startTokenId + i];
          token.owner = to;
          token.aux = _calculateAux(address(0), to, startTokenId + i, 0);
        }

        emit Transfer(address(0), to, startTokenId + i);
      }
      _mintCounter += quantity;
    }

    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

  function _mintID(address to, uint256 _id, uint256 quantity) internal virtual {
    if (to == address(0)) revert MintToZeroAddress();
    if (quantity == 0) revert MintZeroQuantity();

    uint256 startTokenId = _id;
    _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    unchecked {
      for (uint256 i; i < quantity; ++i) {
        if (_maxBatchSize == 0 ? i == 0 : i % _maxBatchSize == 0) {
          TokenData storage token = _tokens[startTokenId + i];
          token.owner = to;
          token.aux = _calculateAux(address(0), to, startTokenId + i, 0);
        }

        emit Transfer(address(0), to, startTokenId + i);
      }
    }

    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

  function _transfer(
    address from,
    address to,
    uint256 tokenId,
    TokenData memory token
  ) internal virtual {
    if (token.owner != from) revert TransferFromIncorrectOwner();
    if (to == address(0)) revert TransferToZeroAddress();

    _beforeTokenTransfers(from, to, tokenId, 1);

    _approve(address(0), tokenId, token);

    unchecked {
      uint256 nextTokenId = tokenId + 1;
      if (_exists(nextTokenId)) {
        TokenData storage nextToken = _tokens[nextTokenId];
        if (nextToken.owner == address(0)) {
          nextToken.owner = token.owner;
          nextToken.aux = token.aux;
        }
      }
    }

    TokenData storage newToken = _tokens[tokenId];
    newToken.owner = to;
    newToken.aux = _calculateAux(from, to, tokenId, token.aux);

    emit Transfer(from, to, tokenId);

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

  function _calculateAux(
    address from,
    address to,
    uint256 tokenId,
    bytes12 current
  ) internal view virtual returns (bytes12) {}

  function _approve(
    address to,
    uint256 tokenId,
    TokenData memory token
  ) internal virtual {
    _tokenApprovals[tokenId] = to;
    emit Approval(token.owner, to, tokenId);
  }

  function _checkOnERC721Received(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) private returns (bool) {
    try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
      return retval == IERC721Receiver.onERC721Received.selector;
    } catch (bytes memory reason) {
      if (reason.length == 0) {
        revert TransferToNonERC721ReceiverImplementer();
      } else {
        assembly {
          revert(add(32, reason), mload(reason))
        }
      }
    }
  }

  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}
// File: dreamers.sol

/*
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMNOOXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXO0NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMk,'lKWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMKc.,kWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMNo...cKMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMKc...lNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMK:....cKMMMMMMMMMMMMMMMMMMMMMMMMMMMMMKc....:0MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMk,.....cKMMMMMMMMMMMMMMMMMMMMMMMMMMWKc.....,kWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMNd.......cKWMMMMMMMMMMMMMMMMMMMMMMMKkc.......oNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMKc........cKMMMMMMMMMMMMMMMMMMMMMMKc'........cKMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMO,.........cKMMMMMMMMMMMMMMMMMMMMKc..........,OMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMWd'..........cKWMMMMMMMMMMMMMMMMMKl............dWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMXc...;;.......cKMMMMMMMMMMMMMMMMKc...'co,......cXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMO;..,x0:.......cKMMMMMMMMMMMMMMKl...cxKKc......;OMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMWd'..;0W0:.......cKWMMMMMMMMMMMKc...cKWMNo......'xWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMXl...lXMW0:.......c0WMMMMMMMMMKl...cKMMMWx'......lXXkxxddddoddddxxxkO0KXXNWWWMMMMMMMMMMM
MMMMMMMMMMMM0;...dWMMW0:.......c0WMMMMMMMKl...cKMMMMMO;......;0k,.'''',,''.......'',;::cxXMMMMMMMMMM
MMMMMMMMMMMWx'..,kMMMMW0:.......c0WMMMMMKl...cKMMMMWWKc......'xXOO00KKKKK00Okdoc,'......cKMMMMMMMMMM
MMMMMMMMMMMXl...:0MMMMMW0:.......:0WMMMKl...cKMMWKkdxKd.......oNMMMMMMMMMMMMMMMWXOd:'...lXMMMMMMMMMM
MMMMMMMMMMM0:...lXMMMMMMWO:.......:0MMKl...cKMWKo,..;0k,......:KMMMMMMMMMMMMMMMMMMWNOc'.oNMMMMMMMMMM
MMMMMMMMMMWx'..'dWMMMMMMMW0:.......:0Kl...cKMNk;....,k0:......,kMMMMMMMMMMMMMMMMMMMMMXl'oNMMMMMMMMMM
MMMMMMMMMMNl...,OMMMMMMMMMW0:.......;;...cKWXo'......dKl.......oNMMMMMMMMMMMMMMMMMMMMM0:dWMMMMMMMMMM
MMMMMMMMMM0:...:KMMMMMMMMMMW0c..........lKMNo'.......oXd'......cKMMMMMMMMMMMMMMMMMMMMMNKXMMMMMMMMMMM
MMMMMMMMMWk,...lXMMMMMMMMMMMWKc........cKMWx,.......,kWk,......,OMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMNo...'dWMMMMMMMMMMMMMKl......lKMMK:........:KMK:.......dNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMWO;...'xWMMMMMMMMMMMMMMXl'...lKMMWx'........lXMXl.......;OWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMNKOOd;.....;dkO0NMMMMMMMMMMMXo''lXMMMNo.........lNW0:........,lxkO0XWMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMN0kkkkkkkkkkxxkOXWMMMMMMMMMMMN0ONMMMMNo.........lXWXOkkkkxxxxxxxxxk0WMXOkkkkkkkkkkkkkkkkkOXMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNo.........:0MMMMMMMMMMMMMMMMMMMMN0OOxl,........,lxO0NMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWx'........'xWMMMMMMMMMMMMMMMMMMMMMMMMNd'......'dNMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0:.........:KMMMMMMMMMMMMMMMMMMMMMMMMMk,......'xWMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNd'.........oXMMMMMMMMMMMMMMMMMMMMMMMMO,......'kWMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXo.........'oXMMMMMMMMMMMMMMMMMMMMMMMO,......'kMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXo'.........c0WMMMMMMMMMMMMMMMMMMMMMO,......'kMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNx;.........,dXWMMMMMMMMMMMMMMMMMMMO,......'kMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWKo;'........;d0NMMMMMMMMMMMMMMMMMO,......'kWMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWKOxc'.......':dOKNWMMMMMMMMMMMWk,......'kWMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN0xl;'.......,:ldxkO00KK00Od:.......;OMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWX0kdl:;''.......''''''....',;cox0NMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNXK0OkxxddddddddxxkkO0XNWMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
*/

// Contract authored by August Rosedale (@augustfr)
// https://miragegallery.ai

// TinyERC721 used (https://github.com/tajigen/tiny-erc721)
// Modifications were made to the TinyERC721 contract in order to allow for 'Sentient' members to claim from the first 150 tokens at any point in time.

pragma solidity ^0.8.16;






interface mirageContracts {
    function balanceOf(address owner, uint256 _id) external view returns (uint256);
}

interface mirageProjects {
  function balanceOf(address owner) external view returns (uint256);
}


contract mirageDreamers is TinyERC721, ReentrancyGuard, Ownable {

  using Strings for uint256;

  mapping(uint256 => uint256) public sentientClaimed;

  uint256 private maxSentientClaim = 3;

  uint256 public publicPrice = 0.06 ether;
  uint256 public holderPrice = 0.04 ether;
  uint256 public memberPrice = 0.02 ether;

  uint256 private maxMemberMint = 20;
  uint256 private maxHolderMint = 5;
  uint256 private maxPartnerMint = 5;
  address[] private mulIntelHolders;
  uint256[] private numIntelHeld;

  uint256 public maxSupply = 8000;

  bool private revealed;
  string private unrevealedURI = "ipfs://QmQoBSSf8ZvvPbUfVBnbKBZim9pJvgEvJS5zpfwCkp2HgW";

  uint256 public claimCounter;

  string public baseURI;

  bool private paused;

  bool public metadataFrozen;

  mirageProjects private curated;
  mirageProjects private cryptoNative;
  mirageProjects private AlejandroAndTaylor;
  mirageProjects private earlyWorks;

  salePhase public phase = salePhase.unOpened;

  address private immutable _adminSigner;

   struct Coupon {
      bytes32 r;
      bytes32 s;
      uint8 v;
  }

  struct Minted {
      uint256 member;
      uint256 id;
      uint256 holder;
      uint256 partner;
  }

  struct intelAllotment {
    uint256 maxMint;
    uint256 numMinted;
  }

  enum salePhase {
      unOpened,
      memberSale,
      presale,
      openSale,
      publicSale,
      closed
  }

  mirageContracts public membershipContract;

  mapping(address => Minted) numMinted;
  mapping(uint256 => Minted) idMinted;
  mapping(address => intelAllotment) intelQuantity;

  constructor(string memory name, string memory symbol, address adminSigner, address membershipAddress) TinyERC721(name, symbol, 0) {
      membershipContract = mirageContracts(membershipAddress);
      _adminSigner = adminSigner;
      cryptoNative = mirageProjects(0x89568Fc8d04B3f833209144b77F39b71078e3CB0);
      AlejandroAndTaylor = mirageProjects(0x63400da86a6b42dac41075667cF871a5Ef93802F);
      earlyWorks = mirageProjects(0x3Cf6e4ff99D616d44Be53E90F74eAE5D150Cb726);
      curated = mirageProjects(0xb7eC7bbd2d2193B47027247FC666fB342D23c4B5);

    //   cryptoNative = mirageProjects(0x662508A2767A1A978DF4CFd16f77A3358C613599);
    //   AlejandroAndTaylor = mirageProjects(0x662508A2767A1A978DF4CFd16f77A3358C613599);
    //   earlyWorks = mirageProjects(0x662508A2767A1A978DF4CFd16f77A3358C613599);
    //   curated = mirageProjects(0x662508A2767A1A978DF4CFd16f77A3358C613599);
  }

  function updateMintStatus(salePhase phase_) external onlyOwner {
      require(uint8(phase_) > uint8(phase), "Increase only");
      phase = phase_;
  }

  function updateMintLimits(uint256 _maxMember, uint256 _maxHolder, uint256 _maxPartner) public onlyOwner {
      maxMemberMint = _maxMember;
      maxHolderMint = _maxHolder;
      maxPartnerMint = _maxPartner;
      for(uint i = 0; i < mulIntelHolders.length; i++) {
          intelQuantity[mulIntelHolders[i]].maxMint = numIntelHeld[i] * maxMemberMint;
      }
  }

  function updateMintPrices(uint256 _public, uint256 _holder, uint256 _member) public onlyOwner {
      //input prices in wei
      publicPrice = _public;
      holderPrice = _holder;
      memberPrice = _member;
  }

  function togglePause() public onlyOwner {
      paused = !paused;
  }

  function sentientMint(uint256 numberOfTokens, uint256 _membershipId) public payable nonReentrant {
      require(_membershipId < 50, "Not a valid Sentient ID");
      require(!paused, "Minting paused");
      require(phase >= salePhase.memberSale && phase < salePhase.publicSale, "Not in member sale phase");
      require(membershipContract.balanceOf(msg.sender,_membershipId) > 0, "No membership tokens in this wallet");
      require(msg.value >= numberOfTokens * memberPrice, "Insufficient Payment: Amount of Ether sent is not correct.");
      require(numberOfTokens + totalSupply() <= 7850 + claimCounter, "Minting would exceed max supply");
      require(idMinted[_membershipId].id + numberOfTokens <= maxMemberMint, "Would exceed max allotment for this phase");
      idMinted[_membershipId].id += numberOfTokens;
      _safeMint(msg.sender,numberOfTokens);
  }

  function setIntelAllotment(address[] memory _addresses, uint256[] memory numHeld) public onlyOwner {
    require(_addresses.length == numHeld.length, "Array lengths don't match");
    //input number of intelligent memberships held by a single address
    mulIntelHolders = _addresses;
    numIntelHeld = numHeld;
    for(uint i = 0; i < _addresses.length; i++) {
        intelQuantity[mulIntelHolders[i]].maxMint = numIntelHeld[i] * maxMemberMint;
    }
  }

  function intelligentMint(uint256 numberOfTokens, Coupon memory coupon) public payable nonReentrant{
    require(!paused, "Minting paused");
    require(msg.value >= numberOfTokens * memberPrice, "Must send minimum value to mint!");
    require(phase >= salePhase.memberSale && phase < salePhase.publicSale, "Not in member sale phase");
    require(numberOfTokens + totalSupply() <= 7850 + claimCounter, "Minting would exceed max supply");
    bytes32 digest = keccak256(abi.encode(msg.sender,"member"));
    require(_isVerifiedCoupon(digest, coupon), "Invalid coupon");
    uint256 maxMint = intelQuantity[msg.sender].maxMint;
    if (maxMint == 0) {
        maxMint = maxMemberMint;
    }
    require(intelQuantity[msg.sender].numMinted + numberOfTokens <= maxMint, "Would exceed allotment");
    intelQuantity[msg.sender].numMinted += numberOfTokens;
    _safeMint(msg.sender,numberOfTokens);
  }

   function holderMint(uint256 numberOfTokens, Coupon memory coupon) public payable nonReentrant {
        require(!paused, "Minting paused");
        require(phase >= salePhase.presale && phase < salePhase.publicSale, "Not in presale phase");
        require(msg.value >= numberOfTokens * holderPrice, "Insufficient Payment: Amount of Ether sent is not correct.");
        require(numberOfTokens + totalSupply() <= 7850 + claimCounter, "Minting would exceed max supply");
        require(numMinted[msg.sender].holder + numberOfTokens <= maxHolderMint, "Minted max allotment for this sale phase");
        bytes32 digest = keccak256(abi.encode(msg.sender,"standard"));
        require(_isVerifiedCoupon(digest, coupon), "Invalid coupon");
        numMinted[msg.sender].holder += numberOfTokens;
        _safeMint(msg.sender,numberOfTokens);
  }

  function partnerMint(uint256 numberOfTokens, Coupon memory coupon) public payable nonReentrant {
      require(!paused, "Minting paused");
      require(phase >= salePhase.presale && phase < salePhase.publicSale, "Not in presale phase");
      require(msg.value >= numberOfTokens * publicPrice, "Insufficient Payment: Amount of Ether sent is not correct.");
      require(numberOfTokens + totalSupply() <= 7850 + claimCounter, "Minting would exceed max supply");
      require(numMinted[msg.sender].partner + numberOfTokens <= maxPartnerMint, "Minted max allotment for this sale phase");
      bytes32 digest = keccak256(abi.encode(msg.sender,"secondary"));
      require(_isVerifiedCoupon(digest, coupon), "Invalid coupon");
      numMinted[msg.sender].partner += numberOfTokens;
      _safeMint(msg.sender,numberOfTokens);
  }

  function openHolderPresale(uint256 numberOfTokens) public payable nonReentrant {
      require(!paused, "Minting paused");
      require(numberOfTokens <= 10, "Can't mint more than 10 tokens per transaction");
      require(phase >= salePhase.openSale && phase < salePhase.publicSale, "Not in presale phase");
      require(msg.value >= numberOfTokens * holderPrice, "Insufficient Payment: Amount of Ether sent is not correct.");
      require(numberOfTokens + totalSupply() <= 7850 + claimCounter, "Minting would exceed max supply");
      require(cryptoNative.balanceOf(msg.sender) > 0 || AlejandroAndTaylor.balanceOf(msg.sender) > 0 || earlyWorks.balanceOf(msg.sender) > 0 || curated.balanceOf(msg.sender) > 0, "No MG tokens held");
      _safeMint(msg.sender,numberOfTokens);
  }

  function publicMint(uint256 numberOfTokens) public payable nonReentrant {
      require(!paused, "Minting paused");
      require(phase == salePhase.publicSale, "Not in public sale phase");
      require(numberOfTokens <= 10, "Can't mint more than 10 tokens per transaction");
      require(msg.value >= numberOfTokens * publicPrice, "Insufficient Payment: Amount of Ether sent is not correct.");
      require(numberOfTokens + totalSupply() <= 7850 + claimCounter, "Minting would exceed max supply");
      _safeMint(msg.sender,numberOfTokens);
  }

  function _isVerifiedCoupon(bytes32 digest, Coupon memory coupon) internal view returns (bool) {
      address signer = ecrecover(digest, coupon.v, coupon.r, coupon.s);
      require(signer != address(0), "ECDSA: invalid signature"); // Added check for zero address
      return signer == _adminSigner;
  }

  function claimSentient(uint256 membershipId, uint256 numberOfTokens) public {
      require(phase >= salePhase.memberSale, "Claiming not open");
      require(membershipId < 50, "Must be a Sentient Membership ID (0-49)");
      require(membershipContract.balanceOf(msg.sender, membershipId) == 1, "Wallet does not own this membership ID");
      require(sentientClaimed[membershipId] + numberOfTokens <= maxSentientClaim, "Sentient Memberships can only claim 3 in total");
      require(claimCounter + numberOfTokens <= 150, "All have been claimed");
      sentientClaimed[membershipId] += numberOfTokens;
      _safeMintID(msg.sender,claimCounter + 1, numberOfTokens);
      claimCounter += numberOfTokens;
  }

  function airdrop(address[] memory addresses, uint256 numberOfTokens) public onlyOwner {
      require(totalSupply() + numberOfTokens <= 7850 + claimCounter, "Exceeds maximum token supply.");
      for (uint256 i = 0; i < addresses.length; i++) {
          _safeMint(addresses[i],numberOfTokens);
      }
  }

  function freezeMetadata() public onlyOwner {
      require(!metadataFrozen, "Already frozen");
      metadataFrozen = true;
  }

  function reveal(string memory _URI) public onlyOwner {
      baseURI = _URI;
      revealed = true;
  }

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

  function tokenURI(uint256 tokenID) public override view returns (string memory) {
      if (!_exists(tokenID)) revert URIQueryForNonexistentToken();
      if (!revealed) {
          return unrevealedURI;
      } else {
          return string.concat(baseURI,Strings.toString(tokenID));
      }
  }

  function updateURI(string memory _baseTokenURI, string memory _unrevealedURI) external onlyOwner {
      require(!metadataFrozen, "Metadata is frozen");
      baseURI = _baseTokenURI;
      unrevealedURI = _unrevealedURI;
  }

  function withdraw(address secondaryPayee) public onlyOwner {
      uint mainBalance = address(this).balance * 9 / 10;
      uint secondaryBalance = address(this).balance / 10;
      payable(msg.sender).transfer(mainBalance);
      payable(secondaryPayee).transfer(secondaryBalance);
  }

  function withdrawERC20(IERC20 token, address to) external onlyOwner {
      token.transfer(to, token.balanceOf(address(this)));
  }
}
 
/*
.....,:ldxxxkkkkkkxxdl:,'....,coxxkkkkkkxxdo:,'........................'''''''''''''''''.......................;:lloooool:;,'...........................................................................
......',lxkkxkxxkkkkkxoc;''...':oxkkkkkkkkkxdc;,'........................''''''',,,,,,,,,''....................;cloodoooooll:;,'........................................................................
........'cdkkxkkkkkkkxxxl;'.....,cdxxxkkkkkkkxo:,'.......................'''',;;;:::::::::;,''.................,:ldddoooolooolc:;;,'....................................................................
..........,cdkkkkkkkkkkxxo:'.....';lxkkkkkkxkkxdl;'......................'',;:cllllloooollllc:;'''....'.........,:ooooolcccloolllcc:,''''...............................................................
............;lxkkkkkkkkkkxdl;......,cdxkkkkkkkkkxo:'.....................',;clooddddddooooooooll:,,;:clcc:;'.....'cllccc::;;:cloooolllc:;,''............................................................
.............':oxkkkkkkkkxxxdc'.....';oxxkkkkkkkkkdc,'..................',;:loooddoooooooollllol;.',;::ccllc;'...,cllc::::;;;;;clllloooolc;,,'....................''''''''..............................
..............',cxkkkkkkkxxxxko:'.....,cdxkkkkkkkkkkdc,................''';clloooolllllllllllllc;.',,,,;;::c::;:::clolcc:::::;;;:::cllolllcc:;,''',,...........',;;;;;,,,,'.............................
................';okkkkkkkxxkkkko;.....';lxkkkkkkkkkkxo:'.............''',,;:cloolllcclllccllccc;''',,,,,,;::::lol:;;:c::c::::::::::ccccccccclc:::cc,'.',;,...,:ccccc::;;;,'............................
..................':dkkkkkkkkkkkkdc'.....':oxkkkkkkkkkxdc,..........';ccloolc::ccllllccllcclcccc:,,,,,'''',;:clodd:,',,,;;::::::::::::::ccccllllllol;',,,,;,,,:cllllllc:::;,............................
....................,cdkkkkkkkxxxkxl,.....';lxkkkkkkkkkkxl:;'.......:ooxOkkkkxol:;:cccllllllllloc;,;;,'..',;:cldxd:,;;,,,,;;::c:ccc::::::ccccccllllc;';ll:;,,;clooooollccc::,...........................
....................'',ldxxkkkkkkxxxd:'...'',:dkkkkkkkkkkxdl:,'....'ldoxOOOOkkkxdo:;,;;::::::ccl:,,,,'....',:cclllc;,,,,;;;:::cc:cccc:::::c::::cclll:,,ldoc;,;cllooollcccccc;...........................
......................'';ldxxkkkkkkkkxo;'..'..,cdkkkkkkkkkxxdc;'...;oddxxxxxxxkkkxdol:;,,,,',,,,,,;,,'....,;:::cccc:;,,;ccccccccc:ccc::ccccc::cccccc:;;lddl:;;:ccllllccccccc:'..........................
........................',:ldkkkkkkkxxxdc'......,lxkkkkkkkkkkxl:,.':loddddddddddxxxxxxdoc:;,,'',,,;;;,'.'';::::cclccc:::cllllloollccc::;:::ccccllllllcloddolc;;ccccccc::c::c:'..........................
..........................',coxkkkkkkxxxxl,......'cxkkkkkkkkkkxol:,:lddddddddooooddoodk0Okkdlll::cllcccc::::;;:clllccclllloolllloooooll::::c::cccclllodxdooooc;;clc::cccc::c:'..........................
............................',cdxkkxkkkxkxl;'.....';dkkkkkkkkkkxddl:clxxdddollllllloodk000OOOxl:cddddddoolcclloxxddollllllllllllloodddoolcc::;;:cloolooddollooc:;:llccllcccc:'..........................
..............................':oxkkkkkkkkkdc,'.....,cxkkkkkkkkkxddollddoolllllodooodxO000OkxoclodxdddooddxxkkOO00OOxdlllllccllllloodddoollcc:clooollloooollllll:;lolllllccc:'..........................
...............................';oxkxkkkxxkkkd:,......:okkkkkkkkkxdddddolllllloddxxxkO0K00kdoloddxkxddoodk00O00000000Oxoccllcllllllooddddoooooooooollloooollclloo:coddollcc:;'..........................
................................';coxkkxxkkkkkxl;'.....,lxkkkkkkkxxxddddolldddddddxO0000OOkdc;cdxkkxxdddxkO000000000000Oxdoooooooooodxkkkxxxkkxddddoooollllllllodl:lddolcc::;'..........',,,'...........
..................................';ldxkkxxkkkkkxl;.....';okkkkkkxxxxxxdddxxxxxxddxO00000Okxl:lkkkkxxxxkkkO0000000000000000OOOOkkkOOO000OOOOOOkkxdddooollccccllokd;:ddllccc:,'.....'',;;:cll:,'''.......
...................................'';lxxxkkkkkkkkdl,..'..':dkxxxxxxxxkkxdxxddxxddxOKKKKK0OxdoxOOOkkxxkkOOO000K000000000000000K0000000OOOOOOOOOOkxxdddolccccclloxkl:lddolll:,''',,;::ccllloll:;,,'......
...................................''',:oxkkkkkkkkkko:''...,cdxxddxxddxkkxxxxxxxdddk000K0K00OOO00000OOO000000KK000000000000000KKK0000000O00OO00OOOOkkxdlccllllloddl:cxxxdddl:;;;::cclllcclllc:;;;,,'....
......................................'',cdxkxkkxxkkxdl:,..,cxkxxdxxdddxkxxxxxxxddxO0KK00000000000KK0K000000KKKK000KKKK000000000KKK00000O00000000000000kdoolllloxko:cdkkkkxdlccccc:::::ccccc:::;;;,'....
......................................'''',cdkkkkkkkxxxdl:;;lxkkxxdxxdddxxxxxxxkkO0KK00K0000000000KK000000KKKKKKKKKKKKKKKK000000000000OkkO00KK00KKKK0000kdolllodxko:cldxkkkxoc:;,,,,,,;:c::::::;;,'.....
.......................................'''',coxkkkkkkxkkkdoodxkOkxddxxxdddddxkkO0KKKK000000000000000000000000KKK00KKK0KKKK00K000000O0OkddxkO0000KKKK0000Oxooooodxxo;:llodddolc:;;;;:c:;;;:::::;;;,'.....
........................................''''';cdkkOkkkkkkkkxxkOOkkxddxxdddddddxkOO00000000000000000000000000000000000000000KK000KK000OOkxxxxxxkO0K0K0000Oxdoooodxxdc;ccclloollccc:;;::;,;:::::;;,.......
..........................................'''',;ldkkkkkxxxkkkkkOOOkdodddxxxdddddxxkO0O0000000000000000000000000000000000KK00000KKK00000OOkkxxddxxO0000000Okkxddxdddoccccloooooolc:;'''',;::::;;;,.......
............................................'''',:oxkxxxxxxxxxkkOOkxoloddxxxddddoddxkO0000000000000000000000000000000000KK00000K00OOOO000000OkkxddkO00K00K000OOkkxdoolccccccllollc;'...,:c:c:;;;;'......
...............................................''';ldxxxdxxxxxxkkOOkdcclddxxxddddoodddkO000000000000OO000000000000000000000000000OOOOOOOOO0000Okkxdk00000KKKK0OOkxdlcccc:ccclllllc:,'.';cccc:;,;;'......
................................................'',:okkxxxxdxxdxxkkkxocclodxxdddddooooodk00000000000O000000000000OOOO00O000000000OOOOOOOOOO00K00Okxxk00KKKKKK00Oxolccccc::ccccccc::,'',clc:::,,,'.......
...............................................'..',lxkkxdxddxxxxdoldxdollloddddddddoooooxO0O0000000O00000000OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO00KK00OOxxkOKKKKKK00Oxolcccc:::cccc::::;,'':cc::;;'''........
..............................................''''',cdkOkdoddxxddolcdOkkkdooooodxdddddooooxOOO00OO0OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO00K00OkkkO0KKKKK0Oxocccccc:::cccc:::,'';::;;;;,...........
..............................................'''',;ck0OkocloddoooodO0OkkkkkxdoooxxxddooooodkOOkkkOOkOOOOOkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOkOO0K00OOkkkO00KKK0Okkxxollclllccc::;,,,:::;;,''...........
.............................................''''';ldkOOOkdodddddkO000OOOOkkkOkolodxxdddoooodxxddddddxxkkkkkkkOOkkkkkOOOkkkOOOOOOOOOOOOOOOOOOOOOO00000OkkkO00K0KK00Okkxooodolc:::;,,:::::,'.............
.............................................'..';lddxxkO00K0000000000OOkkkkxkxdllodxxdddooooddddddddddxxxxxxkkkkkkkkkkkkkkkkkkOOkkkkkkkkkkkkkkOOO0000OOkkkOO0KK00Oxxkddddolc:::;,,:c:::;,..............
.............................................'..,:ldollok00000000OOOOOkkkkkkxxdlclodddxdddoooodxkkO00OkkxxxddddxxxkkxxxxxxxxxxxxxkxxxxxxxkkkkkkkkkOOOOOkxkOOk0KK00Oxxdooddoc:::;,,;cc:::;'..............
............................................','';codlc:coxkkkkOOkkkkkkkkkkkkxdllloxOOkkxxxdddoodxkO000000OkxdddooddxkkxxxxxxxxxxxxxxxxxxxxxxxxxxxkkkkkkxxkkkO00K0Okxdooodocc:::;,;:cc:::;'..............
...........................................'cl,';clc:::::loodxxkkkkkxxxkkkxdolloxO00000kxxddddoloxkkkxxkkO0OOkxddoooddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkxxkxxxOKK0OOkxdoodddlcc::;,;:ccc:::;...............
...........................................;oc;;:cc::::::ccccoxkkkxxxxxxddolldxO00KK0000OkxddxdoooodddoddxkO00Okkxdooooddddxxxxxxxxxxxxxxxxxxxxxxxxkdldkxxk0K0Okkxdoodddlccc:;,,:cccc::;'...............
.........................................';cl:;:cc:::::c::c::lxxxxxxxdoolodxO0000000000000kkxddddooooodoooodkO000OOOkxdooooddxxxxxxxxxxxxxxxxxxxxxkxllxxxO0000Okkxdodxdlc:c:;;,;:c:::::,'...............
..........................................;;;:cccccccccccc:ccoolllllllodxOO000000O00000K000Okkxdxxdooodoollldxk00000OOkxddoloodxxxxxxxxxxxxxxxxxxxxocdkxOK00Oxxxdddddolccc::;;,;:cc:::;,'...............
...........'.............................,;::looolccc::::::cc:::::cldkkO00000000000000KK0000OOkxxxxdddddollloodkO00000O0Okxdlloodxxxxxxxxxxxxxxxxxdodddk0000Oxdddoddolcccc:;,,',:cc:;::;'...............
........................................,;:loxxxdoc::;;;;:ccc:clodxO0000000000000000K000000000OkxxxxxddxdooooooddkO00000000OkdooodxkkkxxxxxxxxxxxxdddcoO0000Oxddoodol::ccc:;,,',:ll:;:c;'...............
.......................................';:ldxxxddlc:;::cccclldxkO000000000000000O00000K0O000000kxxxxxdooooodxdooodk00000000000OkkkkOOOOkkkkxxxxxxdxdlcxO00OOkddddddolc:ccc:;,,',:llc:::,................
......................................';codxxxdlllc::cccloxkk00000000000000000O0OOO0OO0OOO0O0K0OkdooooooodkO0OkxdodxO000000KK0000000000Okkkxxxxxxxxoox000Okkkddddddolccccc:;,,,;:cc:::;'.............'''
......................................,:oxxxxxdllccccccoxkk0000000000000000000O00OO0OOOkkO0O00000OkkkkkkkO00000kxdooodkO00000000000000OOkkkxxxxxxxxdx000OOkkxxxxddoooccclc;,,,,;ccc:::;'...............'
.....................................,;ldxkkkkkxdollccccloodxxkO000OO00000OO00OOOOOOOkkkkOOOOO0000000000KK00000OOxddddkO0000000000000OOOkkxxxxxxxkkkO00000Okkkkxxddoolccllc,,;;:clcc::;'................
..................................',,,;codO00O00OOkdolc:cc::cclldxkO000000OOkOOOOOOkkxxxxkkkkkO0000000000K00K00000OOOOO00000000000000OOOkkxxxxxkxxkOO0K00K0OOOOkxddoooolooc;,;:ccccc::;,''..............
..................................;:;,,;:ldkO00000K0OOkxxolcc::::cok00000OOkkkkOOOOOkxdodddxkxxOO0000KKK0000K000000000000000000000O00OOOkkxxxxxxkkkO0000KKK00K0Oxdoodooddoc;;;clllcc::;,'''''...........
.................................,loc:,,',:okkO0000K000000OkkxxdocldO000Okkkkkkkkkkkxddooolloolodk00KKKKKKK000K00000000000000000000OOOOOOkxxxxxxkOOOO000KKKKKKK0kddddooddc:;;cllllc::;;,,''''...........
..................................,lxkxl;,',cdOOO00000O000000000Oxdxk00OkkkkkkkkkkkkxdolllllllllloxOO00KK00000000000000000000000000OOOOOkkxxxxxxxxxkOO00KKKKKKXKkxxxdooooc;,:lolllc:;;,,,,,''...........
....................................;okOx:,,,lk00000OxooxO000000000OO000Okkkkkkkxxxxxdoolcc:ccccccloddxkOOOOO0K00000000000000000OOOOOOOOkxxxxxxxxoodkOkO0KKKKXXKOkkkddool:,':oollc::;;;;;,,'''..........
......................................lOOo;;;ck00OkOxc,':dOOOO00OO000000OkkkkkkkkxxxdoolllccccclcccloooodkOOOO00OOOO0OOOOOOO0000OOOOOOOkkkxxxxxxxdddxkkxk0KKKKXK00Oxdddol:,',::::::;;;;;;,,,''..........
.......................................lko;,,ck00OOkd;'',:c::ldO000000K0OkkkkkkkxkkkxdoooooollcllcccllllodxkOOOOOOOOOOOOOOOOOOOOOOOOkkkOOOkkkkkkkxxkkOOdld0KKKKK0Okxddol:;''',;;;;;;;;;;;,,,''..........
........................................;c;,,:x0OOOkkl;;;;;''';dO0000000OkkkkkkkkkkOOkxxxxxxkxdooolllcllldxkkkkkkkkkkOOOOOkkkkOOOOkkkkkOOOOOOOkkkkkOO0OxlldkKKXKOkxxddoc:;,'.',;;;;:;;;;,,''''..........
..........................................,,';d0Okkxdlclddc,'',cdO000KK0OkkkkkkkkkkkkkkkkkOkkkxxxxxdddddxxxxxxxxxkkkkkkkkkkkkkkOOkkkkkkkOOOOOOOOkOOO0Oxc:cokKKXK0kkxxxdoc;,'.',;;;;;;;,,,''''...........
...........................................,''l00dllllccoolc;,,,:ldk0K0OOkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxkkxxxxxxxxkkkkkkkkkOOOOOOOOOOOOO0OOOdc::lk0KKKK0Okkkxxdl:;,''',,,,',,''''..............
............................................''cOOl;;clllc:;:clc:;,,cxK0OOkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOO0OkOOkOOOkO000kocldxk0K0000Okxxxddlcc:;,,,;;;,'''..................
.............................................'lkOo;,,;;,,:cldxxdlc:cx0OkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkO0OO0O0OOOkOOOkkO0OxoclodkO00OOkxdlllccccccccccccc:'....'................
.............................................,lO0xooc:::lodxxxxxxxxOOkxkkxkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxkkkkkkkxxxxkkkkkkkkOOOO0K00OO00K0OOkkxolc;:loddxkkkxddolc:::;::c::cclllc::'....'................
.............................................'ck00OkkxxxxxxkkxkkkkOOkxkxxxkkkkkkkkkkkkkkkkkkkkkkxxkkkkkkkkkkkkkkkkkkkkkkOOOOOxddxxdddddddol:;,,,;:loollollllccc::::;;;:::cccllc:;;,....'................
.............................................,lk0OOkkkkkxxxxxkkkkkkkkxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOkxl:;:;;,;;;;::::c:cloodddlcccccccccc::::;;;;;;;;:::;,'.....'.................
............................................'cdxxxxxxxkkkkkkkkkkxxkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOkkdlcloxollcccllllooodddddxdoccccccccccc::::;;;;;;;::;,...''....'...............
...........................................'cdxxxxxxxxxxxxxxxxxxxxxkxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOkxdoodxkOkxddooooooooddddddddolllcccc:::;;::ccc:::::cllc,'..'....................
..........................................'cdxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOxlclodkkOkxdodddddddddddddddoollccccc:;;;;;;:::::::::ccc;,..'....................
.........................................;ldkkxxxxxxxxxxxxxxxxxxxxxxxxxdxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkOkd::odxkkkkkxddxxdxxxxxxxxxxxxxolccccc::c:;,,;;;;::::::::::,''''..................
........................................'cxkkkkkkxxxxxxxxxxxxxxxxxxxxxddxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxl;,cdxkkkkOOkkkOOOOOOOOOOOOOOkkdlccc:::ccc;,,,,,;;::::::::::;,''..................
........................................,cdxxkkxxxxxxxxxxxxxxxxxxxxxxddxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxoc;'.,lxxkkOO0OOOOO000KKKKKKKK0K0Okdlcc::;;::;;,,,,,;:::::::::;;;,'..................
........................................';ldxxkkxxxxxkkxxxxxxxxxxxxxxxxkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkOOOkkxxdolc:;,';ldkkOOOOOOO000KKKKKKKKK000000Oxoolc:;;;;;;;,,,,;;:::::;;;;;;'...................
........................................';:ldoodoooodddddxkxxxxxxxxxxxkkkkkkkkkkkkkkkkkkOkkkkkkkkkOOkkxddollllllccccc::ldkOkkxxxkO0000KKKKKKK0OOOOkkkxddolc::;;;;;;;,,,;;::::;;;;;,'....................
.........................................';:lol::ccccc::cldxxxxxxxxxkkkkkkkkkkkkkkkOOOOOOkkkxxxdoolllc:;;:loodxxxxxxxddxkOOkxxxkkO0KKKK0KKK0OOOOkkdddxdooolcc:;,',;;,,;;::::;,,,,,'.....................
...........................................';cc,.';,,::;;;:odxxxxkkkkkkkkkkkkkkkkkkOOkkkxxdooc:;;;:ccloddxkkkkkkkkOOkkkkkkxxxkkkOO0KK00KK0OkkOOkxxdooooolooolcc;;;;;;;:::::;,'''''......................
......................................................,,,,;:cdxxkkkkkkkkOOkkkkkkxxddoolc::;:clloddxkkkkkkkkkkkkkkkOkkkkkkxxxkOOOO00000KKKK0Okkxxxxxddolllloooolc:;;;:;;;;:;,''''........................
.........................................................',,;oxxkkkkkkkOkkxddoollcc::::::lodxxkkkkkkkkkkkkkkkkkkkkkkOOkxxddxk00000KK00KK0000Okxxdollollccllooollc:;;;,'',;;;,''.........................
.............................................................,coxxxxdoolcc:::ccloooodddxxxxkkkkkkkkkkkkkkkkkkkkkkOOOOOkxdoodxkO000KK0KKK000kxxxdoccclcccccloooolc::;,,,'',:c:,'.........................
...............................................................;cc:;:::clooodxxxxxxxxxxxxxxkkkxxkkxxxkkkkkkkkOOOOOkkOOxdoodddxkO00K0000KKOxddxdolclllllcclooooollc:;:;;::cllc:,.........................
................................................................'';;:codxxxxxxxxxxxxxxxxxxxkkkkkkkkkkkkkkkkkOO00kxkkkdollooooxO0000000000Okxddolccllclcccloolloollccllllllllllc,........................
..................................................................''':ldkxxxxxxxxxxxxxxxxxkkkkkkkkkkkkkkkkkOO00OdoxdollllllloxO0000000000Okdolcccclccc::clllccllllllllllcllcccc;'.......................
....................................................................',:dkkxxxxxdxddxxxxxxkkkkkkkkkkkkkkkkkOO00OkolllccllllllooxO00000000Okdolcccccccccccclllcc:cccllolcccccc:c::,.......................
....................................................................'''cdxkxxxxxxxxxxxkkkkkkkkkkkkkkkkkkkOOO00Okl:cccccccccllloxk00K00K00kxdxdoolcccccloooollcccccclllcccc::::::;'......................
......................................................................';cdxxxxxxxxxxxxkkkkkkkkkkkkkkkkkkOO00000Ol;:cccccccccclldk0K000KKK0kxxkxxoloddoxxxxddolcclcc:cccccc::::::,.......................
.......................................................................,:ldxxxxxxxxxxxkkkkkkkkkkkkkkkkkOOO000000x::::::ccccccllldOKK00KKK00OOOOOkkkkOkOOkkkxddoollc:ccccc:::;,,'........................
.......................................................................',:ldxxxxxxxxxxkkkkkkkkkkkkkkkkOOO0000000kl;,,;::ccc:cloooxO0KKKKK00KKKKKKK000OOkkkkxxdddolc:;:ccc:,'''..........................
.......................................................................'',;lxxxxxxxxxxkkkkkkkkkkkkkkkkOOO00000000ko:,,;:::::::coodxOKKKK0OO00OOOOOkkxxxxxddddoooollc:;;::;'.............................
........................................................................''':dxxxxxxxxxkkkkkkkkkkkkkkOOOO0000000000Okxoooc;;;::ccloxO00K0Oxdddddddooddddddooolllllooodolc;,'.............................
...........................................................................;ldxxxxxxxdxkkkkkkkkkkkkOOOOOO000K000000OOOO0Ooccc::ccldk000kddooooolllllollclloolllooddxkxoc,...............................
..........................................................................',:lddxxxxxdxkkkkkkkkkkkkOOOOO0000K000K000OOO00OkkxollccldO0Oxoooollllllccllcclooooooddxxdo:,.................................
...........................................................................',:odxxxxxxxxkkkkkkkkkkkOOOOOO0000000000000000000Oxoolllldkxdoooolllccccllllloooolc:::::;;,'.................................
.............................................................................,codxxxxxxxxkkkkkkkkkkOOOOOO000000000000000000O0Okxololoddoooooolllllooodddddol:,..........................................
.............................................................................';lodxxxxxxxkkkkkkkkkOOOOOOO00000000000K000000O00OOkdllllddddooooooddxxxkOxxdol;'..........................................
..............................................................................,:cdxxxxxxxxkkkkkkkkOOOOOOO000000000KKK000000000O00Oxdl:;:looooooodxxxkxdoc;::'...........................................
...............................................................................';codxxxxxxxkkkkkkkkOOOOOO000000000K0K0000000000000OOxl:,,;;:::cccllccc;',,,'............................................
.................................................................................,:odxxxxxxxkkkkkOOOOOOOOO00000000000000000000000000OOxo:,''',,;;:llldddddxxoc,.........................................
.................................................................................',:oxxxxxxxxkkkkkOOOOOOO00000000K0000000000000000000000Odl:,''''',;:cloddooddo,........................................
..................................................................................',;cdkxxxxxxkkkkOOOOOOO00000000000000K00K000000000000000OOxollc:;,,,,,,,,,,,:;........................................
..........................................................................'......',,;;:dxxxxxxkkkOOOOOOOOO0000KKK00KKK0K00000000000000KK000000000Okdol:;,'.''.'.........................................
.....................................................................',,;:ccllllcccc;,:ldxkxxxkkkOOOOOOOOO00000KK000KK00000000K00K0000K0000000000KKK00Oxdl:'......'.....................................
...............................................................'';:clooddkOOOOO0Oxdlc;,:oxxxxxxkkOOOOOOO00O0000000K000K00000000KKK0000KKK00000000K0KKKKKK0Od:'..........................................
................................................''.....''.'',;:lodxxxxkxkkkkOOOOOOxdc:;;lxxxkxxkkkOOOOOO00O000000000K0000K00000KKK0000K0K0000000000KK0KKK000ko:'........................................
..............................................'''''',,'';:looxxxkkkkkkkkkkkkOO000K0Ooc:;coxxxxxkkOOOOOOO00O00000000000K0000000000K00000000KK000KKK0KKKK0000000Oxl;',,,..................................
..................................................';;::coxxkkkkkkkkkkkkkkkOO0KKK00XX0o::clxkxxxxkkOOOOOO00O0000000KKKKKKK000K0000000000000KK0000KKKKKKKKXK0000OO0Ol:olc;'...............................
*/

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"adminSigner","type":"address"},{"internalType":"address","name":"membershipAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenDataQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"airdrop","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"membershipId","type":"uint256"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"claimSentient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freezeMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct mirageDreamers.Coupon","name":"coupon","type":"tuple"}],"name":"holderMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"holderPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct mirageDreamers.Coupon","name":"coupon","type":"tuple"}],"name":"intelligentMint","outputs":[],"stateMutability":"payable","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":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"memberPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"membershipContract","outputs":[{"internalType":"contract mirageContracts","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"openHolderPresale","outputs":[],"stateMutability":"payable","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":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct mirageDreamers.Coupon","name":"coupon","type":"tuple"}],"name":"partnerMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"phase","outputs":[{"internalType":"enum mirageDreamers.salePhase","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sentientClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"_membershipId","type":"uint256"}],"name":"sentientMint","outputs":[],"stateMutability":"payable","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":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"numHeld","type":"uint256[]"}],"name":"setIntelAllotment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"_maxMember","type":"uint256"},{"internalType":"uint256","name":"_maxHolder","type":"uint256"},{"internalType":"uint256","name":"_maxPartner","type":"uint256"}],"name":"updateMintLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_public","type":"uint256"},{"internalType":"uint256","name":"_holder","type":"uint256"},{"internalType":"uint256","name":"_member","type":"uint256"}],"name":"updateMintPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum mirageDreamers.salePhase","name":"phase_","type":"uint8"}],"name":"updateMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"},{"internalType":"string","name":"_unrevealedURI","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"secondaryPayee","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60976001556003600a5566d529ae9e860000600b55668e1bc9bf040000600c5566470de4df820000600d556014600e556005600f819055601055611f40601355610120604052603560c0818152906200402c60e03960159062000063908262000282565b50601b805460ff60a01b191690553480156200007e57600080fd5b506040516200406138038062004061833981016040819052620000a1916200041a565b838360006003620000b3848262000282565b506004620000c2838262000282565b5060805250506001600755620000d8336200018b565b601c80546001600160a01b039283166001600160a01b031991821617909155911660a0526019805482167389568fc8d04b3f833209144b77f39b71078e3cb0179055601a805482167363400da86a6b42dac41075667cf871a5ef93802f179055601b8054909116733cf6e4ff99d616d44be53e90f74eae5d150cb72617905550506018805475b7ec7bbd2d2193b47027247fc666fb342d23c4b5000062010000600160b01b0319909116179055620004a9565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200020857607f821691505b6020821081036200022957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200027d57600081815260208120601f850160051c81016020861015620002585750805b601f850160051c820191505b81811015620002795782815560010162000264565b5050505b505050565b81516001600160401b038111156200029e576200029e620001dd565b620002b681620002af8454620001f3565b846200022f565b602080601f831160018114620002ee5760008415620002d55750858301515b600019600386901b1c1916600185901b17855562000279565b600085815260208120601f198616915b828110156200031f57888601518255948401946001909101908401620002fe565b50858210156200033e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082601f8301126200036057600080fd5b81516001600160401b03808211156200037d576200037d620001dd565b604051601f8301601f19908116603f01168101908282118183101715620003a857620003a8620001dd565b81604052838152602092508683858801011115620003c557600080fd5b600091505b83821015620003e95785820183015181830184015290820190620003ca565b600093810190920192909252949350505050565b80516001600160a01b03811681146200041557600080fd5b919050565b600080600080608085870312156200043157600080fd5b84516001600160401b03808211156200044957600080fd5b62000457888389016200034e565b955060208701519150808211156200046e57600080fd5b506200047d878288016200034e565b9350506200048e60408601620003fd565b91506200049e60608601620003fd565b905092959194509250565b60805160a051613b48620004e46000396000612903015260008181612cfb01528181612d2101528181612e200152612e460152613b486000f3fe6080604052600436106102725760003560e01c8063715018a61161014f578063b96afaa7116100c1578063d5abeb011161007a578063d5abeb0114610704578063e985e9c51461071a578063f2fde38b1461073a578063f6d1445b1461075a578063f905f1541461076d578063fb3cc6c21461078d57600080fd5b8063b96afaa71461065a578063c204642c14610687578063c29a3025146106a7578063c4ae3168146106ba578063c87b56dd146106cf578063d111515d146106ef57600080fd5b8063a00b43f911610113578063a00b43f914610596578063a22cb465146105b6578063a874258d146105d6578063a945bf80146105f6578063b1c9fe6e1461060c578063b88d4fde1461063a57600080fd5b8063715018a61461051b57806383a9bd80146105305780638da5cb5b146105435780639456fbcc1461056157806395d89b411461058157600080fd5b806349f6471d116101e857806355ea7328116101ac57806355ea73281461047a5780635ef3f776146104905780636352211e146104b0578063636e746b146104d05780636c0360eb146104e657806370a08231146104fb57600080fd5b806349f6471d146103f15780634c261247146104045780634efa8f171461042457806351cff8d91461043a57806351ec8d1e1461045a57600080fd5b806318160ddd1161023a57806318160ddd1461034857806323b872dd1461036b5780632db115441461038b578063406f7a951461039e57806342842e0e146103be57806346c5d449146103de57600080fd5b806301ffc9a71461027757806306fdde03146102ac578063081812fc146102ce578063095ea7b3146103065780631789e2d814610328575b600080fd5b34801561028357600080fd5b50610297610292366004612fb3565b6107ac565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c16107fe565b6040516102a39190613027565b3480156102da57600080fd5b506102ee6102e936600461303a565b610890565b6040516001600160a01b0390911681526020016102a3565b34801561031257600080fd5b50610326610321366004613068565b6108d4565b005b34801561033457600080fd5b50610326610343366004613153565b610988565b34801561035457600080fd5b5061035d610a00565b6040519081526020016102a3565b34801561037757600080fd5b506103266103863660046131b7565b610a23565b61032661039936600461303a565b610a95565b3480156103aa57600080fd5b506103266103b93660046131f8565b610bea565b3480156103ca57600080fd5b506103266103d93660046131b7565b610c87565b6103266103ec36600461303a565b610ca2565b6103266103ff366004613224565b610ff2565b34801561041057600080fd5b5061032661041f3660046132ac565b6111f7565b34801561043057600080fd5b5061035d60165481565b34801561044657600080fd5b506103266104553660046132e1565b61121c565b34801561046657600080fd5b50601c546102ee906001600160a01b031681565b34801561048657600080fd5b5061035d600c5481565b34801561049c57600080fd5b506103266104ab3660046131f8565b6112b3565b3480156104bc57600080fd5b506102ee6104cb36600461303a565b6112c9565b3480156104dc57600080fd5b5061035d600d5481565b3480156104f257600080fd5b506102c161130a565b34801561050757600080fd5b5061035d6105163660046132e1565b611398565b34801561052757600080fd5b50610326611463565b61032661053e366004613224565b611477565b34801561054f57600080fd5b506008546001600160a01b03166102ee565b34801561056d57600080fd5b5061032661057c3660046132fe565b61171a565b34801561058d57600080fd5b506102c1611803565b3480156105a257600080fd5b506103266105b13660046133cf565b611812565b3480156105c257600080fd5b506103266105d1366004613498565b611918565b3480156105e257600080fd5b506103266105f13660046134c6565b6119ad565b34801561060257600080fd5b5061035d600b5481565b34801561061857600080fd5b50601b5461062d90600160a01b900460ff1681565b6040516102a391906134fe565b34801561064657600080fd5b50610326610655366004613526565b611c6e565b34801561066657600080fd5b5061035d61067536600461303a565b60096020526000908152604090205481565b34801561069357600080fd5b506103266106a23660046135a6565b611ce8565b6103266106b5366004613224565b611da1565b3480156106c657600080fd5b50610326611f8b565b3480156106db57600080fd5b506102c16106ea36600461303a565b611fa7565b3480156106fb57600080fd5b5061032661209d565b34801561071057600080fd5b5061035d60135481565b34801561072657600080fd5b506102976107353660046132fe565b6120ff565b34801561074657600080fd5b506103266107553660046132e1565b61212d565b6103266107683660046134c6565b6121a6565b34801561077957600080fd5b506103266107883660046135eb565b6124c2565b34801561079957600080fd5b5060185461029790610100900460ff1681565b60006001600160e01b031982166380ac58cd60e01b14806107dd57506001600160e01b03198216635b5e139f60e01b145b806107f857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461080d9061360c565b80601f01602080910402602001604051908101604052809291908181526020018280546108399061360c565b80156108865780601f1061085b57610100808354040283529160200191610886565b820191906000526020600020905b81548152906001019060200180831161086957829003601f168201915b5050505050905090565b600061089b8261256a565b6108b8576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006108df82612596565b6040805180820190915290546001600160a01b03808216808452600160a01b90920460a01b6001600160a01b03191660208401529192509084168190036109395760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610959575061095781336120ff565b155b15610977576040516367d9dca160e11b815260040160405180910390fd5b6109828484846125fd565b50505050565b61099061265e565b601854610100900460ff16156109e25760405162461bcd60e51b815260206004820152601260248201527126b2ba30b230ba309034b990333937bd32b760711b60448201526064015b60405180910390fd5b60176109ee8382613694565b5060156109fb8282613694565b505050565b60006002546097600154610a14919061376a565b610a1e919061377d565b905090565b6000610a2e82612596565b6040805180820190915290546001600160a01b0381168252600160a01b900460a01b6001600160a01b03191660208201529050610a6c3383836126b8565b610a8957604051632ce44b5f60e11b815260040160405180910390fd5b61098284848484612709565b600260075403610ab75760405162461bcd60e51b81526004016109d990613790565b600260075560185460ff1615610adf5760405162461bcd60e51b81526004016109d9906137c7565b6004601b54600160a01b900460ff166005811115610aff57610aff6134e8565b14610b4c5760405162461bcd60e51b815260206004820152601860248201527f4e6f7420696e207075626c69632073616c65207068617365000000000000000060448201526064016109d9565b600a811115610b6d5760405162461bcd60e51b81526004016109d9906137ef565b600b54610b7a908261383d565b341015610b995760405162461bcd60e51b81526004016109d99061385c565b601654610ba890611eaa61377d565b610bb0610a00565b610bba908361377d565b1115610bd85760405162461bcd60e51b81526004016109d9906138b9565b610be23382612813565b506001600755565b610bf261265e565b600e839055600f829055601081905560005b60115481101561098257600e5460128281548110610c2457610c246138f0565b9060005260206000200154610c39919061383d565b601f600060118481548110610c5057610c506138f0565b60009182526020808320909101546001600160a01b0316835282019290925260400190205580610c7f81613906565b915050610c04565b6109fb83838360405180602001604052806000815250611c6e565b600260075403610cc45760405162461bcd60e51b81526004016109d990613790565b600260075560185460ff1615610cec5760405162461bcd60e51b81526004016109d9906137c7565b600a811115610d0d5760405162461bcd60e51b81526004016109d9906137ef565b6003601b54600160a01b900460ff166005811115610d2d57610d2d6134e8565b10158015610d5857506004601b54600160a01b900460ff166005811115610d5657610d566134e8565b105b610d745760405162461bcd60e51b81526004016109d99061391f565b600c54610d81908261383d565b341015610da05760405162461bcd60e51b81526004016109d99061385c565b601654610daf90611eaa61377d565b610db7610a00565b610dc1908361377d565b1115610ddf5760405162461bcd60e51b81526004016109d9906138b9565b6019546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4c919061394d565b1180610ec25750601a546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec0919061394d565b115b80610f375750601b546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f35919061394d565b115b80610fb257506018546040516370a0823160e01b81523360048201526000916201000090046001600160a01b0316906370a0823190602401602060405180830381865afa158015610f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb0919061394d565b115b610bd85760405162461bcd60e51b8152602060048201526011602482015270139bc81351c81d1bdad95b9cc81a195b19607a1b60448201526064016109d9565b6002600754036110145760405162461bcd60e51b81526004016109d990613790565b600260075560185460ff161561103c5760405162461bcd60e51b81526004016109d9906137c7565b6002601b54600160a01b900460ff16600581111561105c5761105c6134e8565b1015801561108757506004601b54600160a01b900460ff166005811115611085576110856134e8565b105b6110a35760405162461bcd60e51b81526004016109d99061391f565b600b546110b0908361383d565b3410156110cf5760405162461bcd60e51b81526004016109d99061385c565b6016546110de90611eaa61377d565b6110e6610a00565b6110f0908461377d565b111561110e5760405162461bcd60e51b81526004016109d9906138b9565b601054336000908152601d602052604090206003015461112f90849061377d565b111561114d5760405162461bcd60e51b81526004016109d990613966565b604080513360208201528082019190915260096060820152687365636f6e6461727960b81b608082015260009060a00160405160208183030381529060405280519060200120905061119f8183612831565b6111bb5760405162461bcd60e51b81526004016109d9906139ae565b336000908152601d6020526040812060030180548592906111dd90849061377d565b909155506111ed90503384612813565b5050600160075550565b6111ff61265e565b601761120b8282613694565b50506014805460ff19166001179055565b61122461265e565b6000600a61123347600961383d565b61123d91906139ec565b9050600061124c600a476139ec565b604051909150339083156108fc029084906000818181858888f1935050505015801561127c573d6000803e3d6000fd5b506040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015610982573d6000803e3d6000fd5b6112bb61265e565b600b92909255600c55600d55565b60006112d48261256a565b6112f157604051636f96cda160e11b815260040160405180910390fd5b6112fa82612596565b546001600160a01b031692915050565b601780546113179061360c565b80601f01602080910402602001604051908101604052809291908181526020018280546113439061360c565b80156113905780601f1061136557610100808354040283529160200191611390565b820191906000526020600020905b81548152906001019060200180831161137357829003601f168201915b505050505081565b60006001600160a01b0382166113c1576040516323d3ad8160e21b815260040160405180910390fd5b60006002546113ce610a00565b6113d990609661377d565b6113e3919061376a565b905060008060005b838111611459576113fb8161256a565b15611449576000818152602081905260409020546001600160a01b03168015611422578092505b866001600160a01b0316836001600160a01b0316036114475761144484613906565b93505b505b61145281613906565b90506113eb565b5090949350505050565b61146b61265e565b611475600061293f565b565b6002600754036114995760405162461bcd60e51b81526004016109d990613790565b600260075560185460ff16156114c15760405162461bcd60e51b81526004016109d9906137c7565b600d546114ce908361383d565b34101561151d5760405162461bcd60e51b815260206004820181905260248201527f4d7573742073656e64206d696e696d756d2076616c756520746f206d696e742160448201526064016109d9565b6001601b54600160a01b900460ff16600581111561153d5761153d6134e8565b1015801561156857506004601b54600160a01b900460ff166005811115611566576115666134e8565b105b6115af5760405162461bcd60e51b81526020600482015260186024820152774e6f7420696e206d656d6265722073616c6520706861736560401b60448201526064016109d9565b6016546115be90611eaa61377d565b6115c6610a00565b6115d0908461377d565b11156115ee5760405162461bcd60e51b81526004016109d9906138b9565b6040805133602082015280820191909152600660608201526536b2b6b132b960d11b608082015260009060a00160405160208183030381529060405280519060200120905061163d8183612831565b6116595760405162461bcd60e51b81526004016109d9906139ae565b336000908152601f6020526040812054908190036116765750600e545b336000908152601f6020526040902060010154819061169690869061377d565b11156116dd5760405162461bcd60e51b815260206004820152601660248201527515dbdd5b1908195e18d9595908185b1b1bdd1b595b9d60521b60448201526064016109d9565b336000908152601f6020526040812060010180548692906116ff90849061377d565b9091555061170f90503385612813565b505060016007555050565b61172261265e565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015611770573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611794919061394d565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156117df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fb9190613a00565b60606004805461080d9061360c565b61181a61265e565b805182511461186b5760405162461bcd60e51b815260206004820152601960248201527f4172726179206c656e6774687320646f6e2774206d617463680000000000000060448201526064016109d9565b815161187e906011906020850190612ee8565b508051611892906012906020840190612f4d565b5060005b82518110156109fb57600e54601282815481106118b5576118b56138f0565b90600052602060002001546118ca919061383d565b601f6000601184815481106118e1576118e16138f0565b60009182526020808320909101546001600160a01b031683528201929092526040019020558061191081613906565b915050611896565b336001600160a01b038316036119415760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6001601b54600160a01b900460ff1660058111156119cd576119cd6134e8565b1015611a0f5760405162461bcd60e51b815260206004820152601160248201527021b630b4b6b4b733903737ba1037b832b760791b60448201526064016109d9565b60328210611a6f5760405162461bcd60e51b815260206004820152602760248201527f4d75737420626520612053656e7469656e74204d656d626572736869702049446044820152662028302d34392960c81b60648201526084016109d9565b601c54604051627eeac760e11b8152336004820152602481018490526001600160a01b039091169062fdd58e90604401602060405180830381865afa158015611abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae0919061394d565b600114611b3e5760405162461bcd60e51b815260206004820152602660248201527f57616c6c657420646f6573206e6f74206f776e2074686973206d656d626572736044820152651a1a5c08125160d21b60648201526084016109d9565b600a54600083815260096020526040902054611b5b90839061377d565b1115611bc05760405162461bcd60e51b815260206004820152602e60248201527f53656e7469656e74204d656d62657273686970732063616e206f6e6c7920636c60448201526d185a5b480cc81a5b881d1bdd185b60921b60648201526084016109d9565b609681601654611bd0919061377d565b1115611c165760405162461bcd60e51b8152602060048201526015602482015274105b1b081a185d99481899595b8818db185a5b5959605a1b60448201526064016109d9565b60008281526009602052604081208054839290611c3490849061377d565b9091555050601654611c53903390611c4d90600161377d565b83612991565b8060166000828254611c65919061377d565b90915550505050565b6000611c7983612596565b6040805180820190915290546001600160a01b0381168252600160a01b900460a01b6001600160a01b03191660208201529050611cb73384836126b8565b611cd457604051632ce44b5f60e11b815260040160405180910390fd5b611ce185858584866129ac565b5050505050565b611cf061265e565b601654611cff90611eaa61377d565b81611d08610a00565b611d12919061377d565b1115611d605760405162461bcd60e51b815260206004820152601d60248201527f45786365656473206d6178696d756d20746f6b656e20737570706c792e00000060448201526064016109d9565b60005b82518110156109fb57611d8f838281518110611d8157611d816138f0565b602002602001015183612813565b80611d9981613906565b915050611d63565b600260075403611dc35760405162461bcd60e51b81526004016109d990613790565b600260075560185460ff1615611deb5760405162461bcd60e51b81526004016109d9906137c7565b6002601b54600160a01b900460ff166005811115611e0b57611e0b6134e8565b10158015611e3657506004601b54600160a01b900460ff166005811115611e3457611e346134e8565b105b611e525760405162461bcd60e51b81526004016109d99061391f565b600c54611e5f908361383d565b341015611e7e5760405162461bcd60e51b81526004016109d99061385c565b601654611e8d90611eaa61377d565b611e95610a00565b611e9f908461377d565b1115611ebd5760405162461bcd60e51b81526004016109d9906138b9565b600f54336000908152601d6020526040902060020154611ede90849061377d565b1115611efc5760405162461bcd60e51b81526004016109d990613966565b604080513360208201528082019190915260086060820152671cdd185b99185c9960c21b608082015260009060a001604051602081830303815290604052805190602001209050611f4d8183612831565b611f695760405162461bcd60e51b81526004016109d9906139ae565b336000908152601d6020526040812060020180548592906111dd90849061377d565b611f9361265e565b6018805460ff19811660ff90911615179055565b6060611fb28261256a565b611fcf57604051630a14c4b560e41b815260040160405180910390fd5b60145460ff1661206b5760158054611fe69061360c565b80601f01602080910402602001604051908101604052809291908181526020018280546120129061360c565b801561205f5780601f106120345761010080835404028352916020019161205f565b820191906000526020600020905b81548152906001019060200180831161204257829003601f168201915b50505050509050919050565b6017612076836129f8565b604051602001612087929190613a1d565b6040516020818303038152906040529050919050565b6120a561265e565b601854610100900460ff16156120ee5760405162461bcd60e51b815260206004820152600e60248201526d20b63932b0b23c90333937bd32b760911b60448201526064016109d9565b6018805461ff001916610100179055565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61213561265e565b6001600160a01b03811661219a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109d9565b6121a38161293f565b50565b6002600754036121c85760405162461bcd60e51b81526004016109d990613790565b60026007556032811061221d5760405162461bcd60e51b815260206004820152601760248201527f4e6f7420612076616c69642053656e7469656e7420494400000000000000000060448201526064016109d9565b60185460ff16156122405760405162461bcd60e51b81526004016109d9906137c7565b6001601b54600160a01b900460ff166005811115612260576122606134e8565b1015801561228b57506004601b54600160a01b900460ff166005811115612289576122896134e8565b105b6122d25760405162461bcd60e51b81526020600482015260186024820152774e6f7420696e206d656d6265722073616c6520706861736560401b60448201526064016109d9565b601c54604051627eeac760e11b8152336004820152602481018390526000916001600160a01b03169062fdd58e90604401602060405180830381865afa158015612320573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612344919061394d565b1161239d5760405162461bcd60e51b815260206004820152602360248201527f4e6f206d656d6265727368697020746f6b656e7320696e20746869732077616c6044820152621b195d60ea1b60648201526084016109d9565b600d546123aa908361383d565b3410156123c95760405162461bcd60e51b81526004016109d99061385c565b6016546123d890611eaa61377d565b6123e0610a00565b6123ea908461377d565b11156124085760405162461bcd60e51b81526004016109d9906138b9565b600e546000828152601e602052604090206001015461242890849061377d565b11156124885760405162461bcd60e51b815260206004820152602960248201527f576f756c6420657863656564206d617820616c6c6f746d656e7420666f72207460448201526868697320706861736560b81b60648201526084016109d9565b6000818152601e6020526040812060010180548492906124a990849061377d565b909155506124b990503383612813565b50506001600755565b6124ca61265e565b601b54600160a01b900460ff1660058111156124e8576124e86134e8565b60ff168160058111156124fd576124fd6134e8565b60ff161161253d5760405162461bcd60e51b815260206004820152600d60248201526c496e637265617365206f6e6c7960981b60448201526064016109d9565b601b805482919060ff60a01b1916600160a01b836005811115612562576125626134e8565b021790555050565b6000609682111561257d57506001541190565b6096821161258e5750600254101590565b506000919050565b60006125a18261256a565b6125be576040516319086e6360e11b815260040160405180910390fd5b6000828152602081905260409020825b81546001600160a01b03166125f65760001901600081815260208190526040902091506125ce565b5092915050565b60008281526005602052604080822080546001600160a01b0319166001600160a01b038781169182179092558451925186949193909216917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b6008546001600160a01b031633146114755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109d9565b80516000906001600160a01b0385811690821614806126dc57506126dc81866120ff565b806127005750846001600160a01b03166126f585610890565b6001600160a01b0316145b95945050505050565b836001600160a01b031681600001516001600160a01b03161461273e5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03831661276557604051633a954ecd60e21b815260040160405180910390fd5b612771600083836125fd565b6001820161277e8161256a565b156127c157600081815260208190526040902080546001600160a01b03166127bf578251602084015160a01c600160a01b026001600160a01b039091161781555b505b506000828152602081905260408082206001600160a01b0386811680835592519193869392918916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4611ce1565b61282d828260405180602001604052806000815250612b01565b5050565b6000806001848460400151856000015186602001516040516000815260200160405260405161287c949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561289e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166129015760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109d9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161491505092915050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6109fb83838360405180602001604052806000815250612b5d565b6129b885858585612709565b6001600160a01b0384163b151580156129da57506129d885858584612bb9565b155b15611ce1576040516368d2bf6b60e11b815260040160405180910390fd5b606081600003612a1f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a495780612a3381613906565b9150612a429050600a836139ec565b9150612a23565b60008167ffffffffffffffff811115612a6457612a64613094565b6040519080825280601f01601f191660200182016040528015612a8e576020820181803683370190505b5090505b8415612af957612aa360018361376a565b9150612ab0600a86613aa4565b612abb90603061377d565b60f81b818381518110612ad057612ad06138f0565b60200101906001600160f81b031916908160001a905350612af2600a866139ec565b9450612a92565b949350505050565b600154612b0e8484612ca4565b6001600160a01b0384163b156109825760005b83811015611ce157612b3860008683850186612bb9565b612b55576040516368d2bf6b60e11b815260040160405180910390fd5b600101612b21565b612b68848484612dcb565b8160026000828254612b7a919061377d565b90915550506001600160a01b0384163b1561098257612b9c6000858584612bb9565b610982576040516368d2bf6b60e11b815260040160405180910390fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612bee903390899088908890600401613ab8565b6020604051808303816000875af1925050508015612c29575060408051601f3d908101601f19168201909252612c2691810190613af5565b60015b612c87573d808015612c57576040519150601f19603f3d011682016040523d82523d6000602084013e612c5c565b606091505b508051600003612c7f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6001600160a01b038216612cca57604051622e076360e81b815260040160405180910390fd5b80600003612ceb5760405163b562e8dd60e01b815260040160405180910390fd5b60015460005b82811015612dbd577f000000000000000000000000000000000000000000000000000000000000000015612d55577f00000000000000000000000000000000000000000000000000000000000000008181612d4e57612d4e6139d6565b0615612d58565b80155b15612d7b5781810160009081526020819052604090206001600160a01b03851690555b604051828201906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101612cf1565b506001805483019055505050565b6001600160a01b038316612df157604051622e076360e81b815260040160405180910390fd5b80600003612e125760405163b562e8dd60e01b815260040160405180910390fd5b8160005b82811015612ee2577f000000000000000000000000000000000000000000000000000000000000000015612e7a577f00000000000000000000000000000000000000000000000000000000000000008181612e7357612e736139d6565b0615612e7d565b80155b15612ea05781810160009081526020819052604090206001600160a01b03861690555b604051828201906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101612e16565b50610982565b828054828255906000526020600020908101928215612f3d579160200282015b82811115612f3d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612f08565b50612f49929150612f88565b5090565b828054828255906000526020600020908101928215612f3d579160200282015b82811115612f3d578251825591602001919060010190612f6d565b5b80821115612f495760008155600101612f89565b6001600160e01b0319811681146121a357600080fd5b600060208284031215612fc557600080fd5b8135612fd081612f9d565b9392505050565b60005b83811015612ff2578181015183820152602001612fda565b50506000910152565b60008151808452613013816020860160208601612fd7565b601f01601f19169290920160200192915050565b602081526000612fd06020830184612ffb565b60006020828403121561304c57600080fd5b5035919050565b6001600160a01b03811681146121a357600080fd5b6000806040838503121561307b57600080fd5b823561308681613053565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156130d3576130d3613094565b604052919050565b600067ffffffffffffffff8311156130f5576130f5613094565b613108601f8401601f19166020016130aa565b905082815283838301111561311c57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261314457600080fd5b612fd0838335602085016130db565b6000806040838503121561316657600080fd5b823567ffffffffffffffff8082111561317e57600080fd5b61318a86838701613133565b935060208501359150808211156131a057600080fd5b506131ad85828601613133565b9150509250929050565b6000806000606084860312156131cc57600080fd5b83356131d781613053565b925060208401356131e781613053565b929592945050506040919091013590565b60008060006060848603121561320d57600080fd5b505081359360208301359350604090920135919050565b600080828403608081121561323857600080fd5b833592506060601f198201121561324e57600080fd5b506040516060810181811067ffffffffffffffff8211171561327257613272613094565b80604052506020840135815260408401356020820152606084013560ff8116811461329c57600080fd5b6040820152919491935090915050565b6000602082840312156132be57600080fd5b813567ffffffffffffffff8111156132d557600080fd5b612af984828501613133565b6000602082840312156132f357600080fd5b8135612fd081613053565b6000806040838503121561331157600080fd5b823561331c81613053565b9150602083013561332c81613053565b809150509250929050565b600067ffffffffffffffff82111561335157613351613094565b5060051b60200190565b600082601f83011261336c57600080fd5b8135602061338161337c83613337565b6130aa565b82815260059290921b840181019181810190868411156133a057600080fd5b8286015b848110156133c45780356133b781613053565b83529183019183016133a4565b509695505050505050565b600080604083850312156133e257600080fd5b823567ffffffffffffffff808211156133fa57600080fd5b6134068683870161335b565b935060209150818501358181111561341d57600080fd5b85019050601f8101861361343057600080fd5b803561343e61337c82613337565b81815260059190911b8201830190838101908883111561345d57600080fd5b928401925b8284101561347b57833582529284019290840190613462565b80955050505050509250929050565b80151581146121a357600080fd5b600080604083850312156134ab57600080fd5b82356134b681613053565b9150602083013561332c8161348a565b600080604083850312156134d957600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b602081016006831061352057634e487b7160e01b600052602160045260246000fd5b91905290565b6000806000806080858703121561353c57600080fd5b843561354781613053565b9350602085013561355781613053565b925060408501359150606085013567ffffffffffffffff81111561357a57600080fd5b8501601f8101871361358b57600080fd5b61359a878235602084016130db565b91505092959194509250565b600080604083850312156135b957600080fd5b823567ffffffffffffffff8111156135d057600080fd5b6135dc8582860161335b565b95602094909401359450505050565b6000602082840312156135fd57600080fd5b813560068110612fd057600080fd5b600181811c9082168061362057607f821691505b60208210810361364057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156109fb57600081815260208120601f850160051c8101602086101561366d5750805b601f850160051c820191505b8181101561368c57828155600101613679565b505050505050565b815167ffffffffffffffff8111156136ae576136ae613094565b6136c2816136bc845461360c565b84613646565b602080601f8311600181146136f757600084156136df5750858301515b600019600386901b1c1916600185901b17855561368c565b600085815260208120601f198616915b8281101561372657888601518255948401946001909101908401613707565b50858210156137445787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b818103818111156107f8576107f8613754565b808201808211156107f8576107f8613754565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600e908201526d135a5b9d1a5b99c81c185d5cd95960921b604082015260600190565b6020808252602e908201527f43616e2774206d696e74206d6f7265207468616e20313020746f6b656e73207060408201526d32b9103a3930b739b0b1ba34b7b760911b606082015260800190565b600081600019048311821515161561385757613857613754565b500290565b6020808252603a908201527f496e73756666696369656e74205061796d656e743a20416d6f756e74206f662060408201527f45746865722073656e74206973206e6f7420636f72726563742e000000000000606082015260800190565b6020808252601f908201527f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006001820161391857613918613754565b5060010190565b6020808252601490820152734e6f7420696e2070726573616c6520706861736560601b604082015260600190565b60006020828403121561395f57600080fd5b5051919050565b60208082526028908201527f4d696e746564206d617820616c6c6f746d656e7420666f7220746869732073616040820152676c6520706861736560c01b606082015260800190565b6020808252600e908201526d24b73b30b634b21031b7bab837b760911b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b6000826139fb576139fb6139d6565b500490565b600060208284031215613a1257600080fd5b8151612fd08161348a565b6000808454613a2b8161360c565b60018281168015613a435760018114613a5857613a87565b60ff1984168752821515830287019450613a87565b8860005260208060002060005b85811015613a7e5781548a820152908401908201613a65565b50505082870194505b505050508351613a9b818360208801612fd7565b01949350505050565b600082613ab357613ab36139d6565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613aeb90830184612ffb565b9695505050505050565b600060208284031215613b0757600080fd5b8151612fd081612f9d56fea26469706673582212209fcd5413b580d474c9eebfd49794b4c055a5d06b3595e9d3e131efa8418f36aa64736f6c63430008100033697066733a2f2f516d516f42535366385a76765062556656426e624b425a696d39704a766745764a53357a706677436b7032486757000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000001539330800eb03c4da74cdd25c5dad03a7ec36230000000000000000000000000170227514a274826685bf81aed06e421817557200000000000000000000000000000000000000000000000000000000000000174d69726167652047616c6c65727920447265616d65727300000000000000000000000000000000000000000000000000000000000000000000000000000000034d47440000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102725760003560e01c8063715018a61161014f578063b96afaa7116100c1578063d5abeb011161007a578063d5abeb0114610704578063e985e9c51461071a578063f2fde38b1461073a578063f6d1445b1461075a578063f905f1541461076d578063fb3cc6c21461078d57600080fd5b8063b96afaa71461065a578063c204642c14610687578063c29a3025146106a7578063c4ae3168146106ba578063c87b56dd146106cf578063d111515d146106ef57600080fd5b8063a00b43f911610113578063a00b43f914610596578063a22cb465146105b6578063a874258d146105d6578063a945bf80146105f6578063b1c9fe6e1461060c578063b88d4fde1461063a57600080fd5b8063715018a61461051b57806383a9bd80146105305780638da5cb5b146105435780639456fbcc1461056157806395d89b411461058157600080fd5b806349f6471d116101e857806355ea7328116101ac57806355ea73281461047a5780635ef3f776146104905780636352211e146104b0578063636e746b146104d05780636c0360eb146104e657806370a08231146104fb57600080fd5b806349f6471d146103f15780634c261247146104045780634efa8f171461042457806351cff8d91461043a57806351ec8d1e1461045a57600080fd5b806318160ddd1161023a57806318160ddd1461034857806323b872dd1461036b5780632db115441461038b578063406f7a951461039e57806342842e0e146103be57806346c5d449146103de57600080fd5b806301ffc9a71461027757806306fdde03146102ac578063081812fc146102ce578063095ea7b3146103065780631789e2d814610328575b600080fd5b34801561028357600080fd5b50610297610292366004612fb3565b6107ac565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c16107fe565b6040516102a39190613027565b3480156102da57600080fd5b506102ee6102e936600461303a565b610890565b6040516001600160a01b0390911681526020016102a3565b34801561031257600080fd5b50610326610321366004613068565b6108d4565b005b34801561033457600080fd5b50610326610343366004613153565b610988565b34801561035457600080fd5b5061035d610a00565b6040519081526020016102a3565b34801561037757600080fd5b506103266103863660046131b7565b610a23565b61032661039936600461303a565b610a95565b3480156103aa57600080fd5b506103266103b93660046131f8565b610bea565b3480156103ca57600080fd5b506103266103d93660046131b7565b610c87565b6103266103ec36600461303a565b610ca2565b6103266103ff366004613224565b610ff2565b34801561041057600080fd5b5061032661041f3660046132ac565b6111f7565b34801561043057600080fd5b5061035d60165481565b34801561044657600080fd5b506103266104553660046132e1565b61121c565b34801561046657600080fd5b50601c546102ee906001600160a01b031681565b34801561048657600080fd5b5061035d600c5481565b34801561049c57600080fd5b506103266104ab3660046131f8565b6112b3565b3480156104bc57600080fd5b506102ee6104cb36600461303a565b6112c9565b3480156104dc57600080fd5b5061035d600d5481565b3480156104f257600080fd5b506102c161130a565b34801561050757600080fd5b5061035d6105163660046132e1565b611398565b34801561052757600080fd5b50610326611463565b61032661053e366004613224565b611477565b34801561054f57600080fd5b506008546001600160a01b03166102ee565b34801561056d57600080fd5b5061032661057c3660046132fe565b61171a565b34801561058d57600080fd5b506102c1611803565b3480156105a257600080fd5b506103266105b13660046133cf565b611812565b3480156105c257600080fd5b506103266105d1366004613498565b611918565b3480156105e257600080fd5b506103266105f13660046134c6565b6119ad565b34801561060257600080fd5b5061035d600b5481565b34801561061857600080fd5b50601b5461062d90600160a01b900460ff1681565b6040516102a391906134fe565b34801561064657600080fd5b50610326610655366004613526565b611c6e565b34801561066657600080fd5b5061035d61067536600461303a565b60096020526000908152604090205481565b34801561069357600080fd5b506103266106a23660046135a6565b611ce8565b6103266106b5366004613224565b611da1565b3480156106c657600080fd5b50610326611f8b565b3480156106db57600080fd5b506102c16106ea36600461303a565b611fa7565b3480156106fb57600080fd5b5061032661209d565b34801561071057600080fd5b5061035d60135481565b34801561072657600080fd5b506102976107353660046132fe565b6120ff565b34801561074657600080fd5b506103266107553660046132e1565b61212d565b6103266107683660046134c6565b6121a6565b34801561077957600080fd5b506103266107883660046135eb565b6124c2565b34801561079957600080fd5b5060185461029790610100900460ff1681565b60006001600160e01b031982166380ac58cd60e01b14806107dd57506001600160e01b03198216635b5e139f60e01b145b806107f857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461080d9061360c565b80601f01602080910402602001604051908101604052809291908181526020018280546108399061360c565b80156108865780601f1061085b57610100808354040283529160200191610886565b820191906000526020600020905b81548152906001019060200180831161086957829003601f168201915b5050505050905090565b600061089b8261256a565b6108b8576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006108df82612596565b6040805180820190915290546001600160a01b03808216808452600160a01b90920460a01b6001600160a01b03191660208401529192509084168190036109395760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610959575061095781336120ff565b155b15610977576040516367d9dca160e11b815260040160405180910390fd5b6109828484846125fd565b50505050565b61099061265e565b601854610100900460ff16156109e25760405162461bcd60e51b815260206004820152601260248201527126b2ba30b230ba309034b990333937bd32b760711b60448201526064015b60405180910390fd5b60176109ee8382613694565b5060156109fb8282613694565b505050565b60006002546097600154610a14919061376a565b610a1e919061377d565b905090565b6000610a2e82612596565b6040805180820190915290546001600160a01b0381168252600160a01b900460a01b6001600160a01b03191660208201529050610a6c3383836126b8565b610a8957604051632ce44b5f60e11b815260040160405180910390fd5b61098284848484612709565b600260075403610ab75760405162461bcd60e51b81526004016109d990613790565b600260075560185460ff1615610adf5760405162461bcd60e51b81526004016109d9906137c7565b6004601b54600160a01b900460ff166005811115610aff57610aff6134e8565b14610b4c5760405162461bcd60e51b815260206004820152601860248201527f4e6f7420696e207075626c69632073616c65207068617365000000000000000060448201526064016109d9565b600a811115610b6d5760405162461bcd60e51b81526004016109d9906137ef565b600b54610b7a908261383d565b341015610b995760405162461bcd60e51b81526004016109d99061385c565b601654610ba890611eaa61377d565b610bb0610a00565b610bba908361377d565b1115610bd85760405162461bcd60e51b81526004016109d9906138b9565b610be23382612813565b506001600755565b610bf261265e565b600e839055600f829055601081905560005b60115481101561098257600e5460128281548110610c2457610c246138f0565b9060005260206000200154610c39919061383d565b601f600060118481548110610c5057610c506138f0565b60009182526020808320909101546001600160a01b0316835282019290925260400190205580610c7f81613906565b915050610c04565b6109fb83838360405180602001604052806000815250611c6e565b600260075403610cc45760405162461bcd60e51b81526004016109d990613790565b600260075560185460ff1615610cec5760405162461bcd60e51b81526004016109d9906137c7565b600a811115610d0d5760405162461bcd60e51b81526004016109d9906137ef565b6003601b54600160a01b900460ff166005811115610d2d57610d2d6134e8565b10158015610d5857506004601b54600160a01b900460ff166005811115610d5657610d566134e8565b105b610d745760405162461bcd60e51b81526004016109d99061391f565b600c54610d81908261383d565b341015610da05760405162461bcd60e51b81526004016109d99061385c565b601654610daf90611eaa61377d565b610db7610a00565b610dc1908361377d565b1115610ddf5760405162461bcd60e51b81526004016109d9906138b9565b6019546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4c919061394d565b1180610ec25750601a546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec0919061394d565b115b80610f375750601b546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f35919061394d565b115b80610fb257506018546040516370a0823160e01b81523360048201526000916201000090046001600160a01b0316906370a0823190602401602060405180830381865afa158015610f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb0919061394d565b115b610bd85760405162461bcd60e51b8152602060048201526011602482015270139bc81351c81d1bdad95b9cc81a195b19607a1b60448201526064016109d9565b6002600754036110145760405162461bcd60e51b81526004016109d990613790565b600260075560185460ff161561103c5760405162461bcd60e51b81526004016109d9906137c7565b6002601b54600160a01b900460ff16600581111561105c5761105c6134e8565b1015801561108757506004601b54600160a01b900460ff166005811115611085576110856134e8565b105b6110a35760405162461bcd60e51b81526004016109d99061391f565b600b546110b0908361383d565b3410156110cf5760405162461bcd60e51b81526004016109d99061385c565b6016546110de90611eaa61377d565b6110e6610a00565b6110f0908461377d565b111561110e5760405162461bcd60e51b81526004016109d9906138b9565b601054336000908152601d602052604090206003015461112f90849061377d565b111561114d5760405162461bcd60e51b81526004016109d990613966565b604080513360208201528082019190915260096060820152687365636f6e6461727960b81b608082015260009060a00160405160208183030381529060405280519060200120905061119f8183612831565b6111bb5760405162461bcd60e51b81526004016109d9906139ae565b336000908152601d6020526040812060030180548592906111dd90849061377d565b909155506111ed90503384612813565b5050600160075550565b6111ff61265e565b601761120b8282613694565b50506014805460ff19166001179055565b61122461265e565b6000600a61123347600961383d565b61123d91906139ec565b9050600061124c600a476139ec565b604051909150339083156108fc029084906000818181858888f1935050505015801561127c573d6000803e3d6000fd5b506040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015610982573d6000803e3d6000fd5b6112bb61265e565b600b92909255600c55600d55565b60006112d48261256a565b6112f157604051636f96cda160e11b815260040160405180910390fd5b6112fa82612596565b546001600160a01b031692915050565b601780546113179061360c565b80601f01602080910402602001604051908101604052809291908181526020018280546113439061360c565b80156113905780601f1061136557610100808354040283529160200191611390565b820191906000526020600020905b81548152906001019060200180831161137357829003601f168201915b505050505081565b60006001600160a01b0382166113c1576040516323d3ad8160e21b815260040160405180910390fd5b60006002546113ce610a00565b6113d990609661377d565b6113e3919061376a565b905060008060005b838111611459576113fb8161256a565b15611449576000818152602081905260409020546001600160a01b03168015611422578092505b866001600160a01b0316836001600160a01b0316036114475761144484613906565b93505b505b61145281613906565b90506113eb565b5090949350505050565b61146b61265e565b611475600061293f565b565b6002600754036114995760405162461bcd60e51b81526004016109d990613790565b600260075560185460ff16156114c15760405162461bcd60e51b81526004016109d9906137c7565b600d546114ce908361383d565b34101561151d5760405162461bcd60e51b815260206004820181905260248201527f4d7573742073656e64206d696e696d756d2076616c756520746f206d696e742160448201526064016109d9565b6001601b54600160a01b900460ff16600581111561153d5761153d6134e8565b1015801561156857506004601b54600160a01b900460ff166005811115611566576115666134e8565b105b6115af5760405162461bcd60e51b81526020600482015260186024820152774e6f7420696e206d656d6265722073616c6520706861736560401b60448201526064016109d9565b6016546115be90611eaa61377d565b6115c6610a00565b6115d0908461377d565b11156115ee5760405162461bcd60e51b81526004016109d9906138b9565b6040805133602082015280820191909152600660608201526536b2b6b132b960d11b608082015260009060a00160405160208183030381529060405280519060200120905061163d8183612831565b6116595760405162461bcd60e51b81526004016109d9906139ae565b336000908152601f6020526040812054908190036116765750600e545b336000908152601f6020526040902060010154819061169690869061377d565b11156116dd5760405162461bcd60e51b815260206004820152601660248201527515dbdd5b1908195e18d9595908185b1b1bdd1b595b9d60521b60448201526064016109d9565b336000908152601f6020526040812060010180548692906116ff90849061377d565b9091555061170f90503385612813565b505060016007555050565b61172261265e565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015611770573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611794919061394d565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156117df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fb9190613a00565b60606004805461080d9061360c565b61181a61265e565b805182511461186b5760405162461bcd60e51b815260206004820152601960248201527f4172726179206c656e6774687320646f6e2774206d617463680000000000000060448201526064016109d9565b815161187e906011906020850190612ee8565b508051611892906012906020840190612f4d565b5060005b82518110156109fb57600e54601282815481106118b5576118b56138f0565b90600052602060002001546118ca919061383d565b601f6000601184815481106118e1576118e16138f0565b60009182526020808320909101546001600160a01b031683528201929092526040019020558061191081613906565b915050611896565b336001600160a01b038316036119415760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6001601b54600160a01b900460ff1660058111156119cd576119cd6134e8565b1015611a0f5760405162461bcd60e51b815260206004820152601160248201527021b630b4b6b4b733903737ba1037b832b760791b60448201526064016109d9565b60328210611a6f5760405162461bcd60e51b815260206004820152602760248201527f4d75737420626520612053656e7469656e74204d656d626572736869702049446044820152662028302d34392960c81b60648201526084016109d9565b601c54604051627eeac760e11b8152336004820152602481018490526001600160a01b039091169062fdd58e90604401602060405180830381865afa158015611abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae0919061394d565b600114611b3e5760405162461bcd60e51b815260206004820152602660248201527f57616c6c657420646f6573206e6f74206f776e2074686973206d656d626572736044820152651a1a5c08125160d21b60648201526084016109d9565b600a54600083815260096020526040902054611b5b90839061377d565b1115611bc05760405162461bcd60e51b815260206004820152602e60248201527f53656e7469656e74204d656d62657273686970732063616e206f6e6c7920636c60448201526d185a5b480cc81a5b881d1bdd185b60921b60648201526084016109d9565b609681601654611bd0919061377d565b1115611c165760405162461bcd60e51b8152602060048201526015602482015274105b1b081a185d99481899595b8818db185a5b5959605a1b60448201526064016109d9565b60008281526009602052604081208054839290611c3490849061377d565b9091555050601654611c53903390611c4d90600161377d565b83612991565b8060166000828254611c65919061377d565b90915550505050565b6000611c7983612596565b6040805180820190915290546001600160a01b0381168252600160a01b900460a01b6001600160a01b03191660208201529050611cb73384836126b8565b611cd457604051632ce44b5f60e11b815260040160405180910390fd5b611ce185858584866129ac565b5050505050565b611cf061265e565b601654611cff90611eaa61377d565b81611d08610a00565b611d12919061377d565b1115611d605760405162461bcd60e51b815260206004820152601d60248201527f45786365656473206d6178696d756d20746f6b656e20737570706c792e00000060448201526064016109d9565b60005b82518110156109fb57611d8f838281518110611d8157611d816138f0565b602002602001015183612813565b80611d9981613906565b915050611d63565b600260075403611dc35760405162461bcd60e51b81526004016109d990613790565b600260075560185460ff1615611deb5760405162461bcd60e51b81526004016109d9906137c7565b6002601b54600160a01b900460ff166005811115611e0b57611e0b6134e8565b10158015611e3657506004601b54600160a01b900460ff166005811115611e3457611e346134e8565b105b611e525760405162461bcd60e51b81526004016109d99061391f565b600c54611e5f908361383d565b341015611e7e5760405162461bcd60e51b81526004016109d99061385c565b601654611e8d90611eaa61377d565b611e95610a00565b611e9f908461377d565b1115611ebd5760405162461bcd60e51b81526004016109d9906138b9565b600f54336000908152601d6020526040902060020154611ede90849061377d565b1115611efc5760405162461bcd60e51b81526004016109d990613966565b604080513360208201528082019190915260086060820152671cdd185b99185c9960c21b608082015260009060a001604051602081830303815290604052805190602001209050611f4d8183612831565b611f695760405162461bcd60e51b81526004016109d9906139ae565b336000908152601d6020526040812060020180548592906111dd90849061377d565b611f9361265e565b6018805460ff19811660ff90911615179055565b6060611fb28261256a565b611fcf57604051630a14c4b560e41b815260040160405180910390fd5b60145460ff1661206b5760158054611fe69061360c565b80601f01602080910402602001604051908101604052809291908181526020018280546120129061360c565b801561205f5780601f106120345761010080835404028352916020019161205f565b820191906000526020600020905b81548152906001019060200180831161204257829003601f168201915b50505050509050919050565b6017612076836129f8565b604051602001612087929190613a1d565b6040516020818303038152906040529050919050565b6120a561265e565b601854610100900460ff16156120ee5760405162461bcd60e51b815260206004820152600e60248201526d20b63932b0b23c90333937bd32b760911b60448201526064016109d9565b6018805461ff001916610100179055565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61213561265e565b6001600160a01b03811661219a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109d9565b6121a38161293f565b50565b6002600754036121c85760405162461bcd60e51b81526004016109d990613790565b60026007556032811061221d5760405162461bcd60e51b815260206004820152601760248201527f4e6f7420612076616c69642053656e7469656e7420494400000000000000000060448201526064016109d9565b60185460ff16156122405760405162461bcd60e51b81526004016109d9906137c7565b6001601b54600160a01b900460ff166005811115612260576122606134e8565b1015801561228b57506004601b54600160a01b900460ff166005811115612289576122896134e8565b105b6122d25760405162461bcd60e51b81526020600482015260186024820152774e6f7420696e206d656d6265722073616c6520706861736560401b60448201526064016109d9565b601c54604051627eeac760e11b8152336004820152602481018390526000916001600160a01b03169062fdd58e90604401602060405180830381865afa158015612320573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612344919061394d565b1161239d5760405162461bcd60e51b815260206004820152602360248201527f4e6f206d656d6265727368697020746f6b656e7320696e20746869732077616c6044820152621b195d60ea1b60648201526084016109d9565b600d546123aa908361383d565b3410156123c95760405162461bcd60e51b81526004016109d99061385c565b6016546123d890611eaa61377d565b6123e0610a00565b6123ea908461377d565b11156124085760405162461bcd60e51b81526004016109d9906138b9565b600e546000828152601e602052604090206001015461242890849061377d565b11156124885760405162461bcd60e51b815260206004820152602960248201527f576f756c6420657863656564206d617820616c6c6f746d656e7420666f72207460448201526868697320706861736560b81b60648201526084016109d9565b6000818152601e6020526040812060010180548492906124a990849061377d565b909155506124b990503383612813565b50506001600755565b6124ca61265e565b601b54600160a01b900460ff1660058111156124e8576124e86134e8565b60ff168160058111156124fd576124fd6134e8565b60ff161161253d5760405162461bcd60e51b815260206004820152600d60248201526c496e637265617365206f6e6c7960981b60448201526064016109d9565b601b805482919060ff60a01b1916600160a01b836005811115612562576125626134e8565b021790555050565b6000609682111561257d57506001541190565b6096821161258e5750600254101590565b506000919050565b60006125a18261256a565b6125be576040516319086e6360e11b815260040160405180910390fd5b6000828152602081905260409020825b81546001600160a01b03166125f65760001901600081815260208190526040902091506125ce565b5092915050565b60008281526005602052604080822080546001600160a01b0319166001600160a01b038781169182179092558451925186949193909216917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b6008546001600160a01b031633146114755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109d9565b80516000906001600160a01b0385811690821614806126dc57506126dc81866120ff565b806127005750846001600160a01b03166126f585610890565b6001600160a01b0316145b95945050505050565b836001600160a01b031681600001516001600160a01b03161461273e5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03831661276557604051633a954ecd60e21b815260040160405180910390fd5b612771600083836125fd565b6001820161277e8161256a565b156127c157600081815260208190526040902080546001600160a01b03166127bf578251602084015160a01c600160a01b026001600160a01b039091161781555b505b506000828152602081905260408082206001600160a01b0386811680835592519193869392918916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4611ce1565b61282d828260405180602001604052806000815250612b01565b5050565b6000806001848460400151856000015186602001516040516000815260200160405260405161287c949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561289e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166129015760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109d9565b7f0000000000000000000000001539330800eb03c4da74cdd25c5dad03a7ec36236001600160a01b0316816001600160a01b03161491505092915050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6109fb83838360405180602001604052806000815250612b5d565b6129b885858585612709565b6001600160a01b0384163b151580156129da57506129d885858584612bb9565b155b15611ce1576040516368d2bf6b60e11b815260040160405180910390fd5b606081600003612a1f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a495780612a3381613906565b9150612a429050600a836139ec565b9150612a23565b60008167ffffffffffffffff811115612a6457612a64613094565b6040519080825280601f01601f191660200182016040528015612a8e576020820181803683370190505b5090505b8415612af957612aa360018361376a565b9150612ab0600a86613aa4565b612abb90603061377d565b60f81b818381518110612ad057612ad06138f0565b60200101906001600160f81b031916908160001a905350612af2600a866139ec565b9450612a92565b949350505050565b600154612b0e8484612ca4565b6001600160a01b0384163b156109825760005b83811015611ce157612b3860008683850186612bb9565b612b55576040516368d2bf6b60e11b815260040160405180910390fd5b600101612b21565b612b68848484612dcb565b8160026000828254612b7a919061377d565b90915550506001600160a01b0384163b1561098257612b9c6000858584612bb9565b610982576040516368d2bf6b60e11b815260040160405180910390fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612bee903390899088908890600401613ab8565b6020604051808303816000875af1925050508015612c29575060408051601f3d908101601f19168201909252612c2691810190613af5565b60015b612c87573d808015612c57576040519150601f19603f3d011682016040523d82523d6000602084013e612c5c565b606091505b508051600003612c7f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6001600160a01b038216612cca57604051622e076360e81b815260040160405180910390fd5b80600003612ceb5760405163b562e8dd60e01b815260040160405180910390fd5b60015460005b82811015612dbd577f000000000000000000000000000000000000000000000000000000000000000015612d55577f00000000000000000000000000000000000000000000000000000000000000008181612d4e57612d4e6139d6565b0615612d58565b80155b15612d7b5781810160009081526020819052604090206001600160a01b03851690555b604051828201906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101612cf1565b506001805483019055505050565b6001600160a01b038316612df157604051622e076360e81b815260040160405180910390fd5b80600003612e125760405163b562e8dd60e01b815260040160405180910390fd5b8160005b82811015612ee2577f000000000000000000000000000000000000000000000000000000000000000015612e7a577f00000000000000000000000000000000000000000000000000000000000000008181612e7357612e736139d6565b0615612e7d565b80155b15612ea05781810160009081526020819052604090206001600160a01b03861690555b604051828201906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101612e16565b50610982565b828054828255906000526020600020908101928215612f3d579160200282015b82811115612f3d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612f08565b50612f49929150612f88565b5090565b828054828255906000526020600020908101928215612f3d579160200282015b82811115612f3d578251825591602001919060010190612f6d565b5b80821115612f495760008155600101612f89565b6001600160e01b0319811681146121a357600080fd5b600060208284031215612fc557600080fd5b8135612fd081612f9d565b9392505050565b60005b83811015612ff2578181015183820152602001612fda565b50506000910152565b60008151808452613013816020860160208601612fd7565b601f01601f19169290920160200192915050565b602081526000612fd06020830184612ffb565b60006020828403121561304c57600080fd5b5035919050565b6001600160a01b03811681146121a357600080fd5b6000806040838503121561307b57600080fd5b823561308681613053565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156130d3576130d3613094565b604052919050565b600067ffffffffffffffff8311156130f5576130f5613094565b613108601f8401601f19166020016130aa565b905082815283838301111561311c57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261314457600080fd5b612fd0838335602085016130db565b6000806040838503121561316657600080fd5b823567ffffffffffffffff8082111561317e57600080fd5b61318a86838701613133565b935060208501359150808211156131a057600080fd5b506131ad85828601613133565b9150509250929050565b6000806000606084860312156131cc57600080fd5b83356131d781613053565b925060208401356131e781613053565b929592945050506040919091013590565b60008060006060848603121561320d57600080fd5b505081359360208301359350604090920135919050565b600080828403608081121561323857600080fd5b833592506060601f198201121561324e57600080fd5b506040516060810181811067ffffffffffffffff8211171561327257613272613094565b80604052506020840135815260408401356020820152606084013560ff8116811461329c57600080fd5b6040820152919491935090915050565b6000602082840312156132be57600080fd5b813567ffffffffffffffff8111156132d557600080fd5b612af984828501613133565b6000602082840312156132f357600080fd5b8135612fd081613053565b6000806040838503121561331157600080fd5b823561331c81613053565b9150602083013561332c81613053565b809150509250929050565b600067ffffffffffffffff82111561335157613351613094565b5060051b60200190565b600082601f83011261336c57600080fd5b8135602061338161337c83613337565b6130aa565b82815260059290921b840181019181810190868411156133a057600080fd5b8286015b848110156133c45780356133b781613053565b83529183019183016133a4565b509695505050505050565b600080604083850312156133e257600080fd5b823567ffffffffffffffff808211156133fa57600080fd5b6134068683870161335b565b935060209150818501358181111561341d57600080fd5b85019050601f8101861361343057600080fd5b803561343e61337c82613337565b81815260059190911b8201830190838101908883111561345d57600080fd5b928401925b8284101561347b57833582529284019290840190613462565b80955050505050509250929050565b80151581146121a357600080fd5b600080604083850312156134ab57600080fd5b82356134b681613053565b9150602083013561332c8161348a565b600080604083850312156134d957600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b602081016006831061352057634e487b7160e01b600052602160045260246000fd5b91905290565b6000806000806080858703121561353c57600080fd5b843561354781613053565b9350602085013561355781613053565b925060408501359150606085013567ffffffffffffffff81111561357a57600080fd5b8501601f8101871361358b57600080fd5b61359a878235602084016130db565b91505092959194509250565b600080604083850312156135b957600080fd5b823567ffffffffffffffff8111156135d057600080fd5b6135dc8582860161335b565b95602094909401359450505050565b6000602082840312156135fd57600080fd5b813560068110612fd057600080fd5b600181811c9082168061362057607f821691505b60208210810361364057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156109fb57600081815260208120601f850160051c8101602086101561366d5750805b601f850160051c820191505b8181101561368c57828155600101613679565b505050505050565b815167ffffffffffffffff8111156136ae576136ae613094565b6136c2816136bc845461360c565b84613646565b602080601f8311600181146136f757600084156136df5750858301515b600019600386901b1c1916600185901b17855561368c565b600085815260208120601f198616915b8281101561372657888601518255948401946001909101908401613707565b50858210156137445787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b818103818111156107f8576107f8613754565b808201808211156107f8576107f8613754565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600e908201526d135a5b9d1a5b99c81c185d5cd95960921b604082015260600190565b6020808252602e908201527f43616e2774206d696e74206d6f7265207468616e20313020746f6b656e73207060408201526d32b9103a3930b739b0b1ba34b7b760911b606082015260800190565b600081600019048311821515161561385757613857613754565b500290565b6020808252603a908201527f496e73756666696369656e74205061796d656e743a20416d6f756e74206f662060408201527f45746865722073656e74206973206e6f7420636f72726563742e000000000000606082015260800190565b6020808252601f908201527f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006001820161391857613918613754565b5060010190565b6020808252601490820152734e6f7420696e2070726573616c6520706861736560601b604082015260600190565b60006020828403121561395f57600080fd5b5051919050565b60208082526028908201527f4d696e746564206d617820616c6c6f746d656e7420666f7220746869732073616040820152676c6520706861736560c01b606082015260800190565b6020808252600e908201526d24b73b30b634b21031b7bab837b760911b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b6000826139fb576139fb6139d6565b500490565b600060208284031215613a1257600080fd5b8151612fd08161348a565b6000808454613a2b8161360c565b60018281168015613a435760018114613a5857613a87565b60ff1984168752821515830287019450613a87565b8860005260208060002060005b85811015613a7e5781548a820152908401908201613a65565b50505082870194505b505050508351613a9b818360208801612fd7565b01949350505050565b600082613ab357613ab36139d6565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613aeb90830184612ffb565b9695505050505050565b600060208284031215613b0757600080fd5b8151612fd081612f9d56fea26469706673582212209fcd5413b580d474c9eebfd49794b4c055a5d06b3595e9d3e131efa8418f36aa64736f6c63430008100033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000001539330800eb03c4da74cdd25c5dad03a7ec36230000000000000000000000000170227514a274826685bf81aed06e421817557200000000000000000000000000000000000000000000000000000000000000174d69726167652047616c6c65727920447265616d65727300000000000000000000000000000000000000000000000000000000000000000000000000000000034d47440000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Mirage Gallery Dreamers
Arg [1] : symbol (string): MGD
Arg [2] : adminSigner (address): 0x1539330800EB03c4dA74CDd25C5DaD03A7Ec3623
Arg [3] : membershipAddress (address): 0x0170227514A274826685BF81AED06e4218175572

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000001539330800eb03c4da74cdd25c5dad03a7ec3623
Arg [3] : 0000000000000000000000000170227514a274826685bf81aed06e4218175572
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [5] : 4d69726167652047616c6c65727920447265616d657273000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 4d47440000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

70067:11429:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55198:281;;;;;;;;;;-1:-1:-1;55198:281:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;55198:281:0;;;;;;;;55485:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;57616:202::-;;;;;;;;;;-1:-1:-1;57616:202:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;57616:202:0;1533:203:1;57221:389:0;;;;;;;;;;-1:-1:-1;57221:389:0;;;;;:::i;:::-;;:::i;:::-;;80828:229;;;;;;;;;;-1:-1:-1;80828:229:0;;;;;:::i;:::-;;:::i;55075:117::-;;;;;;;;;;;;;:::i;:::-;;;3942:25:1;;;3930:2;3915:18;55075:117:0;3796:177:1;58267:314:0;;;;;;;;;;-1:-1:-1;58267:314:0;;;;;:::i;:::-;;:::i;78239:556::-;;;;;;:::i;:::-;;:::i;72786:372::-;;;;;;;;;;-1:-1:-1;72786:372:0;;;;;:::i;:::-;;:::i;58587:165::-;;;;;;;;;;-1:-1:-1;58587:165:0;;;;;:::i;:::-;;:::i;77442:791::-;;;;;;:::i;:::-;;:::i;76598:838::-;;;;;;:::i;:::-;;:::i;80296:106::-;;;;;;;;;;-1:-1:-1;80296:106:0;;;;;:::i;:::-;;:::i;70752:27::-;;;;;;;;;;;;;;;;81063:291;;;;;;;;;;-1:-1:-1;81063:291:0;;;;;:::i;:::-;;:::i;71532:41::-;;;;;;;;;;-1:-1:-1;71532:41:0;;;;-1:-1:-1;;;;;71532:41:0;;;70314:39;;;;;;;;;;;;;;;;73164:219;;;;;;;;;;-1:-1:-1;73164:219:0;;;;;:::i;:::-;;:::i;57021:194::-;;;;;;;;;;-1:-1:-1;57021:194:0;;;;;:::i;:::-;;:::i;70358:39::-;;;;;;;;;;;;;;;;70786:21;;;;;;;;;;;;;:::i;56092:512::-;;;;;;;;;;-1:-1:-1;56092:512:0;;;;;:::i;:::-;;:::i;22906:103::-;;;;;;;;;;;;;:::i;74822:912::-;;;;;;:::i;:::-;;:::i;22258:87::-;;;;;;;;;;-1:-1:-1;22331:6:0;;-1:-1:-1;;;;;22331:6:0;22258:87;;81360:133;;;;;;;;;;-1:-1:-1;81360:133:0;;;;;:::i;:::-;;:::i;55585:98::-;;;;;;;;;;;;;:::i;74351:465::-;;;;;;;;;;-1:-1:-1;74351:465:0;;;;;:::i;:::-;;:::i;57824:273::-;;;;;;;;;;-1:-1:-1;57824:273:0;;;;;:::i;:::-;;:::i;79116:720::-;;;;;;;;;;-1:-1:-1;79116:720:0;;;;;:::i;:::-;;:::i;70270:39::-;;;;;;;;;;;;;;;;71034:43;;;;;;;;;;-1:-1:-1;71034:43:0;;;;-1:-1:-1;;;71034:43:0;;;;;;;;;;;;;:::i;58758:354::-;;;;;;;;;;-1:-1:-1;58758:354:0;;;;;:::i;:::-;;:::i;70170:50::-;;;;;;;;;;-1:-1:-1;70170:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;79842:312;;;;;;;;;;-1:-1:-1;79842:312:0;;;;;:::i;:::-;;:::i;75741:851::-;;;;;;:::i;:::-;;:::i;73389:71::-;;;;;;;;;;;;;:::i;80518:304::-;;;;;;;;;;-1:-1:-1;80518:304:0;;;;;:::i;:::-;;:::i;80160:130::-;;;;;;;;;;;;;:::i;70595:31::-;;;;;;;;;;;;;;;;58103:158;;;;;;;;;;-1:-1:-1;58103:158:0;;;;;:::i;:::-;;:::i;23164:201::-;;;;;;;;;;-1:-1:-1;23164:201:0;;;;;:::i;:::-;;:::i;73466:879::-;;;;;;:::i;:::-;;:::i;72625:155::-;;;;;;;;;;-1:-1:-1;72625:155:0;;;;;:::i;:::-;;:::i;70840:26::-;;;;;;;;;;-1:-1:-1;70840:26:0;;;;;;;;;;;55198:281;55300:4;-1:-1:-1;;;;;;55327:40:0;;-1:-1:-1;;;55327:40:0;;:99;;-1:-1:-1;;;;;;;55378:48:0;;-1:-1:-1;;;55378:48:0;55327:99;:146;;;-1:-1:-1;;;;;;;;;;47944:40:0;;;55437:36;55313:160;55198:281;-1:-1:-1;;55198:281:0:o;55485:94::-;55539:13;55568:5;55561:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55485:94;:::o;57616:202::-;57692:7;57713:16;57721:7;57713;:16::i;:::-;57708:64;;57738:34;;-1:-1:-1;;;57738:34:0;;;;;;;;;;;57708:64;-1:-1:-1;57788:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;57788:24:0;;57616:202::o;57221:389::-;57298:22;57323:19;57334:7;57323:10;:19::i;:::-;57298:44;;;;;;;;;;;-1:-1:-1;;;;;57298:44:0;;;;;;-1:-1:-1;;;57298:44:0;;;;;-1:-1:-1;;;;;;57298:44:0;;;;;;;-1:-1:-1;57298:44:0;57387:11;;;;;57383:48;;57407:24;;-1:-1:-1;;;57407:24:0;;;;;;;;;;;57383:48;20889:10;-1:-1:-1;;;;;57444:21:0;;;;;;:63;;-1:-1:-1;57470:37:0;57487:5;20889:10;58103:158;:::i;57470:37::-;57469:38;57444:63;57440:128;;;57525:35;;-1:-1:-1;;;57525:35:0;;;;;;;;;;;57440:128;57576:28;57585:2;57589:7;57598:5;57576:8;:28::i;:::-;57291:319;;57221:389;;:::o;80828:229::-;22144:13;:11;:13::i;:::-;80943:14:::1;::::0;::::1;::::0;::::1;;;80942:15;80934:46;;;::::0;-1:-1:-1;;;80934:46:0;;12584:2:1;80934:46:0::1;::::0;::::1;12566:21:1::0;12623:2;12603:18;;;12596:30;-1:-1:-1;;;12642:18:1;;;12635:48;12700:18;;80934:46:0::1;;;;;;;;;80989:7;:23;80999:13:::0;80989:7;:23:::1;:::i;:::-;-1:-1:-1::0;81021:13:0::1;:30;81037:14:::0;81021:13;:30:::1;:::i;:::-;;80828:229:::0;;:::o;55075:117::-;55127:7;55172:13;;55166:3;55151:12;;:18;;;;:::i;:::-;:34;;;;:::i;:::-;55143:43;;55075:117;:::o;58267:314::-;58383:22;58408:19;58419:7;58408:10;:19::i;:::-;58383:44;;;;;;;;;;;-1:-1:-1;;;;;58383:44:0;;;;-1:-1:-1;;;58383:44:0;;;;-1:-1:-1;;;;;;58383:44:0;;;;;;-1:-1:-1;58439:48:0;20889:10;58472:7;58481:5;58439:18;:48::i;:::-;58434:97;;58496:35;;-1:-1:-1;;;58496:35:0;;;;;;;;;;;58434:97;58540:35;58550:4;58556:2;58560:7;58569:5;58540:9;:35::i;78239:556::-;7056:1;7654:7;;:19;7646:63;;;;-1:-1:-1;;;7646:63:0;;;;;;;:::i;:::-;7056:1;7787:7;:18;78329:6:::1;::::0;::::1;;78328:7;78320:34;;;;-1:-1:-1::0;;;78320:34:0::1;;;;;;;:::i;:::-;78380:20;78371:5;::::0;-1:-1:-1;;;78371:5:0;::::1;;;:29;::::0;::::1;;;;;;:::i;:::-;;78363:66;;;::::0;-1:-1:-1;;;78363:66:0;;16233:2:1;78363:66:0::1;::::0;::::1;16215:21:1::0;16272:2;16252:18;;;16245:30;16311:26;16291:18;;;16284:54;16355:18;;78363:66:0::1;16031:348:1::0;78363:66:0::1;78464:2;78446:14;:20;;78438:79;;;;-1:-1:-1::0;;;78438:79:0::1;;;;;;;:::i;:::-;78564:11;::::0;78547:28:::1;::::0;:14;:28:::1;:::i;:::-;78534:9;:41;;78526:112;;;;-1:-1:-1::0;;;78526:112:0::1;;;;;;;:::i;:::-;78696:12;::::0;78689:19:::1;::::0;:4:::1;:19;:::i;:::-;78672:13;:11;:13::i;:::-;78655:30;::::0;:14;:30:::1;:::i;:::-;:53;;78647:97;;;;-1:-1:-1::0;;;78647:97:0::1;;;;;;;:::i;:::-;78753:36;78763:10;78774:14;78753:9;:36::i;:::-;-1:-1:-1::0;7012:1:0;7966:7;:22;78239:556::o;72786:372::-;22144:13;:11;:13::i;:::-;72899::::1;:26:::0;;;72934:13:::1;:26:::0;;;72969:14:::1;:28:::0;;;-1:-1:-1;73006:147:0::1;73026:15;:22:::0;73022:26;::::1;73006:147;;;73130:13;;73112:12;73125:1;73112:15;;;;;;;;:::i;:::-;;;;;;;;;:31;;;;:::i;:::-;73068:13;:33;73082:15;73098:1;73082:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;73082:18:0::1;73068:33:::0;;;::::1;::::0;;;;;;;;:75;73050:3;::::1;::::0;::::1;:::i;:::-;;;;73006:147;;58587:165:::0;58707:39;58724:4;58730:2;58734:7;58707:39;;;;;;;;;;;;:16;:39::i;77442:791::-;7056:1;7654:7;;:19;7646:63;;;;-1:-1:-1;;;7646:63:0;;;;;;;:::i;:::-;7056:1;7787:7;:18;77539:6:::1;::::0;::::1;;77538:7;77530:34;;;;-1:-1:-1::0;;;77530:34:0::1;;;;;;;:::i;:::-;77599:2;77581:14;:20;;77573:79;;;;-1:-1:-1::0;;;77573:79:0::1;;;;;;;:::i;:::-;77678:18;77669:5;::::0;-1:-1:-1;;;77669:5:0;::::1;;;:27;::::0;::::1;;;;;;:::i;:::-;;;:59;;;;-1:-1:-1::0;77708:20:0::1;77700:5;::::0;-1:-1:-1;;;77700:5:0;::::1;;;:28;::::0;::::1;;;;;;:::i;:::-;;77669:59;77661:92;;;;-1:-1:-1::0;;;77661:92:0::1;;;;;;;:::i;:::-;77800:11;::::0;77783:28:::1;::::0;:14;:28:::1;:::i;:::-;77770:9;:41;;77762:112;;;;-1:-1:-1::0;;;77762:112:0::1;;;;;;;:::i;:::-;77932:12;::::0;77925:19:::1;::::0;:4:::1;:19;:::i;:::-;77908:13;:11;:13::i;:::-;77891:30;::::0;:14;:30:::1;:::i;:::-;:53;;77883:97;;;;-1:-1:-1::0;;;77883:97:0::1;;;;;;;:::i;:::-;77997:12;::::0;:34:::1;::::0;-1:-1:-1;;;77997:34:0;;78020:10:::1;77997:34;::::0;::::1;1679:51:1::0;78034:1:0::1;::::0;-1:-1:-1;;;;;77997:12:0::1;::::0;:22:::1;::::0;1652:18:1;;77997:34:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;:86;;;-1:-1:-1::0;78039:18:0::1;::::0;:40:::1;::::0;-1:-1:-1;;;78039:40:0;;78068:10:::1;78039:40;::::0;::::1;1679:51:1::0;78082:1:0::1;::::0;-1:-1:-1;;;;;78039:18:0::1;::::0;:28:::1;::::0;1652:18:1;;78039:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;77997:86;:126;;;-1:-1:-1::0;78087:10:0::1;::::0;:32:::1;::::0;-1:-1:-1;;;78087:32:0;;78108:10:::1;78087:32;::::0;::::1;1679:51:1::0;78122:1:0::1;::::0;-1:-1:-1;;;;;78087:10:0::1;::::0;:20:::1;::::0;1652:18:1;;78087:32:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;77997:126;:163;;;-1:-1:-1::0;78127:7:0::1;::::0;:29:::1;::::0;-1:-1:-1;;;78127:29:0;;78145:10:::1;78127:29;::::0;::::1;1679:51:1::0;78159:1:0::1;::::0;78127:7;;::::1;-1:-1:-1::0;;;;;78127:7:0::1;::::0;:17:::1;::::0;1652:18:1;;78127:29:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;77997:163;77989:193;;;::::0;-1:-1:-1;;;77989:193:0;;18771:2:1;77989:193:0::1;::::0;::::1;18753:21:1::0;18810:2;18790:18;;;18783:30;-1:-1:-1;;;18829:18:1;;;18822:47;18886:18;;77989:193:0::1;18569:341:1::0;76598:838:0;7056:1;7654:7;;:19;7646:63;;;;-1:-1:-1;;;7646:63:0;;;;;;;:::i;:::-;7056:1;7787:7;:18;76711:6:::1;::::0;::::1;;76710:7;76702:34;;;;-1:-1:-1::0;;;76702:34:0::1;;;;;;;:::i;:::-;76762:17;76753:5;::::0;-1:-1:-1;;;76753:5:0;::::1;;;:26;::::0;::::1;;;;;;:::i;:::-;;;:58;;;;-1:-1:-1::0;76791:20:0::1;76783:5;::::0;-1:-1:-1;;;76783:5:0;::::1;;;:28;::::0;::::1;;;;;;:::i;:::-;;76753:58;76745:91;;;;-1:-1:-1::0;;;76745:91:0::1;;;;;;;:::i;:::-;76883:11;::::0;76866:28:::1;::::0;:14;:28:::1;:::i;:::-;76853:9;:41;;76845:112;;;;-1:-1:-1::0;;;76845:112:0::1;;;;;;;:::i;:::-;77015:12;::::0;77008:19:::1;::::0;:4:::1;:19;:::i;:::-;76991:13;:11;:13::i;:::-;76974:30;::::0;:14;:30:::1;:::i;:::-;:53;;76966:97;;;;-1:-1:-1::0;;;76966:97:0::1;;;;;;;:::i;:::-;77130:14;::::0;77090:10:::1;77080:21;::::0;;;:9:::1;:21;::::0;;;;:29:::1;;::::0;:46:::1;::::0;77112:14;;77080:46:::1;:::i;:::-;:64;;77072:117;;;;-1:-1:-1::0;;;77072:117:0::1;;;;;;;:::i;:::-;77225:34;::::0;;77236:10:::1;77225:34;::::0;::::1;19536:51:1::0;19603:18;;;19596:30;;;;19662:1;19642:18;;;19635:29;-1:-1:-1;;;19680:18:1;;;19673:39;77198:14:0::1;::::0;19729:19:1;;77225:34:0::1;;;;;;;;;;;;77215:45;;;;;;77198:62;;77277:33;77295:6;77303;77277:17;:33::i;:::-;77269:60;;;;-1:-1:-1::0;;;77269:60:0::1;;;;;;;:::i;:::-;77348:10;77338:21;::::0;;;:9:::1;:21;::::0;;;;:29:::1;;:47:::0;;77371:14;;77338:21;:47:::1;::::0;77371:14;;77338:47:::1;:::i;:::-;::::0;;;-1:-1:-1;77394:36:0::1;::::0;-1:-1:-1;77404:10:0::1;77415:14:::0;77394:9:::1;:36::i;:::-;-1:-1:-1::0;;7012:1:0;7966:7;:22;-1:-1:-1;76598:838:0:o;80296:106::-;22144:13;:11;:13::i;:::-;80358:7:::1;:14;80368:4:::0;80358:7;:14:::1;:::i;:::-;-1:-1:-1::0;;80381:8:0::1;:15:::0;;-1:-1:-1;;80381:15:0::1;80392:4;80381:15;::::0;;80296:106::o;81063:291::-;22144:13;:11;:13::i;:::-;81131:16:::1;81178:2;81150:25;:21;81174:1;81150:25;:::i;:::-;:30;;;;:::i;:::-;81131:49:::0;-1:-1:-1;81189:21:0::1;81213:26;81237:2;81213:21;:26;:::i;:::-;81248:41;::::0;81189:50;;-1:-1:-1;81256:10:0::1;::::0;81248:41;::::1;;;::::0;81277:11;;81248:41:::1;::::0;;;81277:11;81256:10;81248:41;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;81298:50:0::1;::::0;-1:-1:-1;;;;;81298:32:0;::::1;::::0;:50;::::1;;;::::0;81331:16;;81298:50:::1;::::0;;;81331:16;81298:32;:50;::::1;;;;;;;;;;;;;::::0;::::1;;;;73164:219:::0;22144:13;:11;:13::i;:::-;73296:11:::1;:21:::0;;;;73326:11:::1;:21:::0;73356:11:::1;:21:::0;73164:219::o;57021:194::-;57093:7;57114:16;57122:7;57114;:16::i;:::-;57109:61;;57139:31;;-1:-1:-1;;;57139:31:0;;;;;;;;;;;57109:61;57184:19;57195:7;57184:10;:19::i;:::-;:25;-1:-1:-1;;;;;57184:25:0;;57021:194;-1:-1:-1;;57021:194:0:o;70786:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56092:512::-;56164:7;-1:-1:-1;;;;;56184:19:0;;56180:60;;56212:28;;-1:-1:-1;;;56212:28:0;;;;;;;;;;;56180:60;56249:13;56287;;56265;:11;:13::i;:::-;:19;;56281:3;56265:19;:::i;:::-;:35;;;;:::i;:::-;56249:51;;56307:13;56327:17;56356:9;56351:227;56372:5;56367:1;:10;56351:227;;56396:10;56404:1;56396:7;:10::i;:::-;56393:178;;;56419:18;56440:10;;;;;;;;;;:16;-1:-1:-1;;;;;56440:16:0;56471:24;;56467:52;;56509:10;56497:22;;56467:52;56547:5;-1:-1:-1;;;;;56534:18:0;:9;-1:-1:-1;;;;;56534:18:0;;56530:31;;56554:7;;;:::i;:::-;;;56530:31;56408:163;56393:178;56379:3;;;:::i;:::-;;;56351:227;;;-1:-1:-1;56593:5:0;;56092:512;-1:-1:-1;;;;56092:512:0:o;22906:103::-;22144:13;:11;:13::i;:::-;22971:30:::1;22998:1;22971:18;:30::i;:::-;22906:103::o:0;74822:912::-;7056:1;7654:7;;:19;7646:63;;;;-1:-1:-1;;;7646:63:0;;;;;;;:::i;:::-;7056:1;7787:7;:18;74936:6:::1;::::0;::::1;;74935:7;74927:34;;;;-1:-1:-1::0;;;74927:34:0::1;;;;;;;:::i;:::-;75006:11;::::0;74989:28:::1;::::0;:14;:28:::1;:::i;:::-;74976:9;:41;;74968:86;;;::::0;-1:-1:-1;;;74968:86:0;;20561:2:1;74968:86:0::1;::::0;::::1;20543:21:1::0;;;20580:18;;;20573:30;20639:34;20619:18;;;20612:62;20691:18;;74968:86:0::1;20359:356:1::0;74968:86:0::1;75078:20;75069:5;::::0;-1:-1:-1;;;75069:5:0;::::1;;;:29;::::0;::::1;;;;;;:::i;:::-;;;:61;;;;-1:-1:-1::0;75110:20:0::1;75102:5;::::0;-1:-1:-1;;;75102:5:0;::::1;;;:28;::::0;::::1;;;;;;:::i;:::-;;75069:61;75061:98;;;::::0;-1:-1:-1;;;75061:98:0;;20922:2:1;75061:98:0::1;::::0;::::1;20904:21:1::0;20961:2;20941:18;;;20934:30;-1:-1:-1;;;20980:18:1;;;20973:54;21044:18;;75061:98:0::1;20720:348:1::0;75061:98:0::1;75215:12;::::0;75208:19:::1;::::0;:4:::1;:19;:::i;:::-;75191:13;:11;:13::i;:::-;75174:30;::::0;:14;:30:::1;:::i;:::-;:53;;75166:97;;;;-1:-1:-1::0;;;75166:97:0::1;;;;;;;:::i;:::-;75297:31;::::0;;75308:10:::1;75297:31;::::0;::::1;21285:51:1::0;21352:18;;;21345:30;;;;21411:1;21391:18;;;21384:29;-1:-1:-1;;;21429:18:1;;;21422:36;75270:14:0::1;::::0;21475:19:1;;75297:31:0::1;;;;;;;;;;;;75287:42;;;;;;75270:59;;75344:33;75362:6;75370;75344:17;:33::i;:::-;75336:60;;;;-1:-1:-1::0;;;75336:60:0::1;;;;;;;:::i;:::-;75435:10;75403:15;75421:25:::0;;;:13:::1;:25;::::0;;;;:33;;75465:12;;;75461:60:::1;;-1:-1:-1::0;75500:13:0::1;::::0;75461:60:::1;75549:10;75535:25;::::0;;;:13:::1;:25;::::0;;;;:35:::1;;::::0;75591:7;;75535:52:::1;::::0;75573:14;;75535:52:::1;:::i;:::-;:63;;75527:98;;;::::0;-1:-1:-1;;;75527:98:0;;21707:2:1;75527:98:0::1;::::0;::::1;21689:21:1::0;21746:2;21726:18;;;21719:30;-1:-1:-1;;;21765:18:1;;;21758:52;21827:18;;75527:98:0::1;21505:346:1::0;75527:98:0::1;75646:10;75632:25;::::0;;;:13:::1;:25;::::0;;;;:35:::1;;:53:::0;;75671:14;;75632:25;:53:::1;::::0;75671:14;;75632:53:::1;:::i;:::-;::::0;;;-1:-1:-1;75692:36:0::1;::::0;-1:-1:-1;75702:10:0::1;75713:14:::0;75692:9:::1;:36::i;:::-;-1:-1:-1::0;;7012:1:0;7966:7;:22;-1:-1:-1;;74822:912:0:o;81360:133::-;22144:13;:11;:13::i;:::-;81456:30:::1;::::0;-1:-1:-1;;;81456:30:0;;81480:4:::1;81456:30;::::0;::::1;1679:51:1::0;-1:-1:-1;;;;;81437:14:0;::::1;::::0;::::1;::::0;81452:2;;81437:14;;81456:15:::1;::::0;1652:18:1;;81456:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81437:50;::::0;-1:-1:-1;;;;;;81437:50:0::1;::::0;;;;;;-1:-1:-1;;;;;22048:32:1;;;81437:50:0::1;::::0;::::1;22030:51:1::0;22097:18;;;22090:34;22003:18;;81437:50:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;55585:98::-:0;55641:13;55670:7;55663:14;;;;;:::i;74351:465::-;22144:13;:11;:13::i;:::-;74486:7:::1;:14;74465:10;:17;:35;74457:73;;;::::0;-1:-1:-1;;;74457:73:0;;22587:2:1;74457:73:0::1;::::0;::::1;22569:21:1::0;22626:2;22606:18;;;22599:30;22665:27;22645:18;;;22638:55;22710:18;;74457:73:0::1;22385:349:1::0;74457:73:0::1;74609:28:::0;;::::1;::::0;:15:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;74644:22:0;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;74677:6;74673:138;74693:10;:17;74689:1;:21;74673:138;;;74790:13;;74772:12;74785:1;74772:15;;;;;;;;:::i;:::-;;;;;;;;;:31;;;;:::i;:::-;74728:13;:33;74742:15;74758:1;74742:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;74742:18:0::1;74728:33:::0;;;::::1;::::0;;;;;;;;:75;74712:3;::::1;::::0;::::1;:::i;:::-;;;;74673:138;;57824:273:::0;20889:10;-1:-1:-1;;;;;57919:24:0;;;57915:54;;57952:17;;-1:-1:-1;;;57952:17:0;;;;;;;;;;;57915:54;20889:10;57978:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;57978:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;57978:53:0;;;;;;;;;;58043:48;;540:41:1;;;57978:42:0;;20889:10;58043:48;;513:18:1;58043:48:0;;;;;;;57824:273;;:::o;79116:720::-;79218:20;79209:5;;-1:-1:-1;;;79209:5:0;;;;:29;;;;;;;;:::i;:::-;;;79201:59;;;;-1:-1:-1;;;79201:59:0;;22941:2:1;79201:59:0;;;22923:21:1;22980:2;22960:18;;;22953:30;-1:-1:-1;;;22999:18:1;;;22992:47;23056:18;;79201:59:0;22739:341:1;79201:59:0;79292:2;79277:12;:17;79269:69;;;;-1:-1:-1;;;79269:69:0;;23287:2:1;79269:69:0;;;23269:21:1;23326:2;23306:18;;;23299:30;23365:34;23345:18;;;23338:62;-1:-1:-1;;;23416:18:1;;;23409:37;23463:19;;79269:69:0;23085:403:1;79269:69:0;79355:18;;:54;;-1:-1:-1;;;79355:54:0;;79384:10;79355:54;;;22030:51:1;22097:18;;;22090:34;;;-1:-1:-1;;;;;79355:18:0;;;;:28;;22003:18:1;;79355:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79413:1;79355:59;79347:110;;;;-1:-1:-1;;;79347:110:0;;23695:2:1;79347:110:0;;;23677:21:1;23734:2;23714:18;;;23707:30;23773:34;23753:18;;;23746:62;-1:-1:-1;;;23824:18:1;;;23817:36;23870:19;;79347:110:0;23493:402:1;79347:110:0;79524:16;;79474:29;;;;:15;:29;;;;;;:46;;79506:14;;79474:46;:::i;:::-;:66;;79466:125;;;;-1:-1:-1;;;79466:125:0;;24102:2:1;79466:125:0;;;24084:21:1;24141:2;24121:18;;;24114:30;24180:34;24160:18;;;24153:62;-1:-1:-1;;;24231:18:1;;;24224:44;24285:19;;79466:125:0;23900:410:1;79466:125:0;79641:3;79623:14;79608:12;;:29;;;;:::i;:::-;:36;;79600:70;;;;-1:-1:-1;;;79600:70:0;;24517:2:1;79600:70:0;;;24499:21:1;24556:2;24536:18;;;24529:30;-1:-1:-1;;;24575:18:1;;;24568:51;24636:18;;79600:70:0;24315:345:1;79600:70:0;79679:29;;;;:15;:29;;;;;:47;;79712:14;;79679:29;:47;;79712:14;;79679:47;:::i;:::-;;;;-1:-1:-1;;79758:12:0;;79735:56;;79747:10;;79758:16;;79773:1;79758:16;:::i;:::-;79776:14;79735:11;:56::i;:::-;79816:14;79800:12;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;79116:720:0:o;58758:354::-;58903:22;58928:19;58939:7;58928:10;:19::i;:::-;58903:44;;;;;;;;;;;-1:-1:-1;;;;;58903:44:0;;;;-1:-1:-1;;;58903:44:0;;;;-1:-1:-1;;;;;;58903:44:0;;;;;;-1:-1:-1;58959:48:0;20889:10;58992:7;59001:5;58959:18;:48::i;:::-;58954:97;;59016:35;;-1:-1:-1;;;59016:35:0;;;;;;;;;;;58954:97;59060:46;59074:4;59080:2;59084:7;59093:5;59100;59060:13;:46::i;:::-;58896:216;58758:354;;;;:::o;79842:312::-;22144:13;:11;:13::i;:::-;79986:12:::1;::::0;79979:19:::1;::::0;:4:::1;:19;:::i;:::-;79961:14;79945:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:53;;79937:95;;;::::0;-1:-1:-1;;;79937:95:0;;24867:2:1;79937:95:0::1;::::0;::::1;24849:21:1::0;24906:2;24886:18;;;24879:30;24945:31;24925:18;;;24918:59;24994:18;;79937:95:0::1;24665:353:1::0;79937:95:0::1;80046:9;80041:108;80065:9;:16;80061:1;:20;80041:108;;;80101:38;80111:9;80121:1;80111:12;;;;;;;;:::i;:::-;;;;;;;80124:14;80101:9;:38::i;:::-;80083:3:::0;::::1;::::0;::::1;:::i;:::-;;;;80041:108;;75741:851:::0;7056:1;7654:7;;:19;7646:63;;;;-1:-1:-1;;;7646:63:0;;;;;;;:::i;:::-;7056:1;7787:7;:18;75855:6:::1;::::0;::::1;;75854:7;75846:34;;;;-1:-1:-1::0;;;75846:34:0::1;;;;;;;:::i;:::-;75908:17;75899:5;::::0;-1:-1:-1;;;75899:5:0;::::1;;;:26;::::0;::::1;;;;;;:::i;:::-;;;:58;;;;-1:-1:-1::0;75937:20:0::1;75929:5;::::0;-1:-1:-1;;;75929:5:0;::::1;;;:28;::::0;::::1;;;;;;:::i;:::-;;75899:58;75891:91;;;;-1:-1:-1::0;;;75891:91:0::1;;;;;;;:::i;:::-;76031:11;::::0;76014:28:::1;::::0;:14;:28:::1;:::i;:::-;76001:9;:41;;75993:112;;;;-1:-1:-1::0;;;75993:112:0::1;;;;;;;:::i;:::-;76165:12;::::0;76158:19:::1;::::0;:4:::1;:19;:::i;:::-;76141:13;:11;:13::i;:::-;76124:30;::::0;:14;:30:::1;:::i;:::-;:53;;76116:97;;;;-1:-1:-1::0;;;76116:97:0::1;;;;;;;:::i;:::-;76281:13;::::0;76242:10:::1;76232:21;::::0;;;:9:::1;:21;::::0;;;;:28:::1;;::::0;:45:::1;::::0;76263:14;;76232:45:::1;:::i;:::-;:62;;76224:115;;;;-1:-1:-1::0;;;76224:115:0::1;;;;;;;:::i;:::-;76377:33;::::0;;76388:10:::1;76377:33;::::0;::::1;25235:51:1::0;25302:18;;;25295:30;;;;25361:1;25341:18;;;25334:29;-1:-1:-1;;;25379:18:1;;;25372:38;76350:14:0::1;::::0;25427:19:1;;76377:33:0::1;;;;;;;;;;;;76367:44;;;;;;76350:61;;76430:33;76448:6;76456;76430:17;:33::i;:::-;76422:60;;;;-1:-1:-1::0;;;76422:60:0::1;;;;;;;:::i;:::-;76503:10;76493:21;::::0;;;:9:::1;:21;::::0;;;;:28:::1;;:46:::0;;76525:14;;76493:21;:46:::1;::::0;76525:14;;76493:46:::1;:::i;73389:71::-:0;22144:13;:11;:13::i;:::-;73448:6:::1;::::0;;-1:-1:-1;;73438:16:0;::::1;73448:6;::::0;;::::1;73447:7;73438:16;::::0;;73389:71::o;80518:304::-;80583:13;80612:16;80620:7;80612;:16::i;:::-;80607:59;;80637:29;;-1:-1:-1;;;80637:29:0;;;;;;;;;;;80607:59;80680:8;;;;80675:142;;80710:13;80703:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80518:304;;;:::o;80675:142::-;80773:7;80781:25;80798:7;80781:16;:25::i;:::-;80759:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80752:55;;80518:304;;;:::o;80160:130::-;22144:13;:11;:13::i;:::-;80221:14:::1;::::0;::::1;::::0;::::1;;;80220:15;80212:42;;;::::0;-1:-1:-1;;;80212:42:0;;26684:2:1;80212:42:0::1;::::0;::::1;26666:21:1::0;26723:2;26703:18;;;26696:30;-1:-1:-1;;;26742:18:1;;;26735:44;26796:18;;80212:42:0::1;26482:338:1::0;80212:42:0::1;80263:14;:21:::0;;-1:-1:-1;;80263:21:0::1;;;::::0;;80160:130::o;58103:158::-;-1:-1:-1;;;;;58220:25:0;;;58200:4;58220:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;58103:158::o;23164:201::-;22144:13;:11;:13::i;:::-;-1:-1:-1;;;;;23253:22:0;::::1;23245:73;;;::::0;-1:-1:-1;;;23245:73:0;;27027:2:1;23245:73:0::1;::::0;::::1;27009:21:1::0;27066:2;27046:18;;;27039:30;27105:34;27085:18;;;27078:62;-1:-1:-1;;;27156:18:1;;;27149:36;27202:19;;23245:73:0::1;26825:402:1::0;23245:73:0::1;23329:28;23348:8;23329:18;:28::i;:::-;23164:201:::0;:::o;73466:879::-;7056:1;7654:7;;:19;7646:63;;;;-1:-1:-1;;;7646:63:0;;;;;;;:::i;:::-;7056:1;7787:7;:18;73596:2:::1;73580:18:::0;::::1;73572:54;;;::::0;-1:-1:-1;;;73572:54:0;;27434:2:1;73572:54:0::1;::::0;::::1;27416:21:1::0;27473:2;27453:18;;;27446:30;27512:25;27492:18;;;27485:53;27555:18;;73572:54:0::1;27232:347:1::0;73572:54:0::1;73644:6;::::0;::::1;;73643:7;73635:34;;;;-1:-1:-1::0;;;73635:34:0::1;;;;;;;:::i;:::-;73695:20;73686:5;::::0;-1:-1:-1;;;73686:5:0;::::1;;;:29;::::0;::::1;;;;;;:::i;:::-;;;:61;;;;-1:-1:-1::0;73727:20:0::1;73719:5;::::0;-1:-1:-1;;;73719:5:0;::::1;;;:28;::::0;::::1;;;;;;:::i;:::-;;73686:61;73678:98;;;::::0;-1:-1:-1;;;73678:98:0;;20922:2:1;73678:98:0::1;::::0;::::1;20904:21:1::0;20961:2;20941:18;;;20934:30;-1:-1:-1;;;20980:18:1;;;20973:54;21044:18;;73678:98:0::1;20720:348:1::0;73678:98:0::1;73793:18;::::0;:54:::1;::::0;-1:-1:-1;;;73793:54:0;;73822:10:::1;73793:54;::::0;::::1;22030:51:1::0;22097:18;;;22090:34;;;73850:1:0::1;::::0;-1:-1:-1;;;;;73793:18:0::1;::::0;:28:::1;::::0;22003:18:1;;73793:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;73785:106;;;::::0;-1:-1:-1;;;73785:106:0;;27786:2:1;73785:106:0::1;::::0;::::1;27768:21:1::0;27825:2;27805:18;;;27798:30;27864:34;27844:18;;;27837:62;-1:-1:-1;;;27915:18:1;;;27908:33;27958:19;;73785:106:0::1;27584:399:1::0;73785:106:0::1;73938:11;::::0;73921:28:::1;::::0;:14;:28:::1;:::i;:::-;73908:9;:41;;73900:112;;;;-1:-1:-1::0;;;73900:112:0::1;;;;;;;:::i;:::-;74070:12;::::0;74063:19:::1;::::0;:4:::1;:19;:::i;:::-;74046:13;:11;:13::i;:::-;74029:30;::::0;:14;:30:::1;:::i;:::-;:53;;74021:97;;;;-1:-1:-1::0;;;74021:97:0::1;;;;;;;:::i;:::-;74182:13;::::0;74135:23:::1;::::0;;;:8:::1;:23;::::0;;;;:26:::1;;::::0;:43:::1;::::0;74164:14;;74135:43:::1;:::i;:::-;:60;;74127:114;;;::::0;-1:-1:-1;;;74127:114:0;;28190:2:1;74127:114:0::1;::::0;::::1;28172:21:1::0;28229:2;28209:18;;;28202:30;28268:34;28248:18;;;28241:62;-1:-1:-1;;;28319:18:1;;;28312:39;28368:19;;74127:114:0::1;27988:405:1::0;74127:114:0::1;74250:23;::::0;;;:8:::1;:23;::::0;;;;:26:::1;;:44:::0;;74280:14;;74250:23;:44:::1;::::0;74280:14;;74250:44:::1;:::i;:::-;::::0;;;-1:-1:-1;74303:36:0::1;::::0;-1:-1:-1;74313:10:0::1;74324:14:::0;74303:9:::1;:36::i;:::-;-1:-1:-1::0;;7012:1:0;7966:7;:22;73466:879::o;72625:155::-;22144:13;:11;:13::i;:::-;72727:5:::1;::::0;-1:-1:-1;;;72727:5:0;::::1;;;72721:12;::::0;::::1;;;;;;:::i;:::-;72705:28;;72711:6;72705:13;;;;;;;;:::i;:::-;:28;;;72697:54;;;::::0;-1:-1:-1;;;72697:54:0;;28600:2:1;72697:54:0::1;::::0;::::1;28582:21:1::0;28639:2;28619:18;;;28612:30;-1:-1:-1;;;28658:18:1;;;28651:43;28711:18;;72697:54:0::1;28398:337:1::0;72697:54:0::1;72760:5;:14:::0;;72768:6;;72760:5;-1:-1:-1;;;;72760:14:0::1;-1:-1:-1::0;;;72768:6:0;72760:14:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;72625:155:::0;:::o;59466:257::-;59531:4;59558:3;59548:7;:13;59544:174;;;-1:-1:-1;59589:12:0;;-1:-1:-1;59579:22:0;59466:257::o;59544:174::-;59630:3;59619:7;:14;59615:103;;-1:-1:-1;59662:13:0;;-1:-1:-1;59651:24:0;;59466:257::o;59615:103::-;-1:-1:-1;59705:5:0;;59466:257;-1:-1:-1;59466:257:0:o;56610:405::-;56670:17;56701:16;56709:7;56701;:16::i;:::-;56696:65;;56726:35;;-1:-1:-1;;;56726:35:0;;;;;;;;;;;56696:65;56770:23;56796:16;;;;;;;;;;56804:7;56856:133;56863:11;;-1:-1:-1;;;;;56863:11:0;56856:133;;-1:-1:-1;;56920:14:0;56960:7;:21;;;;;;;;;;;-1:-1:-1;56856:133:0;;;-1:-1:-1;57004:5:0;56610:405;-1:-1:-1;;56610:405:0:o;63713:196::-;63828:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;63828:29:0;-1:-1:-1;;;;;63828:29:0;;;;;;;;;63878:11;;63869:34;;63828:24;;:29;;63869:34;;;;;;63828:24;63869:34;63713:196;;;:::o;22423:132::-;22331:6;;-1:-1:-1;;;;;22331:6:0;20889:10;22487:23;22479:68;;;;-1:-1:-1;;;22479:68:0;;28942:2:1;22479:68:0;;;28924:21:1;;;28961:18;;;28954:30;29020:34;29000:18;;;28993:62;29072:18;;22479:68:0;28740:356:1;59729:286:0;59895:11;;59866:4;;-1:-1:-1;;;;;59921:16:0;;;;;;;;:52;;;59941:32;59958:5;59965:7;59941:16;:32::i;:::-;59921:87;;;;60001:7;-1:-1:-1;;;;;59977:31:0;:20;59989:7;59977:11;:20::i;:::-;-1:-1:-1;;;;;59977:31:0;;59921:87;59913:96;59729:286;-1:-1:-1;;;;;59729:286:0:o;62647:904::-;62801:4;-1:-1:-1;;;;;62786:19:0;:5;:11;;;-1:-1:-1;;;;;62786:19:0;;62782:60;;62814:28;;-1:-1:-1;;;62814:28:0;;;;;;;;;;;62782:60;-1:-1:-1;;;;;62853:16:0;;62849:52;;62878:23;;-1:-1:-1;;;62878:23:0;;;;;;;;;;;62849:52;62962:36;62979:1;62983:7;62992:5;62962:8;:36::i;:::-;63058:1;63048:11;;63072:20;63048:11;63072:7;:20::i;:::-;63068:234;;;63105:27;63135:20;;;;;;;;;;63170:15;;-1:-1:-1;;;;;63170:15:0;63166:127;;63232:11;;63272:9;;;;63256:25;;-1:-1:-1;;;63256:25:0;-1:-1:-1;;;;;63214:29:0;;;63256:25;;;63166:127;63094:208;63068:234;-1:-1:-1;63317:26:0;63346:16;;;;;;;;;;;-1:-1:-1;;;;;63369:19:0;;;63395:58;;;63467:27;;63346:16;;;;63369:19;63467:27;;;;;;63317:26;63467:27;63503:42;57221:389;60021:106;60094:27;60104:2;60108:8;60094:27;;;;;;;;;;;;:9;:27::i;:::-;60021:106;;:::o;78801:309::-;78889:4;78904:14;78921:47;78931:6;78939;:8;;;78949:6;:8;;;78959:6;:8;;;78921:47;;;;;;;;;;;;;;;;;29328:25:1;;;29401:4;29389:17;;;;29384:2;29369:18;;29362:45;29438:2;29423:18;;29416:34;29481:2;29466:18;;29459:34;29315:3;29300:19;;29101:398;78921:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;78921:47:0;;-1:-1:-1;;78921:47:0;;;-1:-1:-1;;;;;;;78985:20:0;;78977:57;;;;-1:-1:-1;;;78977:57:0;;29706:2:1;78977:57:0;;;29688:21:1;29745:2;29725:18;;;29718:30;29784:26;29764:18;;;29757:54;29828:18;;78977:57:0;29504:348:1;78977:57:0;79092:12;-1:-1:-1;;;;;79082:22:0;:6;-1:-1:-1;;;;;79082:22:0;;79075:29;;;78801:309;;;;:::o;23525:191::-;23618:6;;;-1:-1:-1;;;;;23635:17:0;;;-1:-1:-1;;;;;;23635:17:0;;;;;;;23668:40;;23618:6;;;23635:17;23618:6;;23668:40;;23599:16;;23668:40;23588:128;23525:191;:::o;60133:128::-;60221:34;60233:2;60237:3;60242:8;60221:34;;;;;;;;;;;;:11;:34::i;59118:342::-;59282:35;59292:4;59298:2;59302:7;59311:5;59282:9;:35::i;:::-;-1:-1:-1;;;;;59330:13:0;;25251:19;:23;;59330:68;;;;;59350:48;59373:4;59379:2;59383:7;59392:5;59350:22;:48::i;:::-;59349:49;59330:68;59326:128;;;59414:40;;-1:-1:-1;;;59414:40:0;;;;;;;;;;;8433:723;8489:13;8710:5;8719:1;8710:10;8706:53;;-1:-1:-1;;8737:10:0;;;;;;;;;;;;-1:-1:-1;;;8737:10:0;;;;;8433:723::o;8706:53::-;8784:5;8769:12;8825:78;8832:9;;8825:78;;8858:8;;;;:::i;:::-;;-1:-1:-1;8881:10:0;;-1:-1:-1;8889:2:0;8881:10;;:::i;:::-;;;8825:78;;;8913:19;8945:6;8935:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8935:17:0;;8913:39;;8963:154;8970:10;;8963:154;;8997:11;9007:1;8997:11;;:::i;:::-;;-1:-1:-1;9066:10:0;9074:2;9066:5;:10;:::i;:::-;9053:24;;:2;:24;:::i;:::-;9040:39;;9023:6;9030;9023:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;9023:56:0;;;;;;;;-1:-1:-1;9094:11:0;9103:2;9094:11;;:::i;:::-;;;8963:154;;;9141:6;8433:723;-1:-1:-1;;;;8433:723:0:o;60267:445::-;60403:12;;60422:19;60428:2;60432:8;60422:5;:19::i;:::-;-1:-1:-1;;;;;60454:13:0;;25251:19;:23;60450:257;;60506:9;60501:190;60521:8;60517:1;:12;60501:190;;;60554:63;60585:1;60589:2;60608:1;60593:12;:16;60611:5;60554:22;:63::i;:::-;60549:130;;60639:40;;-1:-1:-1;;;60639:40:0;;;;;;;;;;;60549:130;60531:3;;60501:190;;60718:388;60851:26;60859:2;60863:3;60868:8;60851:7;:26::i;:::-;60901:8;60884:13;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;60920:13:0;;25251:19;:23;60916:185;;60972:50;61003:1;61007:2;61011:3;61016:5;60972:22;:50::i;:::-;60967:117;;61044:40;;-1:-1:-1;;;61044:40:0;;;;;;;;;;;63915:565;64069:72;;-1:-1:-1;;;64069:72:0;;64052:4;;-1:-1:-1;;;;;64069:36:0;;;;;:72;;20889:10;;64120:4;;64126:7;;64135:5;;64069:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64069:72:0;;;;;;;;-1:-1:-1;;64069:72:0;;;;;;;;;;;;:::i;:::-;;;64065:410;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64283:6;:13;64300:1;64283:18;64279:189;;64321:40;;-1:-1:-1;;;64321:40:0;;;;;;;;;;;64279:189;64440:6;64434:13;64425:6;64421:2;64417:15;64410:38;64065:410;-1:-1:-1;;;;;;64182:51:0;-1:-1:-1;;;64182:51:0;;-1:-1:-1;63915:565:0;;;;;;:::o;61112:775::-;-1:-1:-1;;;;;61185:16:0;;61181:48;;61210:19;;-1:-1:-1;;;61210:19:0;;;;;;;;;;;61181:48;61240:8;61252:1;61240:13;61236:44;;61262:18;;-1:-1:-1;;;61262:18:0;;;;;;;;;;;61236:44;61312:12;;61425:9;61420:353;61440:8;61436:1;:12;61420:353;;;61470:13;:18;:52;;61504:13;61500:1;:17;;;;;:::i;:::-;;:22;61470:52;;;61491:6;;61470:52;61466:238;;;61571:16;;;61537:23;61563:25;;;;;;;;;;-1:-1:-1;;;;;61601:16:0;;61630:62;;61466:238;61721:42;;61746:16;;;;-1:-1:-1;;;;;61721:42:0;;;61738:1;;61721:42;;61738:1;;61721:42;61450:3;;61420:353;;;-1:-1:-1;61781:12:0;:24;;;;;;81021:30:::1;80828:229:::0;;:::o;61893:748::-;-1:-1:-1;;;;;61981:16:0;;61977:48;;62006:19;;-1:-1:-1;;;62006:19:0;;;;;;;;;;;61977:48;62036:8;62048:1;62036:13;62032:44;;62058:18;;-1:-1:-1;;;62058:18:0;;;;;;;;;;;62032:44;62108:3;62212:9;62207:353;62227:8;62223:1;:12;62207:353;;;62257:13;:18;:52;;62291:13;62287:1;:17;;;;;:::i;:::-;;:22;62257:52;;;62278:6;;62257:52;62253:238;;;62358:16;;;62324:23;62350:25;;;;;;;;;;-1:-1:-1;;;;;62388:16:0;;62417:62;;62253:238;62508:42;;62533:16;;;;-1:-1:-1;;;;;62508:42:0;;;62525:1;;62508:42;;62525:1;;62508:42;62237:3;;62207:353;;;;62575:60;57221:389;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:131::-;-1:-1:-1;;;;;1816:31:1;;1806:42;;1796:70;;1862:1;1859;1852:12;1877:315;1945:6;1953;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;2061:9;2048:23;2080:31;2105:5;2080:31;:::i;:::-;2130:5;2182:2;2167:18;;;;2154:32;;-1:-1:-1;;;1877:315:1:o;2197:127::-;2258:10;2253:3;2249:20;2246:1;2239:31;2289:4;2286:1;2279:15;2313:4;2310:1;2303:15;2329:275;2400:2;2394:9;2465:2;2446:13;;-1:-1:-1;;2442:27:1;2430:40;;2500:18;2485:34;;2521:22;;;2482:62;2479:88;;;2547:18;;:::i;:::-;2583:2;2576:22;2329:275;;-1:-1:-1;2329:275:1:o;2609:407::-;2674:5;2708:18;2700:6;2697:30;2694:56;;;2730:18;;:::i;:::-;2768:57;2813:2;2792:15;;-1:-1:-1;;2788:29:1;2819:4;2784:40;2768:57;:::i;:::-;2759:66;;2848:6;2841:5;2834:21;2888:3;2879:6;2874:3;2870:16;2867:25;2864:45;;;2905:1;2902;2895:12;2864:45;2954:6;2949:3;2942:4;2935:5;2931:16;2918:43;3008:1;3001:4;2992:6;2985:5;2981:18;2977:29;2970:40;2609:407;;;;;:::o;3021:222::-;3064:5;3117:3;3110:4;3102:6;3098:17;3094:27;3084:55;;3135:1;3132;3125:12;3084:55;3157:80;3233:3;3224:6;3211:20;3204:4;3196:6;3192:17;3157:80;:::i;3248:543::-;3336:6;3344;3397:2;3385:9;3376:7;3372:23;3368:32;3365:52;;;3413:1;3410;3403:12;3365:52;3453:9;3440:23;3482:18;3523:2;3515:6;3512:14;3509:34;;;3539:1;3536;3529:12;3509:34;3562:50;3604:7;3595:6;3584:9;3580:22;3562:50;:::i;:::-;3552:60;;3665:2;3654:9;3650:18;3637:32;3621:48;;3694:2;3684:8;3681:16;3678:36;;;3710:1;3707;3700:12;3678:36;;3733:52;3777:7;3766:8;3755:9;3751:24;3733:52;:::i;:::-;3723:62;;;3248:543;;;;;:::o;3978:456::-;4055:6;4063;4071;4124:2;4112:9;4103:7;4099:23;4095:32;4092:52;;;4140:1;4137;4130:12;4092:52;4179:9;4166:23;4198:31;4223:5;4198:31;:::i;:::-;4248:5;-1:-1:-1;4305:2:1;4290:18;;4277:32;4318:33;4277:32;4318:33;:::i;:::-;3978:456;;4370:7;;-1:-1:-1;;;4424:2:1;4409:18;;;;4396:32;;3978:456::o;4439:316::-;4516:6;4524;4532;4585:2;4573:9;4564:7;4560:23;4556:32;4553:52;;;4601:1;4598;4591:12;4553:52;-1:-1:-1;;4624:23:1;;;4694:2;4679:18;;4666:32;;-1:-1:-1;4745:2:1;4730:18;;;4717:32;;4439:316;-1:-1:-1;4439:316:1:o;4760:810::-;4852:6;4860;4904:9;4895:7;4891:23;4934:3;4930:2;4926:12;4923:32;;;4951:1;4948;4941:12;4923:32;4974:23;;;-1:-1:-1;5031:4:1;-1:-1:-1;;5013:16:1;;5009:27;5006:47;;;5049:1;5046;5039:12;5006:47;;5082:2;5076:9;5124:4;5116:6;5112:17;5195:6;5183:10;5180:22;5159:18;5147:10;5144:34;5141:62;5138:88;;;5206:18;;:::i;:::-;5246:10;5242:2;5235:22;;5309:2;5298:9;5294:18;5281:32;5273:6;5266:48;5375:2;5364:9;5360:18;5347:32;5342:2;5334:6;5330:15;5323:57;5430:4;5419:9;5415:20;5402:34;5476:4;5469:5;5465:16;5458:5;5455:27;5445:55;;5496:1;5493;5486:12;5445:55;5528:2;5516:15;;5509:30;4760:810;;5520:6;;-1:-1:-1;4760:810:1;;-1:-1:-1;;4760:810:1:o;5575:322::-;5644:6;5697:2;5685:9;5676:7;5672:23;5668:32;5665:52;;;5713:1;5710;5703:12;5665:52;5753:9;5740:23;5786:18;5778:6;5775:30;5772:50;;;5818:1;5815;5808:12;5772:50;5841;5883:7;5874:6;5863:9;5859:22;5841:50;:::i;5902:247::-;5961:6;6014:2;6002:9;5993:7;5989:23;5985:32;5982:52;;;6030:1;6027;6020:12;5982:52;6069:9;6056:23;6088:31;6113:5;6088:31;:::i;6386:402::-;6468:6;6476;6529:2;6517:9;6508:7;6504:23;6500:32;6497:52;;;6545:1;6542;6535:12;6497:52;6584:9;6571:23;6603:31;6628:5;6603:31;:::i;:::-;6653:5;-1:-1:-1;6710:2:1;6695:18;;6682:32;6723:33;6682:32;6723:33;:::i;:::-;6775:7;6765:17;;;6386:402;;;;;:::o;6793:183::-;6853:4;6886:18;6878:6;6875:30;6872:56;;;6908:18;;:::i;:::-;-1:-1:-1;6953:1:1;6949:14;6965:4;6945:25;;6793:183::o;6981:737::-;7035:5;7088:3;7081:4;7073:6;7069:17;7065:27;7055:55;;7106:1;7103;7096:12;7055:55;7142:6;7129:20;7168:4;7192:60;7208:43;7248:2;7208:43;:::i;:::-;7192:60;:::i;:::-;7286:15;;;7372:1;7368:10;;;;7356:23;;7352:32;;;7317:12;;;;7396:15;;;7393:35;;;7424:1;7421;7414:12;7393:35;7460:2;7452:6;7448:15;7472:217;7488:6;7483:3;7480:15;7472:217;;;7568:3;7555:17;7585:31;7610:5;7585:31;:::i;:::-;7629:18;;7667:12;;;;7505;;7472:217;;;-1:-1:-1;7707:5:1;6981:737;-1:-1:-1;;;;;;6981:737:1:o;7723:1138::-;7841:6;7849;7902:2;7890:9;7881:7;7877:23;7873:32;7870:52;;;7918:1;7915;7908:12;7870:52;7958:9;7945:23;7987:18;8028:2;8020:6;8017:14;8014:34;;;8044:1;8041;8034:12;8014:34;8067:61;8120:7;8111:6;8100:9;8096:22;8067:61;:::i;:::-;8057:71;;8147:2;8137:12;;8202:2;8191:9;8187:18;8174:32;8231:2;8221:8;8218:16;8215:36;;;8247:1;8244;8237:12;8215:36;8270:24;;;-1:-1:-1;8325:4:1;8317:13;;8313:27;-1:-1:-1;8303:55:1;;8354:1;8351;8344:12;8303:55;8390:2;8377:16;8413:60;8429:43;8469:2;8429:43;:::i;8413:60::-;8507:15;;;8589:1;8585:10;;;;8577:19;;8573:28;;;8538:12;;;;8613:19;;;8610:39;;;8645:1;8642;8635:12;8610:39;8669:11;;;;8689:142;8705:6;8700:3;8697:15;8689:142;;;8771:17;;8759:30;;8722:12;;;;8809;;;;8689:142;;;8850:5;8840:15;;;;;;;7723:1138;;;;;:::o;8866:118::-;8952:5;8945:13;8938:21;8931:5;8928:32;8918:60;;8974:1;8971;8964:12;8989:382;9054:6;9062;9115:2;9103:9;9094:7;9090:23;9086:32;9083:52;;;9131:1;9128;9121:12;9083:52;9170:9;9157:23;9189:31;9214:5;9189:31;:::i;:::-;9239:5;-1:-1:-1;9296:2:1;9281:18;;9268:32;9309:30;9268:32;9309:30;:::i;9376:248::-;9444:6;9452;9505:2;9493:9;9484:7;9480:23;9476:32;9473:52;;;9521:1;9518;9511:12;9473:52;-1:-1:-1;;9544:23:1;;;9614:2;9599:18;;;9586:32;;-1:-1:-1;9376:248:1:o;9629:127::-;9690:10;9685:3;9681:20;9678:1;9671:31;9721:4;9718:1;9711:15;9745:4;9742:1;9735:15;9761:342;9907:2;9892:18;;9940:1;9929:13;;9919:144;;9985:10;9980:3;9976:20;9973:1;9966:31;10020:4;10017:1;10010:15;10048:4;10045:1;10038:15;9919:144;10072:25;;;9761:342;:::o;10108:795::-;10203:6;10211;10219;10227;10280:3;10268:9;10259:7;10255:23;10251:33;10248:53;;;10297:1;10294;10287:12;10248:53;10336:9;10323:23;10355:31;10380:5;10355:31;:::i;:::-;10405:5;-1:-1:-1;10462:2:1;10447:18;;10434:32;10475:33;10434:32;10475:33;:::i;:::-;10527:7;-1:-1:-1;10581:2:1;10566:18;;10553:32;;-1:-1:-1;10636:2:1;10621:18;;10608:32;10663:18;10652:30;;10649:50;;;10695:1;10692;10685:12;10649:50;10718:22;;10771:4;10763:13;;10759:27;-1:-1:-1;10749:55:1;;10800:1;10797;10790:12;10749:55;10823:74;10889:7;10884:2;10871:16;10866:2;10862;10858:11;10823:74;:::i;:::-;10813:84;;;10108:795;;;;;;;:::o;10908:416::-;11001:6;11009;11062:2;11050:9;11041:7;11037:23;11033:32;11030:52;;;11078:1;11075;11068:12;11030:52;11118:9;11105:23;11151:18;11143:6;11140:30;11137:50;;;11183:1;11180;11173:12;11137:50;11206:61;11259:7;11250:6;11239:9;11235:22;11206:61;:::i;:::-;11196:71;11314:2;11299:18;;;;11286:32;;-1:-1:-1;;;;10908:416:1:o;11722:270::-;11795:6;11848:2;11836:9;11827:7;11823:23;11819:32;11816:52;;;11864:1;11861;11854:12;11816:52;11903:9;11890:23;11942:1;11935:5;11932:12;11922:40;;11958:1;11955;11948:12;11997:380;12076:1;12072:12;;;;12119;;;12140:61;;12194:4;12186:6;12182:17;12172:27;;12140:61;12247:2;12239:6;12236:14;12216:18;12213:38;12210:161;;12293:10;12288:3;12284:20;12281:1;12274:31;12328:4;12325:1;12318:15;12356:4;12353:1;12346:15;12210:161;;11997:380;;;:::o;12855:545::-;12957:2;12952:3;12949:11;12946:448;;;12993:1;13018:5;13014:2;13007:17;13063:4;13059:2;13049:19;13133:2;13121:10;13117:19;13114:1;13110:27;13104:4;13100:38;13169:4;13157:10;13154:20;13151:47;;;-1:-1:-1;13192:4:1;13151:47;13247:2;13242:3;13238:12;13235:1;13231:20;13225:4;13221:31;13211:41;;13302:82;13320:2;13313:5;13310:13;13302:82;;;13365:17;;;13346:1;13335:13;13302:82;;;13306:3;;;12855:545;;;:::o;13576:1352::-;13702:3;13696:10;13729:18;13721:6;13718:30;13715:56;;;13751:18;;:::i;:::-;13780:97;13870:6;13830:38;13862:4;13856:11;13830:38;:::i;:::-;13824:4;13780:97;:::i;:::-;13932:4;;13996:2;13985:14;;14013:1;14008:663;;;;14715:1;14732:6;14729:89;;;-1:-1:-1;14784:19:1;;;14778:26;14729:89;-1:-1:-1;;13533:1:1;13529:11;;;13525:24;13521:29;13511:40;13557:1;13553:11;;;13508:57;14831:81;;13978:944;;14008:663;12802:1;12795:14;;;12839:4;12826:18;;-1:-1:-1;;14044:20:1;;;14162:236;14176:7;14173:1;14170:14;14162:236;;;14265:19;;;14259:26;14244:42;;14357:27;;;;14325:1;14313:14;;;;14192:19;;14162:236;;;14166:3;14426:6;14417:7;14414:19;14411:201;;;14487:19;;;14481:26;-1:-1:-1;;14570:1:1;14566:14;;;14582:3;14562:24;14558:37;14554:42;14539:58;14524:74;;14411:201;-1:-1:-1;;;;;14658:1:1;14642:14;;;14638:22;14625:36;;-1:-1:-1;13576:1352:1:o;14933:127::-;14994:10;14989:3;14985:20;14982:1;14975:31;15025:4;15022:1;15015:15;15049:4;15046:1;15039:15;15065:128;15132:9;;;15153:11;;;15150:37;;;15167:18;;:::i;15198:125::-;15263:9;;;15284:10;;;15281:36;;;15297:18;;:::i;15328:355::-;15530:2;15512:21;;;15569:2;15549:18;;;15542:30;15608:33;15603:2;15588:18;;15581:61;15674:2;15659:18;;15328:355::o;15688:338::-;15890:2;15872:21;;;15929:2;15909:18;;;15902:30;-1:-1:-1;;;15963:2:1;15948:18;;15941:44;16017:2;16002:18;;15688:338::o;16384:410::-;16586:2;16568:21;;;16625:2;16605:18;;;16598:30;16664:34;16659:2;16644:18;;16637:62;-1:-1:-1;;;16730:2:1;16715:18;;16708:44;16784:3;16769:19;;16384:410::o;16799:168::-;16839:7;16905:1;16901;16897:6;16893:14;16890:1;16887:21;16882:1;16875:9;16868:17;16864:45;16861:71;;;16912:18;;:::i;:::-;-1:-1:-1;16952:9:1;;16799:168::o;16972:422::-;17174:2;17156:21;;;17213:2;17193:18;;;17186:30;17252:34;17247:2;17232:18;;17225:62;17323:28;17318:2;17303:18;;17296:56;17384:3;17369:19;;16972:422::o;17399:355::-;17601:2;17583:21;;;17640:2;17620:18;;;17613:30;17679:33;17674:2;17659:18;;17652:61;17745:2;17730:18;;17399:355::o;17759:127::-;17820:10;17815:3;17811:20;17808:1;17801:31;17851:4;17848:1;17841:15;17875:4;17872:1;17865:15;17891:135;17930:3;17951:17;;;17948:43;;17971:18;;:::i;:::-;-1:-1:-1;18018:1:1;18007:13;;17891:135::o;18031:344::-;18233:2;18215:21;;;18272:2;18252:18;;;18245:30;-1:-1:-1;;;18306:2:1;18291:18;;18284:50;18366:2;18351:18;;18031:344::o;18380:184::-;18450:6;18503:2;18491:9;18482:7;18478:23;18474:32;18471:52;;;18519:1;18516;18509:12;18471:52;-1:-1:-1;18542:16:1;;18380:184;-1:-1:-1;18380:184:1:o;18915:404::-;19117:2;19099:21;;;19156:2;19136:18;;;19129:30;19195:34;19190:2;19175:18;;19168:62;-1:-1:-1;;;19261:2:1;19246:18;;19239:38;19309:3;19294:19;;18915:404::o;19759:338::-;19961:2;19943:21;;;20000:2;19980:18;;;19973:30;-1:-1:-1;;;20034:2:1;20019:18;;20012:44;20088:2;20073:18;;19759:338::o;20102:127::-;20163:10;20158:3;20154:20;20151:1;20144:31;20194:4;20191:1;20184:15;20218:4;20215:1;20208:15;20234:120;20274:1;20300;20290:35;;20305:18;;:::i;:::-;-1:-1:-1;20339:9:1;;20234:120::o;22135:245::-;22202:6;22255:2;22243:9;22234:7;22230:23;22226:32;22223:52;;;22271:1;22268;22261:12;22223:52;22303:9;22297:16;22322:28;22344:5;22322:28;:::i;25457:1020::-;25633:3;25662:1;25695:6;25689:13;25725:36;25751:9;25725:36;:::i;:::-;25780:1;25797:18;;;25824:133;;;;25971:1;25966:356;;;;25790:532;;25824:133;-1:-1:-1;;25857:24:1;;25845:37;;25930:14;;25923:22;25911:35;;25902:45;;;-1:-1:-1;25824:133:1;;25966:356;25997:6;25994:1;25987:17;26027:4;26072:2;26069:1;26059:16;26097:1;26111:165;26125:6;26122:1;26119:13;26111:165;;;26203:14;;26190:11;;;26183:35;26246:16;;;;26140:10;;26111:165;;;26115:3;;;26305:6;26300:3;26296:16;26289:23;;25790:532;;;;;26353:6;26347:13;26369:68;26428:8;26423:3;26416:4;26408:6;26404:17;26369:68;:::i;:::-;26453:18;;25457:1020;-1:-1:-1;;;;25457:1020:1:o;29857:112::-;29889:1;29915;29905:35;;29920:18;;:::i;:::-;-1:-1:-1;29954:9:1;;29857:112::o;29974:489::-;-1:-1:-1;;;;;30243:15:1;;;30225:34;;30295:15;;30290:2;30275:18;;30268:43;30342:2;30327:18;;30320:34;;;30390:3;30385:2;30370:18;;30363:31;;;30168:4;;30411:46;;30437:19;;30429:6;30411:46;:::i;:::-;30403:54;29974:489;-1:-1:-1;;;;;;29974:489:1:o;30468:249::-;30537:6;30590:2;30578:9;30569:7;30565:23;30561:32;30558:52;;;30606:1;30603;30596:12;30558:52;30638:9;30632:16;30657:30;30681:5;30657:30;:::i

Swarm Source

ipfs://9fcd5413b580d474c9eebfd49794b4c055a5d06b3595e9d3e131efa8418f36aa
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.