ETH Price: $3,151.88 (+1.03%)
Gas: 2 Gwei

Token

FortuneDao (Fortune)
 

Overview

Max Total Supply

667 Fortune

Holders

460

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Fortune
0xf8248e41da33091c07bf10674e0b2fc7d3ad775a
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:
FortuneDao

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-09
*/

// SPDX-License-Identifier: MIT

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

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

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (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.
            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.
            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;
        uint8 v;
        assembly {
            s := and(
                vs,
                0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
            )
            v := add(shr(255, vs), 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/security/ReentrancyGuard.sol

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

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

// File: contracts/ERC721A.sol

pragma solidity ^0.8.0;

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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 private currentIndex = 0;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) private _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    /**
     * @dev
     * `maxBatchSize` refers to how much a minter can mint at a time.
     * `collectionSize_` refers to how many tokens are in the collection.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 collectionSize_
    ) {
        require(
            collectionSize_ > 0,
            "ERC721A: collection must have a nonzero supply"
        );
        require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
    }

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: balance query for the zero address"
        );
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: number minted query for the zero address"
        );
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

        for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, "ERC721A: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721A: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                "ERC721A: transfer to non ERC721Receiver implementer"
            );
            updatedIndex++;
        }

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

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

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

        require(
            isApprovedOrOwner,
            "ERC721A: transfer caller is not owner nor approved"
        );

        require(
            prevOwnership.addr == from,
            "ERC721A: transfer from incorrect owner"
        );
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

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

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

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

    uint256 public nextOwnerToExplicitlySet = 0;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "quantity must be nonzero");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > collectionSize - 1) {
            endIndex = collectionSize - 1;
        }
        // We know if the last one in the group exists, all in the group exist, due to serial ordering.
        require(_exists(endIndex), "not enough minted yet for this cleanup");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(
                    ownership.addr,
                    ownership.startTimestamp
                );
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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);
    }
}

pragma solidity ^0.8.0;

contract FortuneDao is ERC721A, Ownable, ReentrancyGuard {
    using ECDSA for bytes32;

    enum Status {
        Paused,
        WhitelistSale,
        PublicSale,
        Finished
    }

    Status public status;
    string public baseURI;
    string[] public baseURISet;
    address private _signer;
    address public marketingWallet;
    address public urlFlipper;
    uint256 public tokensReserved;
    uint256 public immutable maxMint;
    uint256 public immutable maxSupply;
    uint256 public immutable reserveAmount;
    uint256 public PRICE = 0.088 * 10**18; // 0.088 ETH

    mapping(address => bool) public publicMinted;
    mapping(address => bool) public whitelistMinted;

    event Minted(address minter, uint256 amount);
    event StatusChanged(Status status);
    event SignerChanged(address signer);
    event ReservedToken(address minter, address recipient, uint256 amount);
    event BaseURIChanged(string newBaseURI);

    constructor(
        string memory initBaseURI,
        address signer,
        address _marketingWallet,
        address _urlFlipper,
        uint256 _maxMint,
        uint256 _maxSupply,
        uint256 _reserveAmount
    ) ERC721A("FortuneDao", "Fortune", 66, _maxSupply) {
        baseURI = initBaseURI;
        _signer = signer;
        marketingWallet = _marketingWallet;
        urlFlipper = _urlFlipper;
        maxMint = _maxMint;
        maxSupply = _maxSupply;
        reserveAmount = _reserveAmount;
    }

    modifier onlyURLFlipper() {
        require(urlFlipper == _msgSender(), "Caller is not the url flipper");
        _;
    }

    function _hash(uint256 amount, address _address)
        public
        view
        returns (bytes32)
    {
        return keccak256(abi.encode(Strings.toString(amount), address(this), _address));
    }

    function _verify(bytes32 hash, bytes memory signature)
        internal
        view
        returns (bool)
    {
        return (_recover(hash, signature) == _signer);
    }

    function _recover(bytes32 hash, bytes memory signature)
        internal
        pure
        returns (address)
    {
        return hash.toEthSignedMessageHash().recover(signature);
    }

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

    function getBaseURISet() public view returns (string[] memory) {
        return baseURISet;
    }

    function reserve(address recipient, uint256 amount) external onlyOwner {
        require(amount > 0, "Amount too low");
        require(
            totalSupply() + amount <= collectionSize,
            "Max supply exceeded"
        );
        require(
            tokensReserved + amount <= reserveAmount,
            "Max reserve amount exceeded"
        );

        _safeMint(recipient, amount);
        tokensReserved += amount;
        emit ReservedToken(msg.sender, recipient, amount);
    }

    function whitelistMint(uint256 amount, bytes calldata signature)
        external
        payable
    {
        require(status == Status.WhitelistSale, "WhitelistSale is not active.");
        require(!whitelistMinted[msg.sender], "Already minted.");
        require(
            _verify(_hash(amount, msg.sender), signature),
            "Invalid signature."
        );
        require(PRICE * amount == msg.value, "Price incorrect.");
        require(
            numberMinted(msg.sender) + amount <= maxMint,
            "Max mint amount per wallet exceeded."
        );
        require(
            totalSupply() + amount + reserveAmount - tokensReserved <=
                collectionSize,
            "Max supply exceeded."
        );
        require(tx.origin == msg.sender, "Contract is not allowed to mint.");
        
        whitelistMinted[msg.sender] = true;
        _safeMint(msg.sender, amount);

        emit Minted(msg.sender, amount);
    }

    function mint() external payable {
        require(status == Status.PublicSale, "Public sale is not active.");
        require(tx.origin == msg.sender, "Contract is not allowed to mint.");
        require(!publicMinted[msg.sender], "Already minted.");
        require(
            totalSupply() + 1 + reserveAmount - tokensReserved <=
                collectionSize,
            "Max supply exceeded."
        );
        require(PRICE == msg.value, "Price incorrect.");

        publicMinted[msg.sender] = true;
        _safeMint(msg.sender, 1);

        emit Minted(msg.sender, 1);
    }

    function withdraw() external nonReentrant onlyOwner {
        uint256 balance = address(this).balance;
        (bool success1, ) = payable(marketingWallet).call{value: balance}("");
        require(success1, "Transfer failed.");
    }

    function setPRICE(uint256 newPRICE) external onlyOwner {
        PRICE = newPRICE;
    }

    function setBaseURI(string calldata newBaseURI) external onlyOwner {
        baseURI = newBaseURI;
        emit BaseURIChanged(newBaseURI);
    }

    function flipBaseURI(uint256 index) external onlyURLFlipper {
        require(index < baseURISet.length, "Index out of bound.");
        baseURI = baseURISet[index];
        emit BaseURIChanged(baseURI);
    }

    function setBaseURISet(string[] memory newBaseURISet) external onlyOwner {
        baseURISet = newBaseURISet;
    }

    function setStatus(Status _status) external onlyOwner {
        status = _status;
        emit StatusChanged(_status);
    }

    function setSigner(address signer) external onlyOwner {
        _signer = signer;
        emit SignerChanged(signer);
    }

    function setURLFlipper(address newUrlFlipper) external onlyOwner {
        urlFlipper = newUrlFlipper;
    }

    function setMarketingWallet(address newMarketingWallet) external onlyOwner {
        marketingWallet = newMarketingWallet;
    }

    function setOwnersExplicit(uint256 quantity)
        external
        onlyOwner
        nonReentrant
    {
        _setOwnersExplicit(quantity);
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"initBaseURI","type":"string"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"address","name":"_urlFlipper","type":"address"},{"internalType":"uint256","name":"_maxMint","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"string","name":"newBaseURI","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReservedToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"SignerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum FortuneDao.Status","name":"status","type":"uint8"}],"name":"StatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"_hash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"baseURISet","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"flipBaseURI","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":[],"name":"getBaseURISet","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"newBaseURISet","type":"string[]"}],"name":"setBaseURISet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPRICE","type":"uint256"}],"name":"setPRICE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum FortuneDao.Status","name":"_status","type":"uint8"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newUrlFlipper","type":"address"}],"name":"setURLFlipper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"enum FortuneDao.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":[],"name":"urlFlipper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610120604052600080556000600755670138a388a43c00006011553480156200002757600080fd5b5060405162004216380380620042168339810160408190526200004a9162000327565b6040518060400160405280600a815260200169466f7274756e6544616f60b01b81525060405180604001604052806007815260200166466f7274756e6560c81b81525060428460008111620000fd5760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b600082116200015f5760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b6064820152608401620000f4565b83516200017490600190602087019062000264565b5082516200018a90600290602086019062000264565b5060a09190915260805250620001a290503362000212565b60016009558651620001bc90600b9060208a019062000264565b50600d80546001600160a01b03199081166001600160a01b0398891617909155600e8054821696881696909617909555600f8054909516939095169290921790925560c09190915260e0526101005250620004ad565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000272906200045a565b90600052602060002090601f016020900481019282620002965760008555620002e1565b82601f10620002b157805160ff1916838001178555620002e1565b82800160010185558215620002e1579182015b82811115620002e1578251825591602001919060010190620002c4565b50620002ef929150620002f3565b5090565b5b80821115620002ef5760008155600101620002f4565b80516001600160a01b03811681146200032257600080fd5b919050565b600080600080600080600060e0888a0312156200034357600080fd5b87516001600160401b03808211156200035b57600080fd5b818a0191508a601f8301126200037057600080fd5b81518181111562000385576200038562000497565b604051601f8201601f19908116603f01168101908382118183101715620003b057620003b062000497565b81604052828152602093508d84848701011115620003cd57600080fd5b600091505b82821015620003f15784820184015181830185015290830190620003d2565b82821115620004035760008484830101525b9a50620004159150508a82016200030a565b9750505062000427604089016200030a565b945062000437606089016200030a565b93506080880151925060a0880151915060c0880151905092959891949750929550565b600181811c908216806200046f57607f821691505b602082108114156200049157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160a05160c05160e05161010051613cde620005386000396000818161054001528181610e4901528181611a060152611e1f0152600061086b01526000818161067e0152611953015260008181612783015281816127ad0152612b9d015260008181610e25015281816119e201528181611da60152818161248401526124b60152613cde6000f3fe6080604052600436106102ad5760003560e01c8063661bdc4b116101755780639e852f75116100dc578063cd2e50da11610095578063dc33e6811161006f578063dc33e681146108a3578063e985e9c5146108c3578063eea52d381461090c578063f2fde38b1461092c57600080fd5b8063cd2e50da14610839578063d5abeb0114610859578063d7224ba01461088d57600080fd5b80639e852f7514610786578063a22cb46514610799578063b88d4fde146107b9578063c6d91225146107d9578063c87b56dd146107f9578063cc47a40b1461081957600080fd5b806375f0a8741161012e57806375f0a874146106a05780638d859f3e146106c05780638da5cb5b146106d65780639231ab2a146106f457806395d89b411461074157806398a8cffe1461075657600080fd5b8063661bdc4b146105e25780636c0360eb146106025780636c19e7831461061757806370a0823114610637578063715018a6146106575780637501f7411461066c57600080fd5b80632d20fb6011610219578063433adb05116101d2578063433adb05146105185780634b09b72a1461052e5780634f6ccce71461056257806355f804b3146105825780635d098b38146105a25780636352211e146105c257600080fd5b80632d20fb60146104635780632e49d78b146104835780632f745c59146104a35780633576e85f146104c35780633ccfd60b146104e357806342842e0e146104f857600080fd5b80631015805b1161026b5780631015805b146103a55780631249c58b146103d5578063152e4893146103dd57806318160ddd146103fd578063200d2ed21461041c57806323b872dd1461044357600080fd5b806248ac86146102b257806301ffc9a7146102d457806306fdde0314610309578063081812fc1461032b578063095ea7b3146103635780630b5c33b814610383575b600080fd5b3480156102be57600080fd5b506102d26102cd36600461346b565b61094c565b005b3480156102e057600080fd5b506102f46102ef3660046136b1565b6109a1565b60405190151581526020015b60405180910390f35b34801561031557600080fd5b5061031e610a0e565b6040516103009190613925565b34801561033757600080fd5b5061034b61034636600461374d565b610aa0565b6040516001600160a01b039091168152602001610300565b34801561036f57600080fd5b506102d261037e3660046135ac565b610b2b565b34801561038f57600080fd5b50610398610c43565b604051610300919061386c565b3480156103b157600080fd5b506102f46103c036600461346b565b60126020526000908152604090205460ff1681565b6102d2610d1c565b3480156103e957600080fd5b50600f5461034b906001600160a01b031681565b34801561040957600080fd5b506000545b604051908152602001610300565b34801561042857600080fd5b50600a546104369060ff1681565b60405161030091906138ce565b34801561044f57600080fd5b506102d261045e3660046134b9565b610f7b565b34801561046f57600080fd5b506102d261047e36600461374d565b610f86565b34801561048f57600080fd5b506102d261049e3660046136eb565b611019565b3480156104af57600080fd5b5061040e6104be3660046135ac565b6110a1565b3480156104cf57600080fd5b5061040e6104de366004613766565b61120e565b3480156104ef57600080fd5b506102d261124b565b34801561050457600080fd5b506102d26105133660046134b9565b611370565b34801561052457600080fd5b5061040e60105481565b34801561053a57600080fd5b5061040e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561056e57600080fd5b5061040e61057d36600461374d565b61138b565b34801561058e57600080fd5b506102d261059d36600461370c565b6113ed565b3480156105ae57600080fd5b506102d26105bd36600461346b565b611461565b3480156105ce57600080fd5b5061034b6105dd36600461374d565b6114ad565b3480156105ee57600080fd5b506102d26105fd36600461374d565b6114bf565b34801561060e57600080fd5b5061031e6115c7565b34801561062357600080fd5b506102d261063236600461346b565b611655565b34801561064357600080fd5b5061040e61065236600461346b565b6116cd565b34801561066357600080fd5b506102d261175e565b34801561067857600080fd5b5061040e7f000000000000000000000000000000000000000000000000000000000000000081565b3480156106ac57600080fd5b50600e5461034b906001600160a01b031681565b3480156106cc57600080fd5b5061040e60115481565b3480156106e257600080fd5b506008546001600160a01b031661034b565b34801561070057600080fd5b5061071461070f36600461374d565b611794565b6040805182516001600160a01b031681526020928301516001600160401b03169281019290925201610300565b34801561074d57600080fd5b5061031e6117b1565b34801561076257600080fd5b506102f461077136600461346b565b60136020526000908152604090205460ff1681565b6102d2610794366004613789565b6117c0565b3480156107a557600080fd5b506102d26107b4366004613570565b611b43565b3480156107c557600080fd5b506102d26107d43660046134f5565b611c08565b3480156107e557600080fd5b5061031e6107f436600461374d565b611c41565b34801561080557600080fd5b5061031e61081436600461374d565b611c6c565b34801561082557600080fd5b506102d26108343660046135ac565b611d39565b34801561084557600080fd5b506102d26108543660046135d6565b611f01565b34801561086557600080fd5b5061040e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561089957600080fd5b5061040e60075481565b3480156108af57600080fd5b5061040e6108be36600461346b565b611f42565b3480156108cf57600080fd5b506102f46108de366004613486565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561091857600080fd5b506102d261092736600461374d565b611f4d565b34801561093857600080fd5b506102d261094736600461346b565b611f7c565b6008546001600160a01b0316331461097f5760405162461bcd60e51b815260040161097690613a13565b60405180910390fd5b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b14806109d257506001600160e01b03198216635b5e139f60e01b145b806109ed57506001600160e01b0319821663780e9d6360e01b145b80610a0857506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610a1d90613bba565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4990613bba565b8015610a965780601f10610a6b57610100808354040283529160200191610a96565b820191906000526020600020905b815481529060010190602001808311610a7957829003601f168201915b5050505050905090565b6000610aad826000541190565b610b0f5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610976565b506000908152600560205260409020546001600160a01b031690565b6000610b36826114ad565b9050806001600160a01b0316836001600160a01b03161415610ba55760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610976565b336001600160a01b0382161480610bc15750610bc181336108de565b610c335760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610976565b610c3e838383612017565b505050565b6060600c805480602002602001604051908101604052809291908181526020016000905b82821015610d13578382906000526020600020018054610c8690613bba565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb290613bba565b8015610cff5780601f10610cd457610100808354040283529160200191610cff565b820191906000526020600020905b815481529060010190602001808311610ce257829003601f168201915b505050505081526020019060010190610c67565b50505050905090565b6002600a5460ff166003811115610d3557610d35613c50565b14610d825760405162461bcd60e51b815260206004820152601a60248201527f5075626c69632073616c65206973206e6f74206163746976652e0000000000006044820152606401610976565b323314610dd15760405162461bcd60e51b815260206004820181905260248201527f436f6e7472616374206973206e6f7420616c6c6f77656420746f206d696e742e6044820152606401610976565b3360009081526012602052604090205460ff1615610e235760405162461bcd60e51b815260206004820152600f60248201526e20b63932b0b23c9036b4b73a32b21760891b6044820152606401610976565b7f00000000000000000000000000000000000000000000000000000000000000006010547f0000000000000000000000000000000000000000000000000000000000000000610e7160005490565b610e7c906001613aed565b610e869190613aed565b610e909190613b60565b1115610ed55760405162461bcd60e51b815260206004820152601460248201527326b0bc1039bab838363c9032bc31b2b2b232b21760611b6044820152606401610976565b3460115414610f195760405162461bcd60e51b815260206004820152601060248201526f283934b1b29034b731b7b93932b1ba1760811b6044820152606401610976565b336000818152601260205260409020805460ff19166001908117909155610f409190612073565b60408051338152600160208201527f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe910160405180910390a1565b610c3e83838361208d565b6008546001600160a01b03163314610fb05760405162461bcd60e51b815260040161097690613a13565b600260095414156110035760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610976565b600260095561101181612413565b506001600955565b6008546001600160a01b031633146110435760405162461bcd60e51b815260040161097690613a13565b600a805482919060ff1916600183600381111561106257611062613c50565b02179055507fafa725e7f44cadb687a7043853fa1a7e7b8f0da74ce87ec546e9420f04da8c1e8160405161109691906138ce565b60405180910390a150565b60006110ac836116cd565b82106111055760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610976565b600080549080805b838110156111ae576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561115f57805192505b876001600160a01b0316836001600160a01b0316141561119b578684141561118d57509350610a0892505050565b8361119781613bf5565b9450505b50806111a681613bf5565b91505061110d565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610976565b6000611219836125fc565b308360405160200161122d93929190613938565b60405160208183030381529060405280519060200120905092915050565b6002600954141561129e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610976565b60026009556008546001600160a01b031633146112cd5760405162461bcd60e51b815260040161097690613a13565b600e5460405147916000916001600160a01b039091169083908381818185875af1925050503d806000811461131e576040519150601f19603f3d011682016040523d82523d6000602084013e611323565b606091505b50509050806113675760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610976565b50506001600955565b610c3e83838360405180602001604052806000815250611c08565b6000805482106113e95760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610976565b5090565b6008546001600160a01b031633146114175760405162461bcd60e51b815260040161097690613a13565b611423600b8383613183565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf682826040516114559291906138f6565b60405180910390a15050565b6008546001600160a01b0316331461148b5760405162461bcd60e51b815260040161097690613a13565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60006114b882612701565b5192915050565b600f546001600160a01b031633146115195760405162461bcd60e51b815260206004820152601d60248201527f43616c6c6572206973206e6f74207468652075726c20666c69707065720000006044820152606401610976565b600c5481106115605760405162461bcd60e51b815260206004820152601360248201527224b73232bc1037baba1037b3103137bab7321760691b6044820152606401610976565b600c818154811061157357611573613c66565b90600052602060002001600b90805461158b90613bba565b611596929190613203565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6600b604051611096919061396b565b600b80546115d490613bba565b80601f016020809104026020016040519081016040528092919081815260200182805461160090613bba565b801561164d5780601f106116225761010080835404028352916020019161164d565b820191906000526020600020905b81548152906001019060200180831161163057829003601f168201915b505050505081565b6008546001600160a01b0316331461167f5760405162461bcd60e51b815260040161097690613a13565b600d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f5719a5656c5cfdaafa148ecf366fd3b0a7fae06449ce2a46225977fb7417e29d90602001611096565b60006001600160a01b0382166117395760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610976565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6008546001600160a01b031633146117885760405162461bcd60e51b815260040161097690613a13565b61179260006128aa565b565b6040805180820190915260008082526020820152610a0882612701565b606060028054610a1d90613bba565b6001600a5460ff1660038111156117d9576117d9613c50565b146118265760405162461bcd60e51b815260206004820152601c60248201527f57686974656c69737453616c65206973206e6f74206163746976652e000000006044820152606401610976565b3360009081526013602052604090205460ff16156118785760405162461bcd60e51b815260206004820152600f60248201526e20b63932b0b23c9036b4b73a32b21760891b6044820152606401610976565b6118c1611885843361120e565b83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506128fc92505050565b6119025760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21039b4b3b730ba3ab9329760711b6044820152606401610976565b34836011546119119190613b19565b146119515760405162461bcd60e51b815260206004820152601060248201526f283934b1b29034b731b7b93932b1ba1760811b6044820152606401610976565b7f00000000000000000000000000000000000000000000000000000000000000008361197c33611f42565b6119869190613aed565b11156119e05760405162461bcd60e51b8152602060048201526024808201527f4d6178206d696e7420616d6f756e74207065722077616c6c65742065786365656044820152633232b21760e11b6064820152608401610976565b7f00000000000000000000000000000000000000000000000000000000000000006010547f000000000000000000000000000000000000000000000000000000000000000085611a2f60005490565b611a399190613aed565b611a439190613aed565b611a4d9190613b60565b1115611a925760405162461bcd60e51b815260206004820152601460248201527326b0bc1039bab838363c9032bc31b2b2b232b21760611b6044820152606401610976565b323314611ae15760405162461bcd60e51b815260206004820181905260248201527f436f6e7472616374206973206e6f7420616c6c6f77656420746f206d696e742e6044820152606401610976565b336000818152601360205260409020805460ff19166001179055611b059084612073565b60408051338152602081018590527f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe910160405180910390a1505050565b6001600160a01b038216331415611b9c5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610976565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611c1384848461208d565b611c1f84848484612926565b611c3b5760405162461bcd60e51b815260040161097690613a48565b50505050565b600c8181548110611c5157600080fd5b9060005260206000200160009150905080546115d490613bba565b6060611c79826000541190565b611cdd5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610976565b6000611ce7612a33565b90506000815111611d075760405180602001604052806000815250611d32565b80611d11846125fc565b604051602001611d22929190613800565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314611d635760405162461bcd60e51b815260040161097690613a13565b60008111611da45760405162461bcd60e51b815260206004820152600e60248201526d416d6f756e7420746f6f206c6f7760901b6044820152606401610976565b7f000000000000000000000000000000000000000000000000000000000000000081611dcf60005490565b611dd99190613aed565b1115611e1d5760405162461bcd60e51b815260206004820152601360248201527213585e081cdd5c1c1b1e48195e18d959591959606a1b6044820152606401610976565b7f000000000000000000000000000000000000000000000000000000000000000081601054611e4c9190613aed565b1115611e9a5760405162461bcd60e51b815260206004820152601b60248201527f4d6178207265736572766520616d6f756e7420657863656564656400000000006044820152606401610976565b611ea48282612073565b8060106000828254611eb69190613aed565b9091555050604080513381526001600160a01b03841660208201529081018290527fd729ebd340be850113adba35e3218ac6bd77c375ce35c256e3493fdf30b99f3e90606001611455565b6008546001600160a01b03163314611f2b5760405162461bcd60e51b815260040161097690613a13565b8051611f3e90600c90602084019061327e565b5050565b6000610a0882612a42565b6008546001600160a01b03163314611f775760405162461bcd60e51b815260040161097690613a13565b601155565b6008546001600160a01b03163314611fa65760405162461bcd60e51b815260040161097690613a13565b6001600160a01b03811661200b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610976565b612014816128aa565b50565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b611f3e828260405180602001604052806000815250612ae0565b600061209882612701565b80519091506000906001600160a01b0316336001600160a01b031614806120cf5750336120c484610aa0565b6001600160a01b0316145b806120e1575081516120e190336108de565b90508061214b5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610976565b846001600160a01b031682600001516001600160a01b0316146121bf5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610976565b6001600160a01b0384166122235760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610976565b6122336000848460000151612017565b6001600160a01b03851660009081526004602052604081208054600192906122659084906001600160801b0316613b38565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b038616600090815260046020526040812080546001945090926122b191859116613acb565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055612338846001613aed565b6000818152600360205260409020549091506001600160a01b03166123c957612362816000541190565b156123c95760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600754816124635760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006044820152606401610976565b600060016124718484613aed565b61247b9190613b60565b90506124a860017f0000000000000000000000000000000000000000000000000000000000000000613b60565b8111156124dd576124da60017f0000000000000000000000000000000000000000000000000000000000000000613b60565b90505b6124e8816000541190565b6125435760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b6064820152608401610976565b815b8181116125e8576000818152600360205260409020546001600160a01b03166125d657600061257382612701565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600390965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b806125e081613bf5565b915050612545565b506125f4816001613aed565b600755505050565b6060816126205750506040805180820190915260018152600360fc1b602082015290565b8160005b811561264a578061263481613bf5565b91506126439050600a83613b05565b9150612624565b6000816001600160401b0381111561266457612664613c7c565b6040519080825280601f01601f19166020018201604052801561268e576020820181803683370190505b5090505b84156126f9576126a3600183613b60565b91506126b0600a86613c10565b6126bb906030613aed565b60f81b8183815181106126d0576126d0613c66565b60200101906001600160f81b031916908160001a9053506126f2600a86613b05565b9450612692565b949350505050565b6040805180820190915260008082526020820152612720826000541190565b61277f5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610976565b60007f000000000000000000000000000000000000000000000000000000000000000083106127e0576127d27f000000000000000000000000000000000000000000000000000000000000000084613b60565b6127dd906001613aed565b90505b825b818110612849576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561283657949350505050565b508061284181613ba3565b9150506127e2565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610976565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600d546000906001600160a01b03166129158484612dba565b6001600160a01b0316149392505050565b60006001600160a01b0384163b15612a2857604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061296a90339089908890889060040161382f565b602060405180830381600087803b15801561298457600080fd5b505af19250505080156129b4575060408051601f3d908101601f191682019092526129b1918101906136ce565b60015b612a0e573d8080156129e2576040519150601f19603f3d011682016040523d82523d6000602084013e6129e7565b606091505b508051612a065760405162461bcd60e51b815260040161097690613a48565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506126f9565b506001949350505050565b6060600b8054610a1d90613bba565b60006001600160a01b038216612ab45760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610976565b506001600160a01b0316600090815260046020526040902054600160801b90046001600160801b031690565b6000546001600160a01b038416612b435760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610976565b612b4e816000541190565b15612b9b5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610976565b7f0000000000000000000000000000000000000000000000000000000000000000831115612c165760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610976565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612c72908790613acb565b6001600160801b03168152602001858360200151612c909190613acb565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612daf5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612d736000888488612926565b612d8f5760405162461bcd60e51b815260040161097690613a48565b81612d9981613bf5565b9250508080612da790613bf5565b915050612d26565b50600081905561240b565b6000611d3282612e17856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b906000806000612e278585612e3c565b91509150612e3481612eac565b509392505050565b600080825160411415612e735760208301516040840151606085015160001a612e6787828585613067565b94509450505050612ea5565b825160401415612e9d5760208301516040840151612e92868383613154565b935093505050612ea5565b506000905060025b9250929050565b6000816004811115612ec057612ec0613c50565b1415612ec95750565b6001816004811115612edd57612edd613c50565b1415612f2b5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610976565b6002816004811115612f3f57612f3f613c50565b1415612f8d5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610976565b6003816004811115612fa157612fa1613c50565b1415612ffa5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610976565b600481600481111561300e5761300e613c50565b14156120145760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610976565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561309e575060009050600361314b565b8460ff16601b141580156130b657508460ff16601c14155b156130c7575060009050600461314b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561311b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166131445760006001925092505061314b565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161317587828885613067565b935093505050935093915050565b82805461318f90613bba565b90600052602060002090601f0160209004810192826131b157600085556131f7565b82601f106131ca5782800160ff198235161785556131f7565b828001600101855582156131f7579182015b828111156131f75782358255916020019190600101906131dc565b506113e99291506132d7565b82805461320f90613bba565b90600052602060002090601f01602090048101928261323157600085556131f7565b82601f1061324257805485556131f7565b828001600101855582156131f757600052602060002091601f016020900482015b828111156131f7578254825591600101919060010190613263565b8280548282559060005260206000209081019282156132cb579160200282015b828111156132cb57825180516132bb9184916020909101906132ec565b509160200191906001019061329e565b506113e9929150613360565b5b808211156113e957600081556001016132d8565b8280546132f890613bba565b90600052602060002090601f01602090048101928261331a57600085556131f7565b82601f1061333357805160ff19168380011785556131f7565b828001600101855582156131f7579182015b828111156131f7578251825591602001919060010190613345565b808211156113e9576000613374828261337d565b50600101613360565b50805461338990613bba565b6000825580601f10613399575050565b601f01602090049060005260206000209081019061201491906132d7565b60006001600160401b038311156133d0576133d0613c7c565b6133e3601f8401601f1916602001613a9b565b90508281528383830111156133f757600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461342557600080fd5b919050565b60008083601f84011261343c57600080fd5b5081356001600160401b0381111561345357600080fd5b602083019150836020828501011115612ea557600080fd5b60006020828403121561347d57600080fd5b611d328261340e565b6000806040838503121561349957600080fd5b6134a28361340e565b91506134b06020840161340e565b90509250929050565b6000806000606084860312156134ce57600080fd5b6134d78461340e565b92506134e56020850161340e565b9150604084013590509250925092565b6000806000806080858703121561350b57600080fd5b6135148561340e565b93506135226020860161340e565b92506040850135915060608501356001600160401b0381111561354457600080fd5b8501601f8101871361355557600080fd5b613564878235602084016133b7565b91505092959194509250565b6000806040838503121561358357600080fd5b61358c8361340e565b9150602083013580151581146135a157600080fd5b809150509250929050565b600080604083850312156135bf57600080fd5b6135c88361340e565b946020939093013593505050565b600060208083850312156135e957600080fd5b82356001600160401b038082111561360057600080fd5b818501915085601f83011261361457600080fd5b81358181111561362657613626613c7c565b8060051b613635858201613a9b565b8281528581019085870183870188018b101561365057600080fd5b600093505b848410156136a35780358681111561366c57600080fd5b8701603f81018c1361367d57600080fd5b61368e8c8a830135604084016133b7565b84525060019390930192918701918701613655565b509998505050505050505050565b6000602082840312156136c357600080fd5b8135611d3281613c92565b6000602082840312156136e057600080fd5b8151611d3281613c92565b6000602082840312156136fd57600080fd5b813560048110611d3257600080fd5b6000806020838503121561371f57600080fd5b82356001600160401b0381111561373557600080fd5b6137418582860161342a565b90969095509350505050565b60006020828403121561375f57600080fd5b5035919050565b6000806040838503121561377957600080fd5b823591506134b06020840161340e565b60008060006040848603121561379e57600080fd5b8335925060208401356001600160401b038111156137bb57600080fd5b6137c78682870161342a565b9497909650939450505050565b600081518084526137ec816020860160208601613b77565b601f01601f19169290920160200192915050565b60008351613812818460208801613b77565b835190830190613826818360208801613b77565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613862908301846137d4565b9695505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156138c157603f198886030184526138af8583516137d4565b94509285019290850190600101613893565b5092979650505050505050565b60208101600483106138f057634e487b7160e01b600052602160045260246000fd5b91905290565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b602081526000611d3260208301846137d4565b60608152600061394b60608301866137d4565b6001600160a01b0394851660208401529290931660409091015292915050565b600060208083526000845481600182811c91508083168061398d57607f831692505b8583108114156139ab57634e487b7160e01b85526022600452602485fd5b8786018381526020018180156139c857600181146139d957613a04565b60ff19861682528782019650613a04565b60008b81526020902060005b868110156139fe578154848201529085019089016139e5565b83019750505b50949998505050505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715613ac357613ac3613c7c565b604052919050565b60006001600160801b0380831681851680830382111561382657613826613c24565b60008219821115613b0057613b00613c24565b500190565b600082613b1457613b14613c3a565b500490565b6000816000190483118215151615613b3357613b33613c24565b500290565b60006001600160801b0383811690831681811015613b5857613b58613c24565b039392505050565b600082821015613b7257613b72613c24565b500390565b60005b83811015613b92578181015183820152602001613b7a565b83811115611c3b5750506000910152565b600081613bb257613bb2613c24565b506000190190565b600181811c90821680613bce57607f821691505b60208210811415613bef57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613c0957613c09613c24565b5060010190565b600082613c1f57613c1f613c3a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461201457600080fdfea2646970667358221220de4aaf1b7f2c402e1a01ded4dbdb21c10fd1b806e2b16337a588c9c258431d4a64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000a6d9e1682dca1080463caea9470d775ec208b6dc000000000000000000000000fd082ab802849980e4a07297ad7ef0e2a94a0a530000000000000000000000008800c372be46527c87167aa122f3c984d4f47f630000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000029b0000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000001f68747470733a2f2f666f7274756e6564616f2e696f2f6d657461646174612f00

Deployed Bytecode

0x6080604052600436106102ad5760003560e01c8063661bdc4b116101755780639e852f75116100dc578063cd2e50da11610095578063dc33e6811161006f578063dc33e681146108a3578063e985e9c5146108c3578063eea52d381461090c578063f2fde38b1461092c57600080fd5b8063cd2e50da14610839578063d5abeb0114610859578063d7224ba01461088d57600080fd5b80639e852f7514610786578063a22cb46514610799578063b88d4fde146107b9578063c6d91225146107d9578063c87b56dd146107f9578063cc47a40b1461081957600080fd5b806375f0a8741161012e57806375f0a874146106a05780638d859f3e146106c05780638da5cb5b146106d65780639231ab2a146106f457806395d89b411461074157806398a8cffe1461075657600080fd5b8063661bdc4b146105e25780636c0360eb146106025780636c19e7831461061757806370a0823114610637578063715018a6146106575780637501f7411461066c57600080fd5b80632d20fb6011610219578063433adb05116101d2578063433adb05146105185780634b09b72a1461052e5780634f6ccce71461056257806355f804b3146105825780635d098b38146105a25780636352211e146105c257600080fd5b80632d20fb60146104635780632e49d78b146104835780632f745c59146104a35780633576e85f146104c35780633ccfd60b146104e357806342842e0e146104f857600080fd5b80631015805b1161026b5780631015805b146103a55780631249c58b146103d5578063152e4893146103dd57806318160ddd146103fd578063200d2ed21461041c57806323b872dd1461044357600080fd5b806248ac86146102b257806301ffc9a7146102d457806306fdde0314610309578063081812fc1461032b578063095ea7b3146103635780630b5c33b814610383575b600080fd5b3480156102be57600080fd5b506102d26102cd36600461346b565b61094c565b005b3480156102e057600080fd5b506102f46102ef3660046136b1565b6109a1565b60405190151581526020015b60405180910390f35b34801561031557600080fd5b5061031e610a0e565b6040516103009190613925565b34801561033757600080fd5b5061034b61034636600461374d565b610aa0565b6040516001600160a01b039091168152602001610300565b34801561036f57600080fd5b506102d261037e3660046135ac565b610b2b565b34801561038f57600080fd5b50610398610c43565b604051610300919061386c565b3480156103b157600080fd5b506102f46103c036600461346b565b60126020526000908152604090205460ff1681565b6102d2610d1c565b3480156103e957600080fd5b50600f5461034b906001600160a01b031681565b34801561040957600080fd5b506000545b604051908152602001610300565b34801561042857600080fd5b50600a546104369060ff1681565b60405161030091906138ce565b34801561044f57600080fd5b506102d261045e3660046134b9565b610f7b565b34801561046f57600080fd5b506102d261047e36600461374d565b610f86565b34801561048f57600080fd5b506102d261049e3660046136eb565b611019565b3480156104af57600080fd5b5061040e6104be3660046135ac565b6110a1565b3480156104cf57600080fd5b5061040e6104de366004613766565b61120e565b3480156104ef57600080fd5b506102d261124b565b34801561050457600080fd5b506102d26105133660046134b9565b611370565b34801561052457600080fd5b5061040e60105481565b34801561053a57600080fd5b5061040e7f000000000000000000000000000000000000000000000000000000000000004381565b34801561056e57600080fd5b5061040e61057d36600461374d565b61138b565b34801561058e57600080fd5b506102d261059d36600461370c565b6113ed565b3480156105ae57600080fd5b506102d26105bd36600461346b565b611461565b3480156105ce57600080fd5b5061034b6105dd36600461374d565b6114ad565b3480156105ee57600080fd5b506102d26105fd36600461374d565b6114bf565b34801561060e57600080fd5b5061031e6115c7565b34801561062357600080fd5b506102d261063236600461346b565b611655565b34801561064357600080fd5b5061040e61065236600461346b565b6116cd565b34801561066357600080fd5b506102d261175e565b34801561067857600080fd5b5061040e7f000000000000000000000000000000000000000000000000000000000000000281565b3480156106ac57600080fd5b50600e5461034b906001600160a01b031681565b3480156106cc57600080fd5b5061040e60115481565b3480156106e257600080fd5b506008546001600160a01b031661034b565b34801561070057600080fd5b5061071461070f36600461374d565b611794565b6040805182516001600160a01b031681526020928301516001600160401b03169281019290925201610300565b34801561074d57600080fd5b5061031e6117b1565b34801561076257600080fd5b506102f461077136600461346b565b60136020526000908152604090205460ff1681565b6102d2610794366004613789565b6117c0565b3480156107a557600080fd5b506102d26107b4366004613570565b611b43565b3480156107c557600080fd5b506102d26107d43660046134f5565b611c08565b3480156107e557600080fd5b5061031e6107f436600461374d565b611c41565b34801561080557600080fd5b5061031e61081436600461374d565b611c6c565b34801561082557600080fd5b506102d26108343660046135ac565b611d39565b34801561084557600080fd5b506102d26108543660046135d6565b611f01565b34801561086557600080fd5b5061040e7f000000000000000000000000000000000000000000000000000000000000029b81565b34801561089957600080fd5b5061040e60075481565b3480156108af57600080fd5b5061040e6108be36600461346b565b611f42565b3480156108cf57600080fd5b506102f46108de366004613486565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561091857600080fd5b506102d261092736600461374d565b611f4d565b34801561093857600080fd5b506102d261094736600461346b565b611f7c565b6008546001600160a01b0316331461097f5760405162461bcd60e51b815260040161097690613a13565b60405180910390fd5b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b14806109d257506001600160e01b03198216635b5e139f60e01b145b806109ed57506001600160e01b0319821663780e9d6360e01b145b80610a0857506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610a1d90613bba565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4990613bba565b8015610a965780601f10610a6b57610100808354040283529160200191610a96565b820191906000526020600020905b815481529060010190602001808311610a7957829003601f168201915b5050505050905090565b6000610aad826000541190565b610b0f5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610976565b506000908152600560205260409020546001600160a01b031690565b6000610b36826114ad565b9050806001600160a01b0316836001600160a01b03161415610ba55760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610976565b336001600160a01b0382161480610bc15750610bc181336108de565b610c335760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610976565b610c3e838383612017565b505050565b6060600c805480602002602001604051908101604052809291908181526020016000905b82821015610d13578382906000526020600020018054610c8690613bba565b80601f0160208091040260200160405190810160405280929190818152602001828054610cb290613bba565b8015610cff5780601f10610cd457610100808354040283529160200191610cff565b820191906000526020600020905b815481529060010190602001808311610ce257829003601f168201915b505050505081526020019060010190610c67565b50505050905090565b6002600a5460ff166003811115610d3557610d35613c50565b14610d825760405162461bcd60e51b815260206004820152601a60248201527f5075626c69632073616c65206973206e6f74206163746976652e0000000000006044820152606401610976565b323314610dd15760405162461bcd60e51b815260206004820181905260248201527f436f6e7472616374206973206e6f7420616c6c6f77656420746f206d696e742e6044820152606401610976565b3360009081526012602052604090205460ff1615610e235760405162461bcd60e51b815260206004820152600f60248201526e20b63932b0b23c9036b4b73a32b21760891b6044820152606401610976565b7f000000000000000000000000000000000000000000000000000000000000029b6010547f0000000000000000000000000000000000000000000000000000000000000043610e7160005490565b610e7c906001613aed565b610e869190613aed565b610e909190613b60565b1115610ed55760405162461bcd60e51b815260206004820152601460248201527326b0bc1039bab838363c9032bc31b2b2b232b21760611b6044820152606401610976565b3460115414610f195760405162461bcd60e51b815260206004820152601060248201526f283934b1b29034b731b7b93932b1ba1760811b6044820152606401610976565b336000818152601260205260409020805460ff19166001908117909155610f409190612073565b60408051338152600160208201527f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe910160405180910390a1565b610c3e83838361208d565b6008546001600160a01b03163314610fb05760405162461bcd60e51b815260040161097690613a13565b600260095414156110035760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610976565b600260095561101181612413565b506001600955565b6008546001600160a01b031633146110435760405162461bcd60e51b815260040161097690613a13565b600a805482919060ff1916600183600381111561106257611062613c50565b02179055507fafa725e7f44cadb687a7043853fa1a7e7b8f0da74ce87ec546e9420f04da8c1e8160405161109691906138ce565b60405180910390a150565b60006110ac836116cd565b82106111055760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610976565b600080549080805b838110156111ae576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561115f57805192505b876001600160a01b0316836001600160a01b0316141561119b578684141561118d57509350610a0892505050565b8361119781613bf5565b9450505b50806111a681613bf5565b91505061110d565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610976565b6000611219836125fc565b308360405160200161122d93929190613938565b60405160208183030381529060405280519060200120905092915050565b6002600954141561129e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610976565b60026009556008546001600160a01b031633146112cd5760405162461bcd60e51b815260040161097690613a13565b600e5460405147916000916001600160a01b039091169083908381818185875af1925050503d806000811461131e576040519150601f19603f3d011682016040523d82523d6000602084013e611323565b606091505b50509050806113675760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610976565b50506001600955565b610c3e83838360405180602001604052806000815250611c08565b6000805482106113e95760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610976565b5090565b6008546001600160a01b031633146114175760405162461bcd60e51b815260040161097690613a13565b611423600b8383613183565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf682826040516114559291906138f6565b60405180910390a15050565b6008546001600160a01b0316331461148b5760405162461bcd60e51b815260040161097690613a13565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60006114b882612701565b5192915050565b600f546001600160a01b031633146115195760405162461bcd60e51b815260206004820152601d60248201527f43616c6c6572206973206e6f74207468652075726c20666c69707065720000006044820152606401610976565b600c5481106115605760405162461bcd60e51b815260206004820152601360248201527224b73232bc1037baba1037b3103137bab7321760691b6044820152606401610976565b600c818154811061157357611573613c66565b90600052602060002001600b90805461158b90613bba565b611596929190613203565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6600b604051611096919061396b565b600b80546115d490613bba565b80601f016020809104026020016040519081016040528092919081815260200182805461160090613bba565b801561164d5780601f106116225761010080835404028352916020019161164d565b820191906000526020600020905b81548152906001019060200180831161163057829003601f168201915b505050505081565b6008546001600160a01b0316331461167f5760405162461bcd60e51b815260040161097690613a13565b600d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f5719a5656c5cfdaafa148ecf366fd3b0a7fae06449ce2a46225977fb7417e29d90602001611096565b60006001600160a01b0382166117395760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610976565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6008546001600160a01b031633146117885760405162461bcd60e51b815260040161097690613a13565b61179260006128aa565b565b6040805180820190915260008082526020820152610a0882612701565b606060028054610a1d90613bba565b6001600a5460ff1660038111156117d9576117d9613c50565b146118265760405162461bcd60e51b815260206004820152601c60248201527f57686974656c69737453616c65206973206e6f74206163746976652e000000006044820152606401610976565b3360009081526013602052604090205460ff16156118785760405162461bcd60e51b815260206004820152600f60248201526e20b63932b0b23c9036b4b73a32b21760891b6044820152606401610976565b6118c1611885843361120e565b83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506128fc92505050565b6119025760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21039b4b3b730ba3ab9329760711b6044820152606401610976565b34836011546119119190613b19565b146119515760405162461bcd60e51b815260206004820152601060248201526f283934b1b29034b731b7b93932b1ba1760811b6044820152606401610976565b7f00000000000000000000000000000000000000000000000000000000000000028361197c33611f42565b6119869190613aed565b11156119e05760405162461bcd60e51b8152602060048201526024808201527f4d6178206d696e7420616d6f756e74207065722077616c6c65742065786365656044820152633232b21760e11b6064820152608401610976565b7f000000000000000000000000000000000000000000000000000000000000029b6010547f000000000000000000000000000000000000000000000000000000000000004385611a2f60005490565b611a399190613aed565b611a439190613aed565b611a4d9190613b60565b1115611a925760405162461bcd60e51b815260206004820152601460248201527326b0bc1039bab838363c9032bc31b2b2b232b21760611b6044820152606401610976565b323314611ae15760405162461bcd60e51b815260206004820181905260248201527f436f6e7472616374206973206e6f7420616c6c6f77656420746f206d696e742e6044820152606401610976565b336000818152601360205260409020805460ff19166001179055611b059084612073565b60408051338152602081018590527f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe910160405180910390a1505050565b6001600160a01b038216331415611b9c5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610976565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611c1384848461208d565b611c1f84848484612926565b611c3b5760405162461bcd60e51b815260040161097690613a48565b50505050565b600c8181548110611c5157600080fd5b9060005260206000200160009150905080546115d490613bba565b6060611c79826000541190565b611cdd5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610976565b6000611ce7612a33565b90506000815111611d075760405180602001604052806000815250611d32565b80611d11846125fc565b604051602001611d22929190613800565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314611d635760405162461bcd60e51b815260040161097690613a13565b60008111611da45760405162461bcd60e51b815260206004820152600e60248201526d416d6f756e7420746f6f206c6f7760901b6044820152606401610976565b7f000000000000000000000000000000000000000000000000000000000000029b81611dcf60005490565b611dd99190613aed565b1115611e1d5760405162461bcd60e51b815260206004820152601360248201527213585e081cdd5c1c1b1e48195e18d959591959606a1b6044820152606401610976565b7f000000000000000000000000000000000000000000000000000000000000004381601054611e4c9190613aed565b1115611e9a5760405162461bcd60e51b815260206004820152601b60248201527f4d6178207265736572766520616d6f756e7420657863656564656400000000006044820152606401610976565b611ea48282612073565b8060106000828254611eb69190613aed565b9091555050604080513381526001600160a01b03841660208201529081018290527fd729ebd340be850113adba35e3218ac6bd77c375ce35c256e3493fdf30b99f3e90606001611455565b6008546001600160a01b03163314611f2b5760405162461bcd60e51b815260040161097690613a13565b8051611f3e90600c90602084019061327e565b5050565b6000610a0882612a42565b6008546001600160a01b03163314611f775760405162461bcd60e51b815260040161097690613a13565b601155565b6008546001600160a01b03163314611fa65760405162461bcd60e51b815260040161097690613a13565b6001600160a01b03811661200b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610976565b612014816128aa565b50565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b611f3e828260405180602001604052806000815250612ae0565b600061209882612701565b80519091506000906001600160a01b0316336001600160a01b031614806120cf5750336120c484610aa0565b6001600160a01b0316145b806120e1575081516120e190336108de565b90508061214b5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610976565b846001600160a01b031682600001516001600160a01b0316146121bf5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610976565b6001600160a01b0384166122235760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610976565b6122336000848460000151612017565b6001600160a01b03851660009081526004602052604081208054600192906122659084906001600160801b0316613b38565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b038616600090815260046020526040812080546001945090926122b191859116613acb565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055612338846001613aed565b6000818152600360205260409020549091506001600160a01b03166123c957612362816000541190565b156123c95760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600754816124635760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006044820152606401610976565b600060016124718484613aed565b61247b9190613b60565b90506124a860017f000000000000000000000000000000000000000000000000000000000000029b613b60565b8111156124dd576124da60017f000000000000000000000000000000000000000000000000000000000000029b613b60565b90505b6124e8816000541190565b6125435760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b6064820152608401610976565b815b8181116125e8576000818152600360205260409020546001600160a01b03166125d657600061257382612701565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600390965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b806125e081613bf5565b915050612545565b506125f4816001613aed565b600755505050565b6060816126205750506040805180820190915260018152600360fc1b602082015290565b8160005b811561264a578061263481613bf5565b91506126439050600a83613b05565b9150612624565b6000816001600160401b0381111561266457612664613c7c565b6040519080825280601f01601f19166020018201604052801561268e576020820181803683370190505b5090505b84156126f9576126a3600183613b60565b91506126b0600a86613c10565b6126bb906030613aed565b60f81b8183815181106126d0576126d0613c66565b60200101906001600160f81b031916908160001a9053506126f2600a86613b05565b9450612692565b949350505050565b6040805180820190915260008082526020820152612720826000541190565b61277f5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610976565b60007f000000000000000000000000000000000000000000000000000000000000004283106127e0576127d27f000000000000000000000000000000000000000000000000000000000000004284613b60565b6127dd906001613aed565b90505b825b818110612849576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561283657949350505050565b508061284181613ba3565b9150506127e2565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610976565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600d546000906001600160a01b03166129158484612dba565b6001600160a01b0316149392505050565b60006001600160a01b0384163b15612a2857604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061296a90339089908890889060040161382f565b602060405180830381600087803b15801561298457600080fd5b505af19250505080156129b4575060408051601f3d908101601f191682019092526129b1918101906136ce565b60015b612a0e573d8080156129e2576040519150601f19603f3d011682016040523d82523d6000602084013e6129e7565b606091505b508051612a065760405162461bcd60e51b815260040161097690613a48565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506126f9565b506001949350505050565b6060600b8054610a1d90613bba565b60006001600160a01b038216612ab45760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610976565b506001600160a01b0316600090815260046020526040902054600160801b90046001600160801b031690565b6000546001600160a01b038416612b435760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610976565b612b4e816000541190565b15612b9b5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610976565b7f0000000000000000000000000000000000000000000000000000000000000042831115612c165760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610976565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612c72908790613acb565b6001600160801b03168152602001858360200151612c909190613acb565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612daf5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612d736000888488612926565b612d8f5760405162461bcd60e51b815260040161097690613a48565b81612d9981613bf5565b9250508080612da790613bf5565b915050612d26565b50600081905561240b565b6000611d3282612e17856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b906000806000612e278585612e3c565b91509150612e3481612eac565b509392505050565b600080825160411415612e735760208301516040840151606085015160001a612e6787828585613067565b94509450505050612ea5565b825160401415612e9d5760208301516040840151612e92868383613154565b935093505050612ea5565b506000905060025b9250929050565b6000816004811115612ec057612ec0613c50565b1415612ec95750565b6001816004811115612edd57612edd613c50565b1415612f2b5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610976565b6002816004811115612f3f57612f3f613c50565b1415612f8d5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610976565b6003816004811115612fa157612fa1613c50565b1415612ffa5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610976565b600481600481111561300e5761300e613c50565b14156120145760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610976565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561309e575060009050600361314b565b8460ff16601b141580156130b657508460ff16601c14155b156130c7575060009050600461314b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561311b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166131445760006001925092505061314b565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161317587828885613067565b935093505050935093915050565b82805461318f90613bba565b90600052602060002090601f0160209004810192826131b157600085556131f7565b82601f106131ca5782800160ff198235161785556131f7565b828001600101855582156131f7579182015b828111156131f75782358255916020019190600101906131dc565b506113e99291506132d7565b82805461320f90613bba565b90600052602060002090601f01602090048101928261323157600085556131f7565b82601f1061324257805485556131f7565b828001600101855582156131f757600052602060002091601f016020900482015b828111156131f7578254825591600101919060010190613263565b8280548282559060005260206000209081019282156132cb579160200282015b828111156132cb57825180516132bb9184916020909101906132ec565b509160200191906001019061329e565b506113e9929150613360565b5b808211156113e957600081556001016132d8565b8280546132f890613bba565b90600052602060002090601f01602090048101928261331a57600085556131f7565b82601f1061333357805160ff19168380011785556131f7565b828001600101855582156131f7579182015b828111156131f7578251825591602001919060010190613345565b808211156113e9576000613374828261337d565b50600101613360565b50805461338990613bba565b6000825580601f10613399575050565b601f01602090049060005260206000209081019061201491906132d7565b60006001600160401b038311156133d0576133d0613c7c565b6133e3601f8401601f1916602001613a9b565b90508281528383830111156133f757600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461342557600080fd5b919050565b60008083601f84011261343c57600080fd5b5081356001600160401b0381111561345357600080fd5b602083019150836020828501011115612ea557600080fd5b60006020828403121561347d57600080fd5b611d328261340e565b6000806040838503121561349957600080fd5b6134a28361340e565b91506134b06020840161340e565b90509250929050565b6000806000606084860312156134ce57600080fd5b6134d78461340e565b92506134e56020850161340e565b9150604084013590509250925092565b6000806000806080858703121561350b57600080fd5b6135148561340e565b93506135226020860161340e565b92506040850135915060608501356001600160401b0381111561354457600080fd5b8501601f8101871361355557600080fd5b613564878235602084016133b7565b91505092959194509250565b6000806040838503121561358357600080fd5b61358c8361340e565b9150602083013580151581146135a157600080fd5b809150509250929050565b600080604083850312156135bf57600080fd5b6135c88361340e565b946020939093013593505050565b600060208083850312156135e957600080fd5b82356001600160401b038082111561360057600080fd5b818501915085601f83011261361457600080fd5b81358181111561362657613626613c7c565b8060051b613635858201613a9b565b8281528581019085870183870188018b101561365057600080fd5b600093505b848410156136a35780358681111561366c57600080fd5b8701603f81018c1361367d57600080fd5b61368e8c8a830135604084016133b7565b84525060019390930192918701918701613655565b509998505050505050505050565b6000602082840312156136c357600080fd5b8135611d3281613c92565b6000602082840312156136e057600080fd5b8151611d3281613c92565b6000602082840312156136fd57600080fd5b813560048110611d3257600080fd5b6000806020838503121561371f57600080fd5b82356001600160401b0381111561373557600080fd5b6137418582860161342a565b90969095509350505050565b60006020828403121561375f57600080fd5b5035919050565b6000806040838503121561377957600080fd5b823591506134b06020840161340e565b60008060006040848603121561379e57600080fd5b8335925060208401356001600160401b038111156137bb57600080fd5b6137c78682870161342a565b9497909650939450505050565b600081518084526137ec816020860160208601613b77565b601f01601f19169290920160200192915050565b60008351613812818460208801613b77565b835190830190613826818360208801613b77565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613862908301846137d4565b9695505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156138c157603f198886030184526138af8583516137d4565b94509285019290850190600101613893565b5092979650505050505050565b60208101600483106138f057634e487b7160e01b600052602160045260246000fd5b91905290565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b602081526000611d3260208301846137d4565b60608152600061394b60608301866137d4565b6001600160a01b0394851660208401529290931660409091015292915050565b600060208083526000845481600182811c91508083168061398d57607f831692505b8583108114156139ab57634e487b7160e01b85526022600452602485fd5b8786018381526020018180156139c857600181146139d957613a04565b60ff19861682528782019650613a04565b60008b81526020902060005b868110156139fe578154848201529085019089016139e5565b83019750505b50949998505050505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715613ac357613ac3613c7c565b604052919050565b60006001600160801b0380831681851680830382111561382657613826613c24565b60008219821115613b0057613b00613c24565b500190565b600082613b1457613b14613c3a565b500490565b6000816000190483118215151615613b3357613b33613c24565b500290565b60006001600160801b0383811690831681811015613b5857613b58613c24565b039392505050565b600082821015613b7257613b72613c24565b500390565b60005b83811015613b92578181015183820152602001613b7a565b83811115611c3b5750506000910152565b600081613bb257613bb2613c24565b506000190190565b600181811c90821680613bce57607f821691505b60208210811415613bef57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613c0957613c09613c24565b5060010190565b600082613c1f57613c1f613c3a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461201457600080fdfea2646970667358221220de4aaf1b7f2c402e1a01ded4dbdb21c10fd1b806e2b16337a588c9c258431d4a64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000a6d9e1682dca1080463caea9470d775ec208b6dc000000000000000000000000fd082ab802849980e4a07297ad7ef0e2a94a0a530000000000000000000000008800c372be46527c87167aa122f3c984d4f47f630000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000029b0000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000001f68747470733a2f2f666f7274756e6564616f2e696f2f6d657461646174612f00

-----Decoded View---------------
Arg [0] : initBaseURI (string): https://fortunedao.io/metadata/
Arg [1] : signer (address): 0xa6d9E1682dca1080463CAEa9470d775ec208B6dC
Arg [2] : _marketingWallet (address): 0xfD082AB802849980e4a07297Ad7Ef0e2a94a0A53
Arg [3] : _urlFlipper (address): 0x8800c372be46527C87167AA122f3c984d4f47f63
Arg [4] : _maxMint (uint256): 2
Arg [5] : _maxSupply (uint256): 667
Arg [6] : _reserveAmount (uint256): 67

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 000000000000000000000000a6d9e1682dca1080463caea9470d775ec208b6dc
Arg [2] : 000000000000000000000000fd082ab802849980e4a07297ad7ef0e2a94a0a53
Arg [3] : 0000000000000000000000008800c372be46527c87167aa122f3c984d4f47f63
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [5] : 000000000000000000000000000000000000000000000000000000000000029b
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [7] : 000000000000000000000000000000000000000000000000000000000000001f
Arg [8] : 68747470733a2f2f666f7274756e6564616f2e696f2f6d657461646174612f00


Deployed Bytecode Sourcemap

55046:6421:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60756:110;;;;;;;;;;-1:-1:-1;60756:110:0;;;;;:::i;:::-;;:::i;:::-;;38506:422;;;;;;;;;;-1:-1:-1;38506:422:0;;;;;:::i;:::-;;:::i;:::-;;;10341:14:1;;10334:22;10316:41;;10304:2;10289:18;38506:422:0;;;;;;;;40467:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42162:292::-;;;;;;;;;;-1:-1:-1;42162:292:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7886:32:1;;;7868:51;;7856:2;7841:18;42162:292:0;7722:203:1;41683:413:0;;;;;;;;;;-1:-1:-1;41683:413:0;;;;;:::i;:::-;;:::i;57412:99::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;55657:44::-;;;;;;;;;;-1:-1:-1;55657:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;59029:603;;;:::i;55405:25::-;;;;;;;;;;-1:-1:-1;55405:25:0;;;;-1:-1:-1;;;;;55405:25:0;;;36862:100;;;;;;;;;;-1:-1:-1;36915:7:0;36942:12;36862:100;;;10514:25:1;;;10502:2;10487:18;36862:100:0;10368:177:1;55250:20:0;;;;;;;;;;-1:-1:-1;55250:20:0;;;;;;;;;;;;;;;:::i;43189:162::-;;;;;;;;;;-1:-1:-1;43189:162:0;;;;;:::i;:::-;;:::i;61012:156::-;;;;;;;;;;-1:-1:-1;61012:156:0;;;;;:::i;:::-;;:::i;60487:127::-;;;;;;;;;;-1:-1:-1;60487:127:0;;;;;:::i;:::-;;:::i;37570:864::-;;;;;;;;;;-1:-1:-1;37570:864:0;;;;;:::i;:::-;;:::i;56697:209::-;;;;;;;;;;-1:-1:-1;56697:209:0;;;;;:::i;:::-;;:::i;59640:238::-;;;;;;;;;;;;;:::i;43422:177::-;;;;;;;;;;-1:-1:-1;43422:177:0;;;;;:::i;:::-;;:::i;55437:29::-;;;;;;;;;;;;;;;;55553:38;;;;;;;;;;;;;;;37039:228;;;;;;;;;;-1:-1:-1;37039:228:0;;;;;:::i;:::-;;:::i;59984:148::-;;;;;;;;;;-1:-1:-1;59984:148:0;;;;;:::i;:::-;;:::i;60874:130::-;;;;;;;;;;-1:-1:-1;60874:130:0;;;;;:::i;:::-;;:::i;40276:124::-;;;;;;;;;;-1:-1:-1;40276:124:0;;;;;:::i;:::-;;:::i;60140:213::-;;;;;;;;;;-1:-1:-1;60140:213:0;;;;;:::i;:::-;;:::i;55277:21::-;;;;;;;;;;;;;:::i;60622:126::-;;;;;;;;;;-1:-1:-1;60622:126:0;;;;;:::i;:::-;;:::i;38992:258::-;;;;;;;;;;-1:-1:-1;38992:258:0;;;;;:::i;:::-;;:::i;54165:103::-;;;;;;;;;;;;;:::i;55473:32::-;;;;;;;;;;;;;;;55368:30;;;;;;;;;;-1:-1:-1;55368:30:0;;;;-1:-1:-1;;;;;55368:30:0;;;55598:37;;;;;;;;;;;;;;;;53514:87;;;;;;;;;;-1:-1:-1;53587:6:0;;-1:-1:-1;;;;;53587:6:0;53514:87;;61297:167;;;;;;;;;;-1:-1:-1;61297:167:0;;;;;:::i;:::-;;:::i;:::-;;;;29847:13:1;;-1:-1:-1;;;;;29843:39:1;29825:58;;29943:4;29931:17;;;29925:24;-1:-1:-1;;;;;29921:49:1;29899:20;;;29892:79;;;;29798:18;61297:167:0;29615:362:1;40636:104:0;;;;;;;;;;;;;:::i;55708:47::-;;;;;;;;;;-1:-1:-1;55708:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;58038:983;;;;;;:::i;:::-;;:::i;42526:311::-;;;;;;;;;;-1:-1:-1;42526:311:0;;;;;:::i;:::-;;:::i;43670:355::-;;;;;;;;;;-1:-1:-1;43670:355:0;;;;;:::i;:::-;;:::i;55305:26::-;;;;;;;;;;-1:-1:-1;55305:26:0;;;;;:::i;:::-;;:::i;40811:468::-;;;;;;;;;;-1:-1:-1;40811:468:0;;;;;:::i;:::-;;:::i;57519:511::-;;;;;;;;;;-1:-1:-1;57519:511:0;;;;;:::i;:::-;;:::i;60361:118::-;;;;;;;;;;-1:-1:-1;60361:118:0;;;;;:::i;:::-;;:::i;55512:34::-;;;;;;;;;;;;;;;48551:43;;;;;;;;;;;;;;;;61176:113;;;;;;;;;;-1:-1:-1;61176:113:0;;;;;:::i;:::-;;:::i;42908:214::-;;;;;;;;;;-1:-1:-1;42908:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;43079:25:0;;;43050:4;43079:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;42908:214;59886:90;;;;;;;;;;-1:-1:-1;59886:90:0;;;;;:::i;:::-;;:::i;54423:238::-;;;;;;;;;;-1:-1:-1;54423:238:0;;;;;:::i;:::-;;:::i;60756:110::-;53587:6;;-1:-1:-1;;;;;53587:6:0;34282:10;53734:23;53726:68;;;;-1:-1:-1;;;53726:68:0;;;;;;;:::i;:::-;;;;;;;;;60832:10:::1;:26:::0;;-1:-1:-1;;;;;;60832:26:0::1;-1:-1:-1::0;;;;;60832:26:0;;;::::1;::::0;;;::::1;::::0;;60756:110::o;38506:422::-;38653:4;-1:-1:-1;;;;;;38695:40:0;;-1:-1:-1;;;38695:40:0;;:105;;-1:-1:-1;;;;;;;38752:48:0;;-1:-1:-1;;;38752:48:0;38695:105;:172;;;-1:-1:-1;;;;;;;38817:50:0;;-1:-1:-1;;;38817:50:0;38695:172;:225;;;-1:-1:-1;;;;;;;;;;11615:40:0;;;38884:36;38675:245;38506:422;-1:-1:-1;;38506:422:0:o;40467:100::-;40521:13;40554:5;40547:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40467:100;:::o;42162:292::-;42266:7;42313:16;42321:7;44337:4;44371:12;-1:-1:-1;44361:22:0;44280:111;42313:16;42291:111;;;;-1:-1:-1;;;42291:111:0;;28651:2:1;42291:111:0;;;28633:21:1;28690:2;28670:18;;;28663:30;28729:34;28709:18;;;28702:62;-1:-1:-1;;;28780:18:1;;;28773:43;28833:19;;42291:111:0;28449:409:1;42291:111:0;-1:-1:-1;42422:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;42422:24:0;;42162:292::o;41683:413::-;41756:13;41772:24;41788:7;41772:15;:24::i;:::-;41756:40;;41821:5;-1:-1:-1;;;;;41815:11:0;:2;-1:-1:-1;;;;;41815:11:0;;;41807:58;;;;-1:-1:-1;;;41807:58:0;;23376:2:1;41807:58:0;;;23358:21:1;23415:2;23395:18;;;23388:30;23454:34;23434:18;;;23427:62;-1:-1:-1;;;23505:18:1;;;23498:32;23547:19;;41807:58:0;23174:398:1;41807:58:0;34282:10;-1:-1:-1;;;;;41900:21:0;;;;:62;;-1:-1:-1;41925:37:0;41942:5;34282:10;42908:214;:::i;41925:37::-;41878:169;;;;-1:-1:-1;;;41878:169:0;;19119:2:1;41878:169:0;;;19101:21:1;19158:2;19138:18;;;19131:30;19197:34;19177:18;;;19170:62;19268:27;19248:18;;;19241:55;19313:19;;41878:169:0;18917:421:1;41878:169:0;42060:28;42069:2;42073:7;42082:5;42060:8;:28::i;:::-;41745:351;41683:413;;:::o;57412:99::-;57458:15;57493:10;57486:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57412:99;:::o;59029:603::-;59091:17;59081:6;;;;:27;;;;;;;;:::i;:::-;;59073:66;;;;-1:-1:-1;;;59073:66:0;;16384:2:1;59073:66:0;;;16366:21:1;16423:2;16403:18;;;16396:30;16462:28;16442:18;;;16435:56;16508:18;;59073:66:0;16182:350:1;59073:66:0;59158:9;59171:10;59158:23;59150:68;;;;-1:-1:-1;;;59150:68:0;;16023:2:1;59150:68:0;;;16005:21:1;;;16042:18;;;16035:30;16101:34;16081:18;;;16074:62;16153:18;;59150:68:0;15821:356:1;59150:68:0;59251:10;59238:24;;;;:12;:24;;;;;;;;59237:25;59229:53;;;;-1:-1:-1;;;59229:53:0;;17954:2:1;59229:53:0;;;17936:21:1;17993:2;17973:18;;;17966:30;-1:-1:-1;;;18012:18:1;;;18005:45;18067:18;;59229:53:0;17752:339:1;59229:53:0;59386:14;59351;;59335:13;59315;36915:7;36942:12;;36862:100;59315:13;:17;;59331:1;59315:17;:::i;:::-;:33;;;;:::i;:::-;:50;;;;:::i;:::-;:85;;59293:155;;;;-1:-1:-1;;;59293:155:0;;29468:2:1;59293:155:0;;;29450:21:1;29507:2;29487:18;;;29480:30;-1:-1:-1;;;29526:18:1;;;29519:50;29586:18;;59293:155:0;29266:344:1;59293:155:0;59476:9;59467:5;;:18;59459:47;;;;-1:-1:-1;;;59459:47:0;;25304:2:1;59459:47:0;;;25286:21:1;25343:2;25323:18;;;25316:30;-1:-1:-1;;;25362:18:1;;;25355:46;25418:18;;59459:47:0;25102:340:1;59459:47:0;59532:10;59519:24;;;;:12;:24;;;;;:31;;-1:-1:-1;;59519:31:0;59546:4;59519:31;;;;;;59561:24;;59532:10;59561:9;:24::i;:::-;59603:21;;;59610:10;8985:51:1;;59622:1:0;9067:2:1;9052:18;;9045:34;59603:21:0;;8958:18:1;59603:21:0;;;;;;;59029:603::o;43189:162::-;43315:28;43325:4;43331:2;43335:7;43315:9;:28::i;61012:156::-;53587:6;;-1:-1:-1;;;;;53587:6:0;34282:10;53734:23;53726:68;;;;-1:-1:-1;;;53726:68:0;;;;;;;:::i;:::-;32578:1:::1;33176:7;;:19;;33168:63;;;::::0;-1:-1:-1;;;33168:63:0;;27532:2:1;33168:63:0::1;::::0;::::1;27514:21:1::0;27571:2;27551:18;;;27544:30;27610:33;27590:18;;;27583:61;27661:18;;33168:63:0::1;27330:355:1::0;33168:63:0::1;32578:1;33309:7;:18:::0;61132:28:::2;61151:8:::0;61132:18:::2;:28::i;:::-;-1:-1:-1::0;32534:1:0::1;33488:7;:22:::0;61012:156::o;60487:127::-;53587:6;;-1:-1:-1;;;;;53587:6:0;34282:10;53734:23;53726:68;;;;-1:-1:-1;;;53726:68:0;;;;;;;:::i;:::-;60552:6:::1;:16:::0;;60561:7;;60552:6;-1:-1:-1;;60552:16:0::1;::::0;60561:7;60552:16:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;60584:22;60598:7;60584:22;;;;;;:::i;:::-;;;;;;;;60487:127:::0;:::o;37570:864::-;37695:7;37736:16;37746:5;37736:9;:16::i;:::-;37728:5;:24;37720:71;;;;-1:-1:-1;;;37720:71:0;;14094:2:1;37720:71:0;;;14076:21:1;14133:2;14113:18;;;14106:30;14172:34;14152:18;;;14145:62;-1:-1:-1;;;14223:18:1;;;14216:32;14265:19;;37720:71:0;13892:398:1;37720:71:0;37802:22;36942:12;;;37802:22;;37934:426;37958:14;37954:1;:18;37934:426;;;37994:31;38028:14;;;:11;:14;;;;;;;;;37994:48;;;;;;;;;-1:-1:-1;;;;;37994:48:0;;;;;-1:-1:-1;;;37994:48:0;;;-1:-1:-1;;;;;37994:48:0;;;;;;;;38061:28;38057:103;;38130:14;;;-1:-1:-1;38057:103:0;38199:5;-1:-1:-1;;;;;38178:26:0;:17;-1:-1:-1;;;;;38178:26:0;;38174:175;;;38244:5;38229:11;:20;38225:77;;;-1:-1:-1;38281:1:0;-1:-1:-1;38274:8:0;;-1:-1:-1;;;38274:8:0;38225:77;38320:13;;;;:::i;:::-;;;;38174:175;-1:-1:-1;37974:3:0;;;;:::i;:::-;;;;37934:426;;;-1:-1:-1;38370:56:0;;-1:-1:-1;;;38370:56:0;;26352:2:1;38370:56:0;;;26334:21:1;26391:2;26371:18;;;26364:30;26430:34;26410:18;;;26403:62;-1:-1:-1;;;26481:18:1;;;26474:44;26535:19;;38370:56:0;26150:410:1;56697:209:0;56794:7;56847:24;56864:6;56847:16;:24::i;:::-;56881:4;56888:8;56836:61;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56826:72;;;;;;56819:79;;56697:209;;;;:::o;59640:238::-;32578:1;33176:7;;:19;;33168:63;;;;-1:-1:-1;;;33168:63:0;;27532:2:1;33168:63:0;;;27514:21:1;27571:2;27551:18;;;27544:30;27610:33;27590:18;;;27583:61;27661:18;;33168:63:0;27330:355:1;33168:63:0;32578:1;33309:7;:18;53587:6;;-1:-1:-1;;;;;53587:6:0;34282:10;53734:23:::1;53726:68;;;;-1:-1:-1::0;;;53726:68:0::1;;;;;;;:::i;:::-;59781:15:::2;::::0;59773:49:::2;::::0;59721:21:::2;::::0;59703:15:::2;::::0;-1:-1:-1;;;;;59781:15:0;;::::2;::::0;59721:21;;59703:15;59773:49;59703:15;59773:49;59721:21;59781:15;59773:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59753:69;;;59841:8;59833:37;;;::::0;-1:-1:-1;;;59833:37:0;;23779:2:1;59833:37:0::2;::::0;::::2;23761:21:1::0;23818:2;23798:18;;;23791:30;-1:-1:-1;;;23837:18:1;;;23830:46;23893:18;;59833:37:0::2;23577:340:1::0;59833:37:0::2;-1:-1:-1::0;;32534:1:0;33488:7;:22;59640:238::o;43422:177::-;43552:39;43569:4;43575:2;43579:7;43552:39;;;;;;;;;;;;:16;:39::i;37039:228::-;37142:7;36942:12;;37175:5;:21;37167:69;;;;-1:-1:-1;;;37167:69:0;;16739:2:1;37167:69:0;;;16721:21:1;16778:2;16758:18;;;16751:30;16817:34;16797:18;;;16790:62;-1:-1:-1;;;16868:18:1;;;16861:33;16911:19;;37167:69:0;16537:399:1;37167:69:0;-1:-1:-1;37254:5:0;37039:228::o;59984:148::-;53587:6;;-1:-1:-1;;;;;53587:6:0;34282:10;53734:23;53726:68;;;;-1:-1:-1;;;53726:68:0;;;;;;;:::i;:::-;60062:20:::1;:7;60072:10:::0;;60062:20:::1;:::i;:::-;;60098:26;60113:10;;60098:26;;;;;;;:::i;:::-;;;;;;;;59984:148:::0;;:::o;60874:130::-;53587:6;;-1:-1:-1;;;;;53587:6:0;34282:10;53734:23;53726:68;;;;-1:-1:-1;;;53726:68:0;;;;;;;:::i;:::-;60960:15:::1;:36:::0;;-1:-1:-1;;;;;;60960:36:0::1;-1:-1:-1::0;;;;;60960:36:0;;;::::1;::::0;;;::::1;::::0;;60874:130::o;40276:124::-;40340:7;40367:20;40379:7;40367:11;:20::i;:::-;:25;;40276:124;-1:-1:-1;;40276:124:0:o;60140:213::-;56609:10;;-1:-1:-1;;;;;56609:10:0;34282;56609:26;56601:68;;;;-1:-1:-1;;;56601:68:0;;26767:2:1;56601:68:0;;;26749:21:1;26806:2;26786:18;;;26779:30;26845:31;26825:18;;;26818:59;26894:18;;56601:68:0;26565:353:1;56601:68:0;60227:10:::1;:17:::0;60219:25;::::1;60211:57;;;::::0;-1:-1:-1;;;60211:57:0;;21838:2:1;60211:57:0::1;::::0;::::1;21820:21:1::0;21877:2;21857:18;;;21850:30;-1:-1:-1;;;21896:18:1;;;21889:49;21955:18;;60211:57:0::1;21636:343:1::0;60211:57:0::1;60289:10;60300:5;60289:17;;;;;;;;:::i;:::-;;;;;;;;60279:7;:27;;;;;;:::i;:::-;;;;;;:::i;:::-;;60322:23;60337:7;60322:23;;;;;;:::i;55277:21::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60622:126::-;53587:6;;-1:-1:-1;;;;;53587:6:0;34282:10;53734:23;53726:68;;;;-1:-1:-1;;;53726:68:0;;;;;;;:::i;:::-;60687:7:::1;:16:::0;;-1:-1:-1;;;;;;60687:16:0::1;-1:-1:-1::0;;;;;60687:16:0;::::1;::::0;;::::1;::::0;;;60719:21:::1;::::0;7868:51:1;;;60719:21:0::1;::::0;7856:2:1;7841:18;60719:21:0::1;7722:203:1::0;38992:258:0;39056:7;-1:-1:-1;;;;;39098:19:0;;39076:112;;;;-1:-1:-1;;;39076:112:0;;20255:2:1;39076:112:0;;;20237:21:1;20294:2;20274:18;;;20267:30;20333:34;20313:18;;;20306:62;-1:-1:-1;;;20384:18:1;;;20377:41;20435:19;;39076:112:0;20053:407:1;39076:112:0;-1:-1:-1;;;;;;39214:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;39214:27:0;;38992:258::o;54165:103::-;53587:6;;-1:-1:-1;;;;;53587:6:0;34282:10;53734:23;53726:68;;;;-1:-1:-1;;;53726:68:0;;;;;;;:::i;:::-;54230:30:::1;54257:1;54230:18;:30::i;:::-;54165:103::o:0;61297:167::-;-1:-1:-1;;;;;;;;;;;;;;;;;61436:20:0;61448:7;61436:11;:20::i;40636:104::-;40692:13;40725:7;40718:14;;;;;:::i;58038:983::-;58172:20;58162:6;;;;:30;;;;;;;;:::i;:::-;;58154:71;;;;-1:-1:-1;;;58154:71:0;;19898:2:1;58154:71:0;;;19880:21:1;19937:2;19917:18;;;19910:30;19976;19956:18;;;19949:58;20024:18;;58154:71:0;19696:352:1;58154:71:0;58261:10;58245:27;;;;:15;:27;;;;;;;;58244:28;58236:56;;;;-1:-1:-1;;;58236:56:0;;17954:2:1;58236:56:0;;;17936:21:1;17993:2;17973:18;;;17966:30;-1:-1:-1;;;18012:18:1;;;18005:45;18067:18;;58236:56:0;17752:339:1;58236:56:0;58325:45;58333:25;58339:6;58347:10;58333:5;:25::i;:::-;58360:9;;58325:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58325:7:0;;-1:-1:-1;;;58325:45:0:i;:::-;58303:113;;;;-1:-1:-1;;;58303:113:0;;26005:2:1;58303:113:0;;;25987:21:1;26044:2;26024:18;;;26017:30;-1:-1:-1;;;26063:18:1;;;26056:48;26121:18;;58303:113:0;25803:342:1;58303:113:0;58453:9;58443:6;58435:5;;:14;;;;:::i;:::-;:27;58427:56;;;;-1:-1:-1;;;58427:56:0;;25304:2:1;58427:56:0;;;25286:21:1;25343:2;25323:18;;;25316:30;-1:-1:-1;;;25362:18:1;;;25355:46;25418:18;;58427:56:0;25102:340:1;58427:56:0;58553:7;58543:6;58516:24;58529:10;58516:12;:24::i;:::-;:33;;;;:::i;:::-;:44;;58494:130;;;;-1:-1:-1;;;58494:130:0;;17549:2:1;58494:130:0;;;17531:21:1;17588:2;17568:18;;;17561:30;17627:34;17607:18;;;17600:62;-1:-1:-1;;;17678:18:1;;;17671:34;17722:19;;58494:130:0;17347:400:1;58494:130:0;58733:14;58698;;58682:13;58673:6;58657:13;36915:7;36942:12;;36862:100;58657:13;:22;;;;:::i;:::-;:38;;;;:::i;:::-;:55;;;;:::i;:::-;:90;;58635:160;;;;-1:-1:-1;;;58635:160:0;;29468:2:1;58635:160:0;;;29450:21:1;29507:2;29487:18;;;29480:30;-1:-1:-1;;;29526:18:1;;;29519:50;29586:18;;58635:160:0;29266:344:1;58635:160:0;58814:9;58827:10;58814:23;58806:68;;;;-1:-1:-1;;;58806:68:0;;16023:2:1;58806:68:0;;;16005:21:1;;;16042:18;;;16035:30;16101:34;16081:18;;;16074:62;16153:18;;58806:68:0;15821:356:1;58806:68:0;58911:10;58895:27;;;;:15;:27;;;;;:34;;-1:-1:-1;;58895:34:0;58925:4;58895:34;;;58940:29;;58962:6;58940:9;:29::i;:::-;58987:26;;;58994:10;8985:51:1;;9067:2;9052:18;;9045:34;;;58987:26:0;;8958:18:1;58987:26:0;;;;;;;58038:983;;;:::o;42526:311::-;-1:-1:-1;;;;;42644:24:0;;34282:10;42644:24;;42636:63;;;;-1:-1:-1;;;42636:63:0;;22602:2:1;42636:63:0;;;22584:21:1;22641:2;22621:18;;;22614:30;22680:28;22660:18;;;22653:56;22726:18;;42636:63:0;22400:350:1;42636:63:0;34282:10;42712:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;42712:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;42712:53:0;;;;;;;;;;42781:48;;10316:41:1;;;42712:42:0;;34282:10;42781:48;;10289:18:1;42781:48:0;;;;;;;42526:311;;:::o;43670:355::-;43829:28;43839:4;43845:2;43849:7;43829:9;:28::i;:::-;43890:48;43913:4;43919:2;43923:7;43932:5;43890:22;:48::i;:::-;43868:149;;;;-1:-1:-1;;;43868:149:0;;;;;;;:::i;:::-;43670:355;;;;:::o;55305:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40811:468::-;40929:13;40982:16;40990:7;44337:4;44371:12;-1:-1:-1;44361:22:0;44280:111;40982:16;40960:113;;;;-1:-1:-1;;;40960:113:0;;22186:2:1;40960:113:0;;;22168:21:1;22225:2;22205:18;;;22198:30;22264:34;22244:18;;;22237:62;-1:-1:-1;;;22315:18:1;;;22308:45;22370:19;;40960:113:0;21984:411:1;40960:113:0;41086:21;41110:10;:8;:10::i;:::-;41086:34;;41175:1;41157:7;41151:21;:25;:120;;;;;;;;;;;;;;;;;41220:7;41229:18;:7;:16;:18::i;:::-;41203:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41151:120;41131:140;40811:468;-1:-1:-1;;;40811:468:0:o;57519:511::-;53587:6;;-1:-1:-1;;;;;53587:6:0;34282:10;53734:23;53726:68;;;;-1:-1:-1;;;53726:68:0;;;;;;;:::i;:::-;57618:1:::1;57609:6;:10;57601:37;;;::::0;-1:-1:-1;;;57601:37:0;;28308:2:1;57601:37:0::1;::::0;::::1;28290:21:1::0;28347:2;28327:18;;;28320:30;-1:-1:-1;;;28366:18:1;;;28359:44;28420:18;;57601:37:0::1;28106:338:1::0;57601:37:0::1;57697:14;57687:6;57671:13;36915:7:::0;36942:12;;36862:100;57671:13:::1;:22;;;;:::i;:::-;:40;;57649:109;;;::::0;-1:-1:-1;;;57649:109:0;;14497:2:1;57649:109:0::1;::::0;::::1;14479:21:1::0;14536:2;14516:18;;;14509:30;-1:-1:-1;;;14555:18:1;;;14548:49;14614:18;;57649:109:0::1;14295:343:1::0;57649:109:0::1;57818:13;57808:6;57791:14;;:23;;;;:::i;:::-;:40;;57769:117;;;::::0;-1:-1:-1;;;57769:117:0;;25649:2:1;57769:117:0::1;::::0;::::1;25631:21:1::0;25688:2;25668:18;;;25661:30;25727:29;25707:18;;;25700:57;25774:18;;57769:117:0::1;25447:351:1::0;57769:117:0::1;57899:28;57909:9;57920:6;57899:9;:28::i;:::-;57956:6;57938:14;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;57978:44:0::1;::::0;;57992:10:::1;8170:34:1::0;;-1:-1:-1;;;;;8240:15:1;;8235:2;8220:18;;8213:43;8272:18;;;8265:34;;;57978:44:0::1;::::0;8120:2:1;8105:18;57978:44:0::1;7930:375:1::0;60361:118:0;53587:6;;-1:-1:-1;;;;;53587:6:0;34282:10;53734:23;53726:68;;;;-1:-1:-1;;;53726:68:0;;;;;;;:::i;:::-;60445:26;;::::1;::::0;:10:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;:::-;;60361:118:::0;:::o;61176:113::-;61234:7;61261:20;61275:5;61261:13;:20::i;59886:90::-;53587:6;;-1:-1:-1;;;;;53587:6:0;34282:10;53734:23;53726:68;;;;-1:-1:-1;;;53726:68:0;;;;;;;:::i;:::-;59952:5:::1;:16:::0;59886:90::o;54423:238::-;53587:6;;-1:-1:-1;;;;;53587:6:0;34282:10;53734:23;53726:68;;;;-1:-1:-1;;;53726:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54526:22:0;::::1;54504:110;;;::::0;-1:-1:-1;;;54504:110:0;;15205:2:1;54504:110:0::1;::::0;::::1;15187:21:1::0;15244:2;15224:18;;;15217:30;15283:34;15263:18;;;15256:62;-1:-1:-1;;;15334:18:1;;;15327:36;15380:19;;54504:110:0::1;15003:402:1::0;54504:110:0::1;54625:28;54644:8;54625:18;:28::i;:::-;54423:238:::0;:::o;48347:196::-;48462:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;48462:29:0;-1:-1:-1;;;;;48462:29:0;;;;;;;;;48507:28;;48462:24;;48507:28;;;;;;;48347:196;;;:::o;44399:104::-;44468:27;44478:2;44482:8;44468:27;;;;;;;;;;;;:9;:27::i;46520:1709::-;46635:35;46673:20;46685:7;46673:11;:20::i;:::-;46748:18;;46635:58;;-1:-1:-1;46706:22:0;;-1:-1:-1;;;;;46732:34:0;34282:10;-1:-1:-1;;;;;46732:34:0;;:87;;;-1:-1:-1;34282:10:0;46783:20;46795:7;46783:11;:20::i;:::-;-1:-1:-1;;;;;46783:36:0;;46732:87;:154;;;-1:-1:-1;46853:18:0;;46836:50;;34282:10;42908:214;:::i;46836:50::-;46706:181;;46922:17;46900:117;;;;-1:-1:-1;;;46900:117:0;;22957:2:1;46900:117:0;;;22939:21:1;22996:2;22976:18;;;22969:30;23035:34;23015:18;;;23008:62;-1:-1:-1;;;23086:18:1;;;23079:48;23144:19;;46900:117:0;22755:414:1;46900:117:0;47074:4;-1:-1:-1;;;;;47052:26:0;:13;:18;;;-1:-1:-1;;;;;47052:26:0;;47030:114;;;;-1:-1:-1;;;47030:114:0;;21070:2:1;47030:114:0;;;21052:21:1;21109:2;21089:18;;;21082:30;21148:34;21128:18;;;21121:62;-1:-1:-1;;;21199:18:1;;;21192:36;21245:19;;47030:114:0;20868:402:1;47030:114:0;-1:-1:-1;;;;;47163:16:0;;47155:66;;;;-1:-1:-1;;;47155:66:0;;17143:2:1;47155:66:0;;;17125:21:1;17182:2;17162:18;;;17155:30;17221:34;17201:18;;;17194:62;-1:-1:-1;;;17272:18:1;;;17265:35;17317:19;;47155:66:0;16941:401:1;47155:66:0;47342:49;47359:1;47363:7;47372:13;:18;;;47342:8;:49::i;:::-;-1:-1:-1;;;;;47404:18:0;;;;;;:12;:18;;;;;:31;;47434:1;;47404:18;:31;;47434:1;;-1:-1:-1;;;;;47404:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;47404:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;47446:16:0;;-1:-1:-1;47446:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;47446:16:0;;:29;;-1:-1:-1;;47446:29:0;;:::i;:::-;;;-1:-1:-1;;;;;47446:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47509:43:0;;;;;;;;-1:-1:-1;;;;;47509:43:0;;;;;-1:-1:-1;;;;;47535:15:0;47509:43;;;;;;;;;-1:-1:-1;47486:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;47486:66:0;-1:-1:-1;;;;;;47486:66:0;;;;;;;;;;;47814:11;47498:7;-1:-1:-1;47814:11:0;:::i;:::-;47881:1;47840:24;;;:11;:24;;;;;:29;47792:33;;-1:-1:-1;;;;;;47840:29:0;47836:288;;47904:20;47912:11;44337:4;44371:12;-1:-1:-1;44361:22:0;44280:111;47904:20;47900:213;;;47972:125;;;;;;;;48009:18;;-1:-1:-1;;;;;47972:125:0;;;;;;48050:28;;;;-1:-1:-1;;;;;47972:125:0;;;;;;;;;-1:-1:-1;47945:24:0;;;:11;:24;;;;;;;:152;;;;;;;;;-1:-1:-1;;;47945:152:0;-1:-1:-1;;;;;;47945:152:0;;;;;;;;;;;;47900:213;48160:7;48156:2;-1:-1:-1;;;;;48141:27:0;48150:4;-1:-1:-1;;;;;48141:27:0;;;;;;;;;;;48179:42;46624:1605;;;46520:1709;;;:::o;48707:950::-;48801:24;;48844:12;48836:49;;;;-1:-1:-1;;;48836:49:0;;19545:2:1;48836:49:0;;;19527:21:1;19584:2;19564:18;;;19557:30;19623:26;19603:18;;;19596:54;19667:18;;48836:49:0;19343:348:1;48836:49:0;48896:16;48946:1;48915:28;48935:8;48915:17;:28;:::i;:::-;:32;;;;:::i;:::-;48896:51;-1:-1:-1;48973:18:0;48990:1;48973:14;:18;:::i;:::-;48962:8;:29;48958:91;;;49019:18;49036:1;49019:14;:18;:::i;:::-;49008:29;;48958:91;49172:17;49180:8;44337:4;44371:12;-1:-1:-1;44361:22:0;44280:111;49172:17;49164:68;;;;-1:-1:-1;;;49164:68:0;;27125:2:1;49164:68:0;;;27107:21:1;27164:2;27144:18;;;27137:30;27203:34;27183:18;;;27176:62;-1:-1:-1;;;27254:18:1;;;27247:36;27300:19;;49164:68:0;26923:402:1;49164:68:0;49260:17;49243:357;49284:8;49279:1;:13;49243:357;;49349:1;49318:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;49318:19:0;49314:275;;49372:31;49406:14;49418:1;49406:11;:14::i;:::-;49456:117;;;;;;;;49493:14;;-1:-1:-1;;;;;49456:117:0;;;;;;49530:24;;;;-1:-1:-1;;;;;49456:117:0;;;;;;;;;-1:-1:-1;49439:14:0;;;:11;:14;;;;;;;:134;;;;;;;;;-1:-1:-1;;;49439:134:0;-1:-1:-1;;;;;;49439:134:0;;;;;;;;;;;;-1:-1:-1;49314:275:0;49294:3;;;;:::i;:::-;;;;49243:357;;;-1:-1:-1;49637:12:0;:8;49648:1;49637:12;:::i;:::-;49610:24;:39;-1:-1:-1;;;48707:950:0:o;18952:723::-;19008:13;19229:10;19225:53;;-1:-1:-1;;19256:10:0;;;;;;;;;;;;-1:-1:-1;;;19256:10:0;;;;;18952:723::o;19225:53::-;19303:5;19288:12;19344:78;19351:9;;19344:78;;19377:8;;;;:::i;:::-;;-1:-1:-1;19400:10:0;;-1:-1:-1;19408:2:0;19400:10;;:::i;:::-;;;19344:78;;;19432:19;19464:6;-1:-1:-1;;;;;19454:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19454:17:0;;19432:39;;19482:154;19489:10;;19482:154;;19516:11;19526:1;19516:11;;:::i;:::-;;-1:-1:-1;19585:10:0;19593:2;19585:5;:10;:::i;:::-;19572:24;;:2;:24;:::i;:::-;19559:39;;19542:6;19549;19542:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;19542:56:0;;;;;;;;-1:-1:-1;19613:11:0;19622:2;19613:11;;:::i;:::-;;;19482:154;;;19660:6;18952:723;-1:-1:-1;;;;18952:723:0:o;39532:682::-;-1:-1:-1;;;;;;;;;;;;;;;;;39667:16:0;39675:7;44337:4;44371:12;-1:-1:-1;44361:22:0;44280:111;39667:16;39659:71;;;;-1:-1:-1;;;39659:71:0;;15612:2:1;39659:71:0;;;15594:21:1;15651:2;15631:18;;;15624:30;15690:34;15670:18;;;15663:62;-1:-1:-1;;;15741:18:1;;;15734:40;15791:19;;39659:71:0;15410:406:1;39659:71:0;39743:26;39795:12;39784:7;:23;39780:103;;39845:22;39855:12;39845:7;:22;:::i;:::-;:26;;39870:1;39845:26;:::i;:::-;39824:47;;39780:103;39915:7;39895:242;39932:18;39924:4;:26;39895:242;;39975:31;40009:17;;;:11;:17;;;;;;;;;39975:51;;;;;;;;;-1:-1:-1;;;;;39975:51:0;;;;;-1:-1:-1;;;39975:51:0;;;-1:-1:-1;;;;;39975:51:0;;;;;;;;40045:28;40041:85;;40101:9;39532:682;-1:-1:-1;;;;39532:682:0:o;40041:85::-;-1:-1:-1;39952:6:0;;;;:::i;:::-;;;;39895:242;;;-1:-1:-1;40149:57:0;;-1:-1:-1;;;40149:57:0;;27892:2:1;40149:57:0;;;27874:21:1;27931:2;27911:18;;;27904:30;27970:34;27950:18;;;27943:62;-1:-1:-1;;;28021:18:1;;;28014:45;28076:19;;40149:57:0;27690:411:1;54821:191:0;54914:6;;;-1:-1:-1;;;;;54931:17:0;;;-1:-1:-1;;;;;;54931:17:0;;;;;;;54964:40;;54914:6;;;54931:17;54914:6;;54964:40;;54895:16;;54964:40;54884:128;54821:191;:::o;56914:180::-;57078:7;;57019:4;;-1:-1:-1;;;;;57078:7:0;57049:25;57058:4;57064:9;57049:8;:25::i;:::-;-1:-1:-1;;;;;57049:36:0;;;56914:180;-1:-1:-1;;;56914:180:0:o;50222:985::-;50377:4;-1:-1:-1;;;;;50398:13:0;;1176:20;1224:8;50394:806;;50451:175;;-1:-1:-1;;;50451:175:0;;-1:-1:-1;;;;;50451:36:0;;;;;:175;;34282:10;;50545:4;;50572:7;;50602:5;;50451:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50451:175:0;;;;;;;;-1:-1:-1;;50451:175:0;;;;;;;;;;;;:::i;:::-;;;50430:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50813:13:0;;50809:321;;50856:109;;-1:-1:-1;;;50856:109:0;;;;;;;:::i;50809:321::-;51080:6;51074:13;51065:6;51061:2;51057:15;51050:38;50430:715;-1:-1:-1;;;;;;50690:55:0;-1:-1:-1;;;50690:55:0;;-1:-1:-1;50683:62:0;;50394:806;-1:-1:-1;51184:4:0;50222:985;;;;;;:::o;57304:100::-;57356:13;57389:7;57382:14;;;;;:::i;39258:266::-;39319:7;-1:-1:-1;;;;;39361:19:0;;39339:118;;;;-1:-1:-1;;;39339:118:0;;18298:2:1;39339:118:0;;;18280:21:1;18337:2;18317:18;;;18310:30;18376:34;18356:18;;;18349:62;-1:-1:-1;;;18427:18:1;;;18420:47;18484:19;;39339:118:0;18096:413:1;39339:118:0;-1:-1:-1;;;;;;39483:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;39483:32:0;;-1:-1:-1;;;;;39483:32:0;;39258:266::o;44866:1400::-;44989:20;45012:12;-1:-1:-1;;;;;45043:16:0;;45035:62;;;;-1:-1:-1;;;45035:62:0;;24902:2:1;45035:62:0;;;24884:21:1;24941:2;24921:18;;;24914:30;24980:34;24960:18;;;24953:62;-1:-1:-1;;;25031:18:1;;;25024:31;25072:19;;45035:62:0;24700:397:1;45035:62:0;45242:21;45250:12;44337:4;44371:12;-1:-1:-1;44361:22:0;44280:111;45242:21;45241:22;45233:64;;;;-1:-1:-1;;;45233:64:0;;24544:2:1;45233:64:0;;;24526:21:1;24583:2;24563:18;;;24556:30;24622:31;24602:18;;;24595:59;24671:18;;45233:64:0;24342:353:1;45233:64:0;45328:12;45316:8;:24;;45308:71;;;;-1:-1:-1;;;45308:71:0;;29065:2:1;45308:71:0;;;29047:21:1;29104:2;29084:18;;;29077:30;29143:34;29123:18;;;29116:62;-1:-1:-1;;;29194:18:1;;;29187:32;29236:19;;45308:71:0;28863:398:1;45308:71:0;-1:-1:-1;;;;;45499:16:0;;45466:30;45499:16;;;:12;:16;;;;;;;;;45466:49;;;;;;;;;-1:-1:-1;;;;;45466:49:0;;;;;-1:-1:-1;;;45466:49:0;;;;;;;;;;;45545:135;;;;;;;;45571:19;;45466:49;;45545:135;;;45571:39;;45601:8;;45571:39;:::i;:::-;-1:-1:-1;;;;;45545:135:0;;;;;45660:8;45625:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;45545:135:0;;;;;;-1:-1:-1;;;;;45526:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;-1:-1:-1;;;45526:154:0;;;;;;;;;;;;45719:43;;;;;;;;;;-1:-1:-1;;;;;45745:15:0;45719:43;;;;;;;;45691:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;45691:71:0;-1:-1:-1;;;;;;45691:71:0;;;;;;;;;;;;;;;;;;45703:12;;45823:325;45847:8;45843:1;:12;45823:325;;;45882:38;;45907:12;;-1:-1:-1;;;;;45882:38:0;;;45899:1;;45882:38;;45899:1;;45882:38;45961:59;45992:1;45996:2;46000:12;46014:5;45961:22;:59::i;:::-;45935:172;;;;-1:-1:-1;;;45935:172:0;;;;;;;:::i;:::-;46122:14;;;;:::i;:::-;;;;45857:3;;;;;:::i;:::-;;;;45823:325;;;-1:-1:-1;46160:12:0;:27;;;46198:60;43670:355;57102:194;57208:7;57240:48;57278:9;57240:29;:4;29405:58;;7369:66:1;29405:58:0;;;7357:79:1;7452:12;;;7445:28;;;29236:7:0;;7489:12:1;;29405:58:0;;;;;;;;;;;;29377:101;;;;;;29357:121;;29140:346;;;;57240:29;:37;25278:7;25304:17;25323:18;25345:27;25356:4;25362:9;25345:10;:27::i;:::-;25303:69;;;;25383:18;25395:5;25383:11;:18::i;:::-;-1:-1:-1;25419:9:0;25173:263;-1:-1:-1;;;25173:263:0:o;23031:1340::-;23139:7;23148:12;23378:9;:16;23398:2;23378:22;23374:990;;;23674:4;23659:20;;23653:27;23724:4;23709:20;;23703:27;23782:4;23767:20;;23761:27;23417:9;23753:36;23825:25;23836:4;23753:36;23653:27;23703;23825:10;:25::i;:::-;23818:32;;;;;;;;;23374:990;23872:9;:16;23892:2;23872:22;23868:496;;;24147:4;24132:20;;24126:27;24198:4;24183:20;;24177:27;24240:23;24251:4;24126:27;24177;24240:10;:23::i;:::-;24233:30;;;;;;;;23868:496;-1:-1:-1;24312:1:0;;-1:-1:-1;24316:35:0;23868:496;23031:1340;;;;;:::o;21302:643::-;21380:20;21371:5;:29;;;;;;;;:::i;:::-;;21367:571;;;21302:643;:::o;21367:571::-;21478:29;21469:5;:38;;;;;;;;:::i;:::-;;21465:473;;;21524:34;;-1:-1:-1;;;21524:34:0;;13741:2:1;21524:34:0;;;13723:21:1;13780:2;13760:18;;;13753:30;13819:26;13799:18;;;13792:54;13863:18;;21524:34:0;13539:348:1;21465:473:0;21589:35;21580:5;:44;;;;;;;;:::i;:::-;;21576:362;;;21641:41;;-1:-1:-1;;;21641:41:0;;14845:2:1;21641:41:0;;;14827:21:1;14884:2;14864:18;;;14857:30;14923:33;14903:18;;;14896:61;14974:18;;21641:41:0;14643:355:1;21576:362:0;21713:30;21704:5;:39;;;;;;;;:::i;:::-;;21700:238;;;21760:44;;-1:-1:-1;;;21760:44:0;;18716:2:1;21760:44:0;;;18698:21:1;18755:2;18735:18;;;18728:30;18794:34;18774:18;;;18767:62;-1:-1:-1;;;18845:18:1;;;18838:32;18887:19;;21760:44:0;18514:398:1;21700:238:0;21835:30;21826:5;:39;;;;;;;;:::i;:::-;;21822:116;;;21882:44;;-1:-1:-1;;;21882:44:0;;20667:2:1;21882:44:0;;;20649:21:1;20706:2;20686:18;;;20679:30;20745:34;20725:18;;;20718:62;-1:-1:-1;;;20796:18:1;;;20789:32;20838:19;;21882:44:0;20465:398:1;26753:1669:0;26884:7;;27845:66;27819:92;;27801:200;;;-1:-1:-1;27954:1:0;;-1:-1:-1;27958:30:0;27938:51;;27801:200;28015:1;:7;;28020:2;28015:7;;:18;;;;;28026:1;:7;;28031:2;28026:7;;28015:18;28011:102;;;-1:-1:-1;28066:1:0;;-1:-1:-1;28070:30:0;28050:51;;28011:102;28227:24;;;28210:14;28227:24;;;;;;;;;10777:25:1;;;10850:4;10838:17;;10818:18;;;10811:45;;;;10872:18;;;10865:34;;;10915:18;;;10908:34;;;28227:24:0;;10749:19:1;;28227:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28227:24:0;;-1:-1:-1;;28227:24:0;;;-1:-1:-1;;;;;;;28266:20:0;;28262:103;;28319:1;28323:29;28303:50;;;;;;;28262:103;28385:6;-1:-1:-1;28393:20:0;;-1:-1:-1;26753:1669:0;;;;;;;;:::o;25699:440::-;25813:7;;-1:-1:-1;;;;;25914:124:0;;26065:3;26061:12;;;26075:2;26057:21;26106:25;26117:4;26057:21;26126:1;25914:124;26106:10;:25::i;:::-;26099:32;;;;;;25699:440;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;14:406:1:-;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:347::-;654:8;664:6;718:3;711:4;703:6;699:17;695:27;685:55;;736:1;733;726:12;685:55;-1:-1:-1;759:20:1;;-1:-1:-1;;;;;791:30:1;;788:50;;;834:1;831;824:12;788:50;871:4;863:6;859:17;847:29;;923:3;916:4;907:6;899;895:19;891:30;888:39;885:59;;;940:1;937;930:12;955:186;1014:6;1067:2;1055:9;1046:7;1042:23;1038:32;1035:52;;;1083:1;1080;1073:12;1035:52;1106:29;1125:9;1106:29;:::i;1146:260::-;1214:6;1222;1275:2;1263:9;1254:7;1250:23;1246:32;1243:52;;;1291:1;1288;1281:12;1243:52;1314:29;1333:9;1314:29;:::i;:::-;1304:39;;1362:38;1396:2;1385:9;1381:18;1362:38;:::i;:::-;1352:48;;1146:260;;;;;:::o;1411:328::-;1488:6;1496;1504;1557:2;1545:9;1536:7;1532:23;1528:32;1525:52;;;1573:1;1570;1563:12;1525:52;1596:29;1615:9;1596:29;:::i;:::-;1586:39;;1644:38;1678:2;1667:9;1663:18;1644:38;:::i;:::-;1634:48;;1729:2;1718:9;1714:18;1701:32;1691:42;;1411:328;;;;;:::o;1744:666::-;1839:6;1847;1855;1863;1916:3;1904:9;1895:7;1891:23;1887:33;1884:53;;;1933:1;1930;1923:12;1884:53;1956:29;1975:9;1956:29;:::i;:::-;1946:39;;2004:38;2038:2;2027:9;2023:18;2004:38;:::i;:::-;1994:48;;2089:2;2078:9;2074:18;2061:32;2051:42;;2144:2;2133:9;2129:18;2116:32;-1:-1:-1;;;;;2163:6:1;2160:30;2157:50;;;2203:1;2200;2193:12;2157:50;2226:22;;2279:4;2271:13;;2267:27;-1:-1:-1;2257:55:1;;2308:1;2305;2298:12;2257:55;2331:73;2396:7;2391:2;2378:16;2373:2;2369;2365:11;2331:73;:::i;:::-;2321:83;;;1744:666;;;;;;;:::o;2415:347::-;2480:6;2488;2541:2;2529:9;2520:7;2516:23;2512:32;2509:52;;;2557:1;2554;2547:12;2509:52;2580:29;2599:9;2580:29;:::i;:::-;2570:39;;2659:2;2648:9;2644:18;2631:32;2706:5;2699:13;2692:21;2685:5;2682:32;2672:60;;2728:1;2725;2718:12;2672:60;2751:5;2741:15;;;2415:347;;;;;:::o;2767:254::-;2835:6;2843;2896:2;2884:9;2875:7;2871:23;2867:32;2864:52;;;2912:1;2909;2902:12;2864:52;2935:29;2954:9;2935:29;:::i;:::-;2925:39;3011:2;2996:18;;;;2983:32;;-1:-1:-1;;;2767:254:1:o;3026:1242::-;3120:6;3151:2;3194;3182:9;3173:7;3169:23;3165:32;3162:52;;;3210:1;3207;3200:12;3162:52;3250:9;3237:23;-1:-1:-1;;;;;3320:2:1;3312:6;3309:14;3306:34;;;3336:1;3333;3326:12;3306:34;3374:6;3363:9;3359:22;3349:32;;3419:7;3412:4;3408:2;3404:13;3400:27;3390:55;;3441:1;3438;3431:12;3390:55;3477:2;3464:16;3499:2;3495;3492:10;3489:36;;;3505:18;;:::i;:::-;3551:2;3548:1;3544:10;3574:28;3598:2;3594;3590:11;3574:28;:::i;:::-;3636:15;;;3667:12;;;;3699:11;;;3729;;;3725:20;;3722:33;-1:-1:-1;3719:53:1;;;3768:1;3765;3758:12;3719:53;3790:1;3781:10;;3800:438;3814:2;3811:1;3808:9;3800:438;;;3891:3;3878:17;3927:2;3914:11;3911:19;3908:39;;;3943:1;3940;3933:12;3908:39;3970:20;;4025:2;4017:11;;4013:25;-1:-1:-1;4003:53:1;;4052:1;4049;4042:12;4003:53;4081:82;4155:7;4149:2;4145;4141:11;4128:25;4123:2;4119;4115:11;4081:82;:::i;:::-;4069:95;;-1:-1:-1;3832:1:1;3825:9;;;;;4184:12;;;;4216;;3800:438;;;-1:-1:-1;4257:5:1;3026:1242;-1:-1:-1;;;;;;;;;3026:1242:1:o;4273:245::-;4331:6;4384:2;4372:9;4363:7;4359:23;4355:32;4352:52;;;4400:1;4397;4390:12;4352:52;4439:9;4426:23;4458:30;4482:5;4458:30;:::i;4523:249::-;4592:6;4645:2;4633:9;4624:7;4620:23;4616:32;4613:52;;;4661:1;4658;4651:12;4613:52;4693:9;4687:16;4712:30;4736:5;4712:30;:::i;4777:267::-;4847:6;4900:2;4888:9;4879:7;4875:23;4871:32;4868:52;;;4916:1;4913;4906:12;4868:52;4955:9;4942:23;4994:1;4987:5;4984:12;4974:40;;5010:1;5007;5000:12;5049:410;5120:6;5128;5181:2;5169:9;5160:7;5156:23;5152:32;5149:52;;;5197:1;5194;5187:12;5149:52;5237:9;5224:23;-1:-1:-1;;;;;5262:6:1;5259:30;5256:50;;;5302:1;5299;5292:12;5256:50;5341:58;5391:7;5382:6;5371:9;5367:22;5341:58;:::i;:::-;5418:8;;5315:84;;-1:-1:-1;5049:410:1;-1:-1:-1;;;;5049:410:1:o;5464:180::-;5523:6;5576:2;5564:9;5555:7;5551:23;5547:32;5544:52;;;5592:1;5589;5582:12;5544:52;-1:-1:-1;5615:23:1;;5464:180;-1:-1:-1;5464:180:1:o;5649:254::-;5717:6;5725;5778:2;5766:9;5757:7;5753:23;5749:32;5746:52;;;5794:1;5791;5784:12;5746:52;5830:9;5817:23;5807:33;;5859:38;5893:2;5882:9;5878:18;5859:38;:::i;5908:477::-;5987:6;5995;6003;6056:2;6044:9;6035:7;6031:23;6027:32;6024:52;;;6072:1;6069;6062:12;6024:52;6108:9;6095:23;6085:33;;6169:2;6158:9;6154:18;6141:32;-1:-1:-1;;;;;6188:6:1;6185:30;6182:50;;;6228:1;6225;6218:12;6182:50;6267:58;6317:7;6308:6;6297:9;6293:22;6267:58;:::i;:::-;5908:477;;6344:8;;-1:-1:-1;6241:84:1;;-1:-1:-1;;;;5908:477:1:o;6390:257::-;6431:3;6469:5;6463:12;6496:6;6491:3;6484:19;6512:63;6568:6;6561:4;6556:3;6552:14;6545:4;6538:5;6534:16;6512:63;:::i;:::-;6629:2;6608:15;-1:-1:-1;;6604:29:1;6595:39;;;;6636:4;6591:50;;6390:257;-1:-1:-1;;6390:257:1:o;6652:470::-;6831:3;6869:6;6863:13;6885:53;6931:6;6926:3;6919:4;6911:6;6907:17;6885:53;:::i;:::-;7001:13;;6960:16;;;;7023:57;7001:13;6960:16;7057:4;7045:17;;7023:57;:::i;:::-;7096:20;;6652:470;-1:-1:-1;;;;6652:470:1:o;8310:488::-;-1:-1:-1;;;;;8579:15:1;;;8561:34;;8631:15;;8626:2;8611:18;;8604:43;8678:2;8663:18;;8656:34;;;8726:3;8721:2;8706:18;;8699:31;;;8504:4;;8747:45;;8772:19;;8764:6;8747:45;:::i;:::-;8739:53;8310:488;-1:-1:-1;;;;;;8310:488:1:o;9369:802::-;9531:4;9560:2;9600;9589:9;9585:18;9630:2;9619:9;9612:21;9653:6;9688;9682:13;9719:6;9711;9704:22;9757:2;9746:9;9742:18;9735:25;;9819:2;9809:6;9806:1;9802:14;9791:9;9787:30;9783:39;9769:53;;9857:2;9849:6;9845:15;9878:1;9888:254;9902:6;9899:1;9896:13;9888:254;;;9995:2;9991:7;9979:9;9971:6;9967:22;9963:36;9958:3;9951:49;10023:39;10055:6;10046;10040:13;10023:39;:::i;:::-;10013:49;-1:-1:-1;10120:12:1;;;;10085:15;;;;9924:1;9917:9;9888:254;;;-1:-1:-1;10159:6:1;;9369:802;-1:-1:-1;;;;;;;9369:802:1:o;10953:339::-;11096:2;11081:18;;11129:1;11118:13;;11108:144;;11174:10;11169:3;11165:20;11162:1;11155:31;11209:4;11206:1;11199:15;11237:4;11234:1;11227:15;11108:144;11261:25;;;10953:339;:::o;11297:390::-;11456:2;11445:9;11438:21;11495:6;11490:2;11479:9;11475:18;11468:34;11552:6;11544;11539:2;11528:9;11524:18;11511:48;11608:1;11579:22;;;11603:2;11575:31;;;11568:42;;;;11671:2;11650:15;;;-1:-1:-1;;11646:29:1;11631:45;11627:54;;11297:390;-1:-1:-1;11297:390:1:o;11692:219::-;11841:2;11830:9;11823:21;11804:4;11861:44;11901:2;11890:9;11886:18;11878:6;11861:44;:::i;11916:417::-;12121:2;12110:9;12103:21;12084:4;12141:44;12181:2;12170:9;12166:18;12158:6;12141:44;:::i;:::-;-1:-1:-1;;;;;12259:15:1;;;12254:2;12239:18;;12232:43;12311:15;;;;12306:2;12291:18;;;12284:43;12133:52;11916:417;-1:-1:-1;;11916:417:1:o;12338:1196::-;12447:4;12476:2;12505;12494:9;12487:21;12528:1;12561:6;12555:13;12591:3;12613:1;12641:9;12637:2;12633:18;12623:28;;12701:2;12690:9;12686:18;12723;12713:61;;12767:4;12759:6;12755:17;12745:27;;12713:61;12820:2;12812:6;12809:14;12789:18;12786:38;12783:165;;;-1:-1:-1;;;12847:33:1;;12903:4;12900:1;12893:15;12933:4;12854:3;12921:17;12783:165;13014:18;;;30667:19;;;30719:4;30710:14;13057:18;13084:100;;;;13198:1;13193:315;;;;13050:458;;13084:100;-1:-1:-1;;13117:24:1;;13105:37;;13162:12;;;;-1:-1:-1;13084:100:1;;13193:315;30517:1;30510:14;;;30554:4;30541:18;;13288:1;13302:165;13316:6;13313:1;13310:13;13302:165;;;13394:14;;13381:11;;;13374:35;13437:16;;;;13331:10;;13302:165;;;13487:11;;;-1:-1:-1;;13050:458:1;-1:-1:-1;13525:3:1;;12338:1196;-1:-1:-1;;;;;;;;;12338:1196:1:o;21275:356::-;21477:2;21459:21;;;21496:18;;;21489:30;21555:34;21550:2;21535:18;;21528:62;21622:2;21607:18;;21275:356::o;23922:415::-;24124:2;24106:21;;;24163:2;24143:18;;;24136:30;24202:34;24197:2;24182:18;;24175:62;-1:-1:-1;;;24268:2:1;24253:18;;24246:49;24327:3;24312:19;;23922:415::o;30164:275::-;30235:2;30229:9;30300:2;30281:13;;-1:-1:-1;;30277:27:1;30265:40;;-1:-1:-1;;;;;30320:34:1;;30356:22;;;30317:62;30314:88;;;30382:18;;:::i;:::-;30418:2;30411:22;30164:275;;-1:-1:-1;30164:275:1:o;30735:253::-;30775:3;-1:-1:-1;;;;;30864:2:1;30861:1;30857:10;30894:2;30891:1;30887:10;30925:3;30921:2;30917:12;30912:3;30909:21;30906:47;;;30933:18;;:::i;30993:128::-;31033:3;31064:1;31060:6;31057:1;31054:13;31051:39;;;31070:18;;:::i;:::-;-1:-1:-1;31106:9:1;;30993:128::o;31126:120::-;31166:1;31192;31182:35;;31197:18;;:::i;:::-;-1:-1:-1;31231:9:1;;31126:120::o;31251:168::-;31291:7;31357:1;31353;31349:6;31345:14;31342:1;31339:21;31334:1;31327:9;31320:17;31316:45;31313:71;;;31364:18;;:::i;:::-;-1:-1:-1;31404:9:1;;31251:168::o;31424:246::-;31464:4;-1:-1:-1;;;;;31577:10:1;;;;31547;;31599:12;;;31596:38;;;31614:18;;:::i;:::-;31651:13;;31424:246;-1:-1:-1;;;31424:246:1:o;31675:125::-;31715:4;31743:1;31740;31737:8;31734:34;;;31748:18;;:::i;:::-;-1:-1:-1;31785:9:1;;31675:125::o;31805:258::-;31877:1;31887:113;31901:6;31898:1;31895:13;31887:113;;;31977:11;;;31971:18;31958:11;;;31951:39;31923:2;31916:10;31887:113;;;32018:6;32015:1;32012:13;32009:48;;;-1:-1:-1;;32053:1:1;32035:16;;32028:27;31805:258::o;32068:136::-;32107:3;32135:5;32125:39;;32144:18;;:::i;:::-;-1:-1:-1;;;32180:18:1;;32068:136::o;32209:380::-;32288:1;32284:12;;;;32331;;;32352:61;;32406:4;32398:6;32394:17;32384:27;;32352:61;32459:2;32451:6;32448:14;32428:18;32425:38;32422:161;;;32505:10;32500:3;32496:20;32493:1;32486:31;32540:4;32537:1;32530:15;32568:4;32565:1;32558:15;32422:161;;32209:380;;;:::o;32594:135::-;32633:3;-1:-1:-1;;32654:17:1;;32651:43;;;32674:18;;:::i;:::-;-1:-1:-1;32721:1:1;32710:13;;32594:135::o;32734:112::-;32766:1;32792;32782:35;;32797:18;;:::i;:::-;-1:-1:-1;32831:9:1;;32734:112::o;32851:127::-;32912:10;32907:3;32903:20;32900:1;32893:31;32943:4;32940:1;32933:15;32967:4;32964:1;32957:15;32983:127;33044:10;33039:3;33035:20;33032:1;33025:31;33075:4;33072:1;33065:15;33099:4;33096:1;33089:15;33115:127;33176:10;33171:3;33167:20;33164:1;33157:31;33207:4;33204:1;33197:15;33231:4;33228:1;33221:15;33247:127;33308:10;33303:3;33299:20;33296:1;33289:31;33339:4;33336:1;33329:15;33363:4;33360:1;33353:15;33379:127;33440:10;33435:3;33431:20;33428:1;33421:31;33471:4;33468:1;33461:15;33495:4;33492:1;33485:15;33511:131;-1:-1:-1;;;;;;33585:32:1;;33575:43;;33565:71;;33632:1;33629;33622:12

Swarm Source

ipfs://de4aaf1b7f2c402e1a01ded4dbdb21c10fd1b806e2b16337a588c9c258431d4a
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.