ETH Price: $2,535.45 (+4.03%)

Token

FUCK_FLY (fuck_fly)
 

Overview

Max Total Supply

484 fuck_fly

Holders

185

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
lyluckyjj.eth
Balance
2 fuck_fly
0x6f89b67052e88f60d238997909a8e22fc27f31f5
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:
FuckNFT

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-23
*/

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // 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 Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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 ||
            super.supportsInterface(interfaceId);
    }

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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 virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: 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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: Fuck/FuckNFT.sol

// Contract based on https://docs.openzeppelin.com/contracts/3.x/erc721

pragma solidity ^0.8.9;





interface IERC20Token {
    function totalSupply() external view returns (uint256);

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

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

}

abstract contract TokenGuard{
    function isLegal(address sender,uint256 stage,uint256 quantity,uint256 amount,address verifyAddress,uint8 v,uint256 r,uint256 s) external view virtual returns (bool);
}

contract FuckNFT is ERC721Enumerable, Ownable {
    using Strings for uint256;
    using SafeMath for uint256;

    uint256 public constant MAX_SUPPLY = 8989;
    string baseURI;
    address public verifyAddress;
    address public tokenGuardAddress;
    mapping(uint256=>Sale) public sales; 
    mapping(uint256 => mapping(address => uint256)) public UserStageTotal;

    struct Sale{
        uint256 beginTime;
        uint256 endTime;
        uint256 max;
        uint256 price;
        uint256 totalSupply;
        uint256 totalSale;
    }

    event NFTMintEvent(
        uint256 tokenId,
        uint256 stage,
        uint256 price,
        address owner
    );

    constructor() ERC721("FUCK_FLY", "fuck_fly")
    {
        
    }

    function mint(address sender,uint256 stage,uint256 quantity,uint8 v,uint256 r,uint256 s) public payable {
        require(TokenGuard(tokenGuardAddress).isLegal(sender,stage,quantity,msg.value,verifyAddress,v,r,s),"invalid signature.");
        require(msg.sender==sender,"Invalid sender.");
        Sale storage _sale = sales[stage]; 
        require(_sale.beginTime>0&&_sale.beginTime<block.timestamp,"Not started.");
        require(_sale.endTime>block.timestamp,"Finished.");
        require(msg.value == _sale.price.mul(quantity),"Invalid amount.");
        uint256 _userStageTotal = UserStageTotal[stage][sender];
        require(quantity > 0 && quantity.add(_userStageTotal) <= _sale.max,"Quantity error");
        require(totalSupply().add(quantity) <= MAX_SUPPLY && _sale.totalSale.add(quantity) <= _sale.totalSupply,"Sale would exceed max supply");
        _mint(sender,stage,quantity,msg.value);
    }

    function airdrop(address[] calldata userAddressLs,uint256 quantity) public onlyOwner{
        uint256 total = totalSupply().add((quantity.mul(userAddressLs.length)));
        require(total <= MAX_SUPPLY,"Insufficient quantity");
        for (uint256 i; i < userAddressLs.length; i++) {
            _mint(userAddressLs[i],0,quantity,0);
        }
    }

    function _mint(address sender,uint256 stage,uint256 quantity,uint256 price) internal {
        for (uint256 i = 0; i < quantity; i++) {
            uint256 mintIndex = totalSupply();
            _safeMint(sender, mintIndex);
                emit NFTMintEvent(
                    mintIndex,
                    stage,
                    price,
                    sender
            );
        }
        sales[stage].totalSale = sales[stage].totalSale.add(quantity);
        UserStageTotal[stage][sender] = UserStageTotal[stage][sender].add(quantity);
    }

    function config(
        uint256 stage,
        uint256 beginTime,
        uint256 endTime,
        uint256 max,
        uint256 price,
        uint256 totalSupply) public onlyOwner{
        
        require(endTime>beginTime,"time error.");
        require(max > 0 && max <= totalSupply,"max buy error.");
        require(totalSupply>0 && totalSupply <= MAX_SUPPLY,"total supply error.");

        Sale storage _sale = sales[stage]; 
        _sale.beginTime = beginTime;
        _sale.endTime = endTime;
        _sale.max = max;
        _sale.price = price;
        _sale.totalSupply = totalSupply;
    }

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

    function setTokenGuardAddress(address _tokenGuardAddress) public onlyOwner {
        tokenGuardAddress = _tokenGuardAddress;
    }

    function serVerifyAddress(address _addr) public onlyOwner{
        require(_addr!=address(0),"invalid addr.");
        verifyAddress = _addr;
    }

    function withdrawETH(address recipient,uint256 amount) public onlyOwner {
        (bool success, ) = payable(recipient).call{
            value: amount
        }("");
        require(success, "TRANSFER_FAILED");
    }
    
    function withdrawERC20Token(address _tokenAddress) public onlyOwner {
        uint256 amount = IERC20Token(_tokenAddress).balanceOf(address(this));
        require(amount > 0,"TRANSFER_FAILED");
        if (amount > 0) {
            IERC20Token(_tokenAddress).transfer(msg.sender, amount);
        }
    }
    
    function withdrawERC721Token(address _tokenAddress,uint256 tokenId) public onlyOwner {
        ERC721(_tokenAddress).transferFrom(address(this), msg.sender, tokenId);
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }


}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"NFTMintEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"UserStageTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"userAddressLs","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"stage","type":"uint256"},{"internalType":"uint256","name":"beginTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"config","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"stage","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"uint256","name":"r","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sales","outputs":[{"internalType":"uint256","name":"beginTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"totalSale","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"serVerifyAddress","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":"address","name":"_tokenGuardAddress","type":"address"}],"name":"setTokenGuardAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenGuardAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verifyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"withdrawERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawERC721Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051806040016040528060088152602001674655434b5f464c5960c01b815250604051806040016040528060088152602001676675636b5f666c7960c01b81525081600090805190602001906200006c929190620000fb565b50805162000082906001906020840190620000fb565b5050506200009f62000099620000a560201b60201c565b620000a9565b620001de565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200010990620001a1565b90600052602060002090601f0160209004810192826200012d576000855562000178565b82601f106200014857805160ff191683800117855562000178565b8280016001018555821562000178579182015b82811115620001785782518255916020019190600101906200015b565b50620001869291506200018a565b5090565b5b808211156200018657600081556001016200018b565b600181811c90821680620001b657607f821691505b60208210811415620001d857634e487b7160e01b600052602260045260246000fd5b50919050565b612a7180620001ee6000396000f3fe6080604052600436106101ee5760003560e01c80636352211e1161010d578063b5f522f7116100a0578063c87b56dd1161006f578063c87b56dd146105f6578063d15e90b614610616578063db1dd9cc14610636578063e985e9c514610649578063f2fde38b1461069257600080fd5b8063b5f522f714610519578063b88d4fde14610596578063c204642c146105b6578063c35e7451146105d657600080fd5b80638da5cb5b116100dc5780638da5cb5b146104a657806395d89b41146104c4578063a22cb465146104d9578063a845baa0146104f957600080fd5b80636352211e1461043157806365925b901461045157806370a0823114610471578063715018a61461049157600080fd5b80632f745c591161018557806342842e0e1161015457806342842e0e146103b15780634782f779146103d15780634f6ccce7146103f157806355f804b31461041157600080fd5b80632f745c591461033b57806332cb6b0c1461035b5780633aaed7b9146103715780633bdebbe11461039157600080fd5b8063095ea7b3116101c1578063095ea7b3146102a257806318160ddd146102c457806320547d12146102e357806323b872dd1461031b57600080fd5b806301ffc9a7146101f357806306fdde0314610228578063072f626e1461024a578063081812fc14610282575b600080fd5b3480156101ff57600080fd5b5061021361020e366004612338565b6106b2565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b5061023d6106dd565b60405161021f91906123ad565b34801561025657600080fd5b50600d5461026a906001600160a01b031681565b6040516001600160a01b03909116815260200161021f565b34801561028e57600080fd5b5061026a61029d3660046123c0565b61076f565b3480156102ae57600080fd5b506102c26102bd3660046123f5565b610809565b005b3480156102d057600080fd5b506008545b60405190815260200161021f565b3480156102ef57600080fd5b506102d56102fe36600461241f565b600f60209081526000928352604080842090915290825290205481565b34801561032757600080fd5b506102c261033636600461244b565b61091f565b34801561034757600080fd5b506102d56103563660046123f5565b610950565b34801561036757600080fd5b506102d561231d81565b34801561037d57600080fd5b506102c261038c3660046123f5565b6109e6565b34801561039d57600080fd5b506102c26103ac366004612487565b610a7a565b3480156103bd57600080fd5b506102c26103cc36600461244b565b610bec565b3480156103dd57600080fd5b506102c26103ec3660046123f5565b610c07565b3480156103fd57600080fd5b506102d561040c3660046123c0565b610cc6565b34801561041d57600080fd5b506102c261042c36600461252e565b610d59565b34801561043d57600080fd5b5061026a61044c3660046123c0565b610d96565b34801561045d57600080fd5b50600c5461026a906001600160a01b031681565b34801561047d57600080fd5b506102d561048c366004612487565b610e0d565b34801561049d57600080fd5b506102c2610e94565b3480156104b257600080fd5b50600a546001600160a01b031661026a565b3480156104d057600080fd5b5061023d610eca565b3480156104e557600080fd5b506102c26104f4366004612585565b610ed9565b34801561050557600080fd5b506102c26105143660046125bc565b610ee4565b34801561052557600080fd5b506105696105343660046123c0565b600e60205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b604080519687526020870195909552938501929092526060840152608083015260a082015260c00161021f565b3480156105a257600080fd5b506102c26105b13660046125ff565b611016565b3480156105c257600080fd5b506102c26105d136600461267b565b61104e565b3480156105e257600080fd5b506102c26105f1366004612487565b611135565b34801561060257600080fd5b5061023d6106113660046123c0565b611181565b34801561062257600080fd5b506102c2610631366004612487565b61125c565b6102c26106443660046126f6565b6112ee565b34801561065557600080fd5b50610213610664366004612756565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561069e57600080fd5b506102c26106ad366004612487565b611621565b60006001600160e01b0319821663780e9d6360e01b14806106d757506106d7826116bc565b92915050565b6060600080546106ec90612780565b80601f016020809104026020016040519081016040528092919081815260200182805461071890612780565b80156107655780601f1061073a57610100808354040283529160200191610765565b820191906000526020600020905b81548152906001019060200180831161074857829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107ed5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061081482610d96565b9050806001600160a01b0316836001600160a01b031614156108825760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107e4565b336001600160a01b038216148061089e575061089e8133610664565b6109105760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107e4565b61091a838361170c565b505050565b610929338261177a565b6109455760405162461bcd60e51b81526004016107e4906127bb565b61091a838383611871565b600061095b83610e0d565b82106109bd5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107e4565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610a105760405162461bcd60e51b81526004016107e49061280c565b6040516323b872dd60e01b8152306004820152336024820152604481018290526001600160a01b038316906323b872dd90606401600060405180830381600087803b158015610a5e57600080fd5b505af1158015610a72573d6000803e3d6000fd5b505050505050565b600a546001600160a01b03163314610aa45760405162461bcd60e51b81526004016107e49061280c565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015610ae657600080fd5b505afa158015610afa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1e9190612841565b905060008111610b625760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064016107e4565b8015610be85760405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb90604401602060405180830381600087803b158015610bb057600080fd5b505af1158015610bc4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091a919061285a565b5050565b61091a83838360405180602001604052806000815250611016565b600a546001600160a01b03163314610c315760405162461bcd60e51b81526004016107e49061280c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610c7e576040519150601f19603f3d011682016040523d82523d6000602084013e610c83565b606091505b505090508061091a5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064016107e4565b6000610cd160085490565b8210610d345760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107e4565b60088281548110610d4757610d47612877565b90600052602060002001549050919050565b600a546001600160a01b03163314610d835760405162461bcd60e51b81526004016107e49061280c565b8051610be890600b906020840190612289565b6000818152600260205260408120546001600160a01b0316806106d75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107e4565b60006001600160a01b038216610e785760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107e4565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610ebe5760405162461bcd60e51b81526004016107e49061280c565b610ec86000611a18565b565b6060600180546106ec90612780565b610be8338383611a6a565b600a546001600160a01b03163314610f0e5760405162461bcd60e51b81526004016107e49061280c565b848411610f4b5760405162461bcd60e51b815260206004820152600b60248201526a3a34b6b29032b93937b91760a91b60448201526064016107e4565b600083118015610f5b5750808311155b610f985760405162461bcd60e51b815260206004820152600e60248201526d36b0bc10313abc9032b93937b91760911b60448201526064016107e4565b600081118015610faa575061231d8111155b610fec5760405162461bcd60e51b81526020600482015260136024820152723a37ba30b61039bab838363c9032b93937b91760691b60448201526064016107e4565b6000958652600e602052604090952093845560018401929092556002830155600382015560040155565b611020338361177a565b61103c5760405162461bcd60e51b81526004016107e4906127bb565b61104884848484611b39565b50505050565b600a546001600160a01b031633146110785760405162461bcd60e51b81526004016107e49061280c565b60006110916110878385611b6c565b6008545b90611b78565b905061231d8111156110dd5760405162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e74207175616e7469747960581b60448201526064016107e4565b60005b8381101561112e5761111c8585838181106110fd576110fd612877565b90506020020160208101906111129190612487565b6000856000611b84565b80611126816128a3565b9150506110e0565b5050505050565b600a546001600160a01b0316331461115f5760405162461bcd60e51b81526004016107e49061280c565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260409020546060906001600160a01b03166112005760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107e4565b600061120a611c8c565b9050600081511161122a5760405180602001604052806000815250611255565b8061123484611c9b565b6040516020016112459291906128be565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146112865760405162461bcd60e51b81526004016107e49061280c565b6001600160a01b0381166112cc5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b21030b232391760991b60448201526064016107e4565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600d54600c546040516336ad906960e11b81526001600160a01b0389811660048301526024820189905260448201889052346064830152918216608482015260ff861660a482015260c4810185905260e48101849052911690636d5b20d2906101040160206040518083038186803b15801561136957600080fd5b505afa15801561137d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a1919061285a565b6113e25760405162461bcd60e51b815260206004820152601260248201527134b73b30b634b21039b4b3b730ba3ab9329760711b60448201526064016107e4565b336001600160a01b0387161461142c5760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21039b2b73232b91760891b60448201526064016107e4565b6000858152600e6020526040902080541580159061144a5750805442115b6114855760405162461bcd60e51b815260206004820152600c60248201526b2737ba1039ba30b93a32b21760a11b60448201526064016107e4565b428160010154116114c45760405162461bcd60e51b81526020600482015260096024820152682334b734b9b432b21760b91b60448201526064016107e4565b60038101546114d39086611b6c565b34146115135760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21030b6b7bab73a1760891b60448201526064016107e4565b6000868152600f602090815260408083206001600160a01b038b16845290915290205485158015906115525750600282015461154f8783611b78565b11155b61158f5760405162461bcd60e51b815260206004820152600e60248201526d28bab0b73a34ba3c9032b93937b960911b60448201526064016107e4565b61231d61159f8761108b60085490565b111580156115bf5750600482015460058301546115bc9088611b78565b11155b61160b5760405162461bcd60e51b815260206004820152601c60248201527f53616c6520776f756c6420657863656564206d617820737570706c790000000060448201526064016107e4565b61161788888834611b84565b5050505050505050565b600a546001600160a01b0316331461164b5760405162461bcd60e51b81526004016107e49061280c565b6001600160a01b0381166116b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107e4565b6116b981611a18565b50565b60006001600160e01b031982166380ac58cd60e01b14806116ed57506001600160e01b03198216635b5e139f60e01b145b806106d757506301ffc9a760e01b6001600160e01b03198316146106d7565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061174182610d96565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166117f35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107e4565b60006117fe83610d96565b9050806001600160a01b0316846001600160a01b0316148061184557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806118695750836001600160a01b031661185e8461076f565b6001600160a01b0316145b949350505050565b826001600160a01b031661188482610d96565b6001600160a01b0316146118e85760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016107e4565b6001600160a01b03821661194a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107e4565b611955838383611d99565b61196060008261170c565b6001600160a01b03831660009081526003602052604081208054600192906119899084906128ed565b90915550506001600160a01b03821660009081526003602052604081208054600192906119b7908490612904565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611acc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107e4565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611b44848484611871565b611b5084848484611e51565b6110485760405162461bcd60e51b81526004016107e49061291c565b6000611255828461296e565b60006112558284612904565b60005b82811015611c09576000611b9a60085490565b9050611ba68682611f5e565b60408051828152602081018790529081018490526001600160a01b03871660608201527f5d509ef5933c18126720cf960511ab9bb8dad804cb6fb9cda8d82e80dbc6808d9060800160405180910390a15080611c01816128a3565b915050611b87565b506000838152600e6020526040902060050154611c269083611b78565b6000848152600e6020908152604080832060050193909355600f81528282206001600160a01b038816835290522054611c5f9083611b78565b6000938452600f602090815260408086206001600160a01b03909716865295905293909220929092555050565b6060600b80546106ec90612780565b606081611cbf5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ce95780611cd3816128a3565b9150611ce29050600a836129a3565b9150611cc3565b60008167ffffffffffffffff811115611d0457611d046124a2565b6040519080825280601f01601f191660200182016040528015611d2e576020820181803683370190505b5090505b841561186957611d436001836128ed565b9150611d50600a866129b7565b611d5b906030612904565b60f81b818381518110611d7057611d70612877565b60200101906001600160f81b031916908160001a905350611d92600a866129a3565b9450611d32565b6001600160a01b038316611df457611def81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611e17565b816001600160a01b0316836001600160a01b031614611e1757611e178382611f78565b6001600160a01b038216611e2e5761091a81612015565b826001600160a01b0316826001600160a01b03161461091a5761091a82826120c4565b60006001600160a01b0384163b15611f5357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e959033908990889088906004016129cb565b602060405180830381600087803b158015611eaf57600080fd5b505af1925050508015611edf575060408051601f3d908101601f19168201909252611edc91810190612a08565b60015b611f39573d808015611f0d576040519150601f19603f3d011682016040523d82523d6000602084013e611f12565b606091505b508051611f315760405162461bcd60e51b81526004016107e49061291c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611869565b506001949350505050565b610be8828260405180602001604052806000815250612108565b60006001611f8584610e0d565b611f8f91906128ed565b600083815260076020526040902054909150808214611fe2576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612027906001906128ed565b6000838152600960205260408120546008805493945090928490811061204f5761204f612877565b90600052602060002001549050806008838154811061207057612070612877565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806120a8576120a8612a25565b6001900381819060005260206000200160009055905550505050565b60006120cf83610e0d565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b612112838361213b565b61211f6000848484611e51565b61091a5760405162461bcd60e51b81526004016107e49061291c565b6001600160a01b0382166121915760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107e4565b6000818152600260205260409020546001600160a01b0316156121f65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107e4565b61220260008383611d99565b6001600160a01b038216600090815260036020526040812080546001929061222b908490612904565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461229590612780565b90600052602060002090601f0160209004810192826122b757600085556122fd565b82601f106122d057805160ff19168380011785556122fd565b828001600101855582156122fd579182015b828111156122fd5782518255916020019190600101906122e2565b5061230992915061230d565b5090565b5b80821115612309576000815560010161230e565b6001600160e01b0319811681146116b957600080fd5b60006020828403121561234a57600080fd5b813561125581612322565b60005b83811015612370578181015183820152602001612358565b838111156110485750506000910152565b60008151808452612399816020860160208601612355565b601f01601f19169290920160200192915050565b6020815260006112556020830184612381565b6000602082840312156123d257600080fd5b5035919050565b80356001600160a01b03811681146123f057600080fd5b919050565b6000806040838503121561240857600080fd5b612411836123d9565b946020939093013593505050565b6000806040838503121561243257600080fd5b82359150612442602084016123d9565b90509250929050565b60008060006060848603121561246057600080fd5b612469846123d9565b9250612477602085016123d9565b9150604084013590509250925092565b60006020828403121561249957600080fd5b611255826123d9565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156124d3576124d36124a2565b604051601f8501601f19908116603f011681019082821181831017156124fb576124fb6124a2565b8160405280935085815286868601111561251457600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561254057600080fd5b813567ffffffffffffffff81111561255757600080fd5b8201601f8101841361256857600080fd5b611869848235602084016124b8565b80151581146116b957600080fd5b6000806040838503121561259857600080fd5b6125a1836123d9565b915060208301356125b181612577565b809150509250929050565b60008060008060008060c087890312156125d557600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b6000806000806080858703121561261557600080fd5b61261e856123d9565b935061262c602086016123d9565b925060408501359150606085013567ffffffffffffffff81111561264f57600080fd5b8501601f8101871361266057600080fd5b61266f878235602084016124b8565b91505092959194509250565b60008060006040848603121561269057600080fd5b833567ffffffffffffffff808211156126a857600080fd5b818601915086601f8301126126bc57600080fd5b8135818111156126cb57600080fd5b8760208260051b85010111156126e057600080fd5b6020928301989097509590910135949350505050565b60008060008060008060c0878903121561270f57600080fd5b612718876123d9565b95506020870135945060408701359350606087013560ff8116811461273c57600080fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561276957600080fd5b612772836123d9565b9150612442602084016123d9565b600181811c9082168061279457607f821691505b602082108114156127b557634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561285357600080fd5b5051919050565b60006020828403121561286c57600080fd5b815161125581612577565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156128b7576128b761288d565b5060010190565b600083516128d0818460208801612355565b8351908301906128e4818360208801612355565b01949350505050565b6000828210156128ff576128ff61288d565b500390565b600082198211156129175761291761288d565b500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008160001904831182151516156129885761298861288d565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826129b2576129b261298d565b500490565b6000826129c6576129c661298d565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129fe90830184612381565b9695505050505050565b600060208284031215612a1a57600080fd5b815161125581612322565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220ceea7561350a10e62ef4ed78811c1461c9912d64b43a6cc90cf3ddabadfd202a64736f6c63430008090033

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c80636352211e1161010d578063b5f522f7116100a0578063c87b56dd1161006f578063c87b56dd146105f6578063d15e90b614610616578063db1dd9cc14610636578063e985e9c514610649578063f2fde38b1461069257600080fd5b8063b5f522f714610519578063b88d4fde14610596578063c204642c146105b6578063c35e7451146105d657600080fd5b80638da5cb5b116100dc5780638da5cb5b146104a657806395d89b41146104c4578063a22cb465146104d9578063a845baa0146104f957600080fd5b80636352211e1461043157806365925b901461045157806370a0823114610471578063715018a61461049157600080fd5b80632f745c591161018557806342842e0e1161015457806342842e0e146103b15780634782f779146103d15780634f6ccce7146103f157806355f804b31461041157600080fd5b80632f745c591461033b57806332cb6b0c1461035b5780633aaed7b9146103715780633bdebbe11461039157600080fd5b8063095ea7b3116101c1578063095ea7b3146102a257806318160ddd146102c457806320547d12146102e357806323b872dd1461031b57600080fd5b806301ffc9a7146101f357806306fdde0314610228578063072f626e1461024a578063081812fc14610282575b600080fd5b3480156101ff57600080fd5b5061021361020e366004612338565b6106b2565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b5061023d6106dd565b60405161021f91906123ad565b34801561025657600080fd5b50600d5461026a906001600160a01b031681565b6040516001600160a01b03909116815260200161021f565b34801561028e57600080fd5b5061026a61029d3660046123c0565b61076f565b3480156102ae57600080fd5b506102c26102bd3660046123f5565b610809565b005b3480156102d057600080fd5b506008545b60405190815260200161021f565b3480156102ef57600080fd5b506102d56102fe36600461241f565b600f60209081526000928352604080842090915290825290205481565b34801561032757600080fd5b506102c261033636600461244b565b61091f565b34801561034757600080fd5b506102d56103563660046123f5565b610950565b34801561036757600080fd5b506102d561231d81565b34801561037d57600080fd5b506102c261038c3660046123f5565b6109e6565b34801561039d57600080fd5b506102c26103ac366004612487565b610a7a565b3480156103bd57600080fd5b506102c26103cc36600461244b565b610bec565b3480156103dd57600080fd5b506102c26103ec3660046123f5565b610c07565b3480156103fd57600080fd5b506102d561040c3660046123c0565b610cc6565b34801561041d57600080fd5b506102c261042c36600461252e565b610d59565b34801561043d57600080fd5b5061026a61044c3660046123c0565b610d96565b34801561045d57600080fd5b50600c5461026a906001600160a01b031681565b34801561047d57600080fd5b506102d561048c366004612487565b610e0d565b34801561049d57600080fd5b506102c2610e94565b3480156104b257600080fd5b50600a546001600160a01b031661026a565b3480156104d057600080fd5b5061023d610eca565b3480156104e557600080fd5b506102c26104f4366004612585565b610ed9565b34801561050557600080fd5b506102c26105143660046125bc565b610ee4565b34801561052557600080fd5b506105696105343660046123c0565b600e60205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b604080519687526020870195909552938501929092526060840152608083015260a082015260c00161021f565b3480156105a257600080fd5b506102c26105b13660046125ff565b611016565b3480156105c257600080fd5b506102c26105d136600461267b565b61104e565b3480156105e257600080fd5b506102c26105f1366004612487565b611135565b34801561060257600080fd5b5061023d6106113660046123c0565b611181565b34801561062257600080fd5b506102c2610631366004612487565b61125c565b6102c26106443660046126f6565b6112ee565b34801561065557600080fd5b50610213610664366004612756565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561069e57600080fd5b506102c26106ad366004612487565b611621565b60006001600160e01b0319821663780e9d6360e01b14806106d757506106d7826116bc565b92915050565b6060600080546106ec90612780565b80601f016020809104026020016040519081016040528092919081815260200182805461071890612780565b80156107655780601f1061073a57610100808354040283529160200191610765565b820191906000526020600020905b81548152906001019060200180831161074857829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107ed5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061081482610d96565b9050806001600160a01b0316836001600160a01b031614156108825760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107e4565b336001600160a01b038216148061089e575061089e8133610664565b6109105760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107e4565b61091a838361170c565b505050565b610929338261177a565b6109455760405162461bcd60e51b81526004016107e4906127bb565b61091a838383611871565b600061095b83610e0d565b82106109bd5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107e4565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610a105760405162461bcd60e51b81526004016107e49061280c565b6040516323b872dd60e01b8152306004820152336024820152604481018290526001600160a01b038316906323b872dd90606401600060405180830381600087803b158015610a5e57600080fd5b505af1158015610a72573d6000803e3d6000fd5b505050505050565b600a546001600160a01b03163314610aa45760405162461bcd60e51b81526004016107e49061280c565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b158015610ae657600080fd5b505afa158015610afa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1e9190612841565b905060008111610b625760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064016107e4565b8015610be85760405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb90604401602060405180830381600087803b158015610bb057600080fd5b505af1158015610bc4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091a919061285a565b5050565b61091a83838360405180602001604052806000815250611016565b600a546001600160a01b03163314610c315760405162461bcd60e51b81526004016107e49061280c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610c7e576040519150601f19603f3d011682016040523d82523d6000602084013e610c83565b606091505b505090508061091a5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064016107e4565b6000610cd160085490565b8210610d345760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107e4565b60088281548110610d4757610d47612877565b90600052602060002001549050919050565b600a546001600160a01b03163314610d835760405162461bcd60e51b81526004016107e49061280c565b8051610be890600b906020840190612289565b6000818152600260205260408120546001600160a01b0316806106d75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107e4565b60006001600160a01b038216610e785760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107e4565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610ebe5760405162461bcd60e51b81526004016107e49061280c565b610ec86000611a18565b565b6060600180546106ec90612780565b610be8338383611a6a565b600a546001600160a01b03163314610f0e5760405162461bcd60e51b81526004016107e49061280c565b848411610f4b5760405162461bcd60e51b815260206004820152600b60248201526a3a34b6b29032b93937b91760a91b60448201526064016107e4565b600083118015610f5b5750808311155b610f985760405162461bcd60e51b815260206004820152600e60248201526d36b0bc10313abc9032b93937b91760911b60448201526064016107e4565b600081118015610faa575061231d8111155b610fec5760405162461bcd60e51b81526020600482015260136024820152723a37ba30b61039bab838363c9032b93937b91760691b60448201526064016107e4565b6000958652600e602052604090952093845560018401929092556002830155600382015560040155565b611020338361177a565b61103c5760405162461bcd60e51b81526004016107e4906127bb565b61104884848484611b39565b50505050565b600a546001600160a01b031633146110785760405162461bcd60e51b81526004016107e49061280c565b60006110916110878385611b6c565b6008545b90611b78565b905061231d8111156110dd5760405162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e74207175616e7469747960581b60448201526064016107e4565b60005b8381101561112e5761111c8585838181106110fd576110fd612877565b90506020020160208101906111129190612487565b6000856000611b84565b80611126816128a3565b9150506110e0565b5050505050565b600a546001600160a01b0316331461115f5760405162461bcd60e51b81526004016107e49061280c565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260409020546060906001600160a01b03166112005760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107e4565b600061120a611c8c565b9050600081511161122a5760405180602001604052806000815250611255565b8061123484611c9b565b6040516020016112459291906128be565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146112865760405162461bcd60e51b81526004016107e49061280c565b6001600160a01b0381166112cc5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b21030b232391760991b60448201526064016107e4565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600d54600c546040516336ad906960e11b81526001600160a01b0389811660048301526024820189905260448201889052346064830152918216608482015260ff861660a482015260c4810185905260e48101849052911690636d5b20d2906101040160206040518083038186803b15801561136957600080fd5b505afa15801561137d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a1919061285a565b6113e25760405162461bcd60e51b815260206004820152601260248201527134b73b30b634b21039b4b3b730ba3ab9329760711b60448201526064016107e4565b336001600160a01b0387161461142c5760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21039b2b73232b91760891b60448201526064016107e4565b6000858152600e6020526040902080541580159061144a5750805442115b6114855760405162461bcd60e51b815260206004820152600c60248201526b2737ba1039ba30b93a32b21760a11b60448201526064016107e4565b428160010154116114c45760405162461bcd60e51b81526020600482015260096024820152682334b734b9b432b21760b91b60448201526064016107e4565b60038101546114d39086611b6c565b34146115135760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21030b6b7bab73a1760891b60448201526064016107e4565b6000868152600f602090815260408083206001600160a01b038b16845290915290205485158015906115525750600282015461154f8783611b78565b11155b61158f5760405162461bcd60e51b815260206004820152600e60248201526d28bab0b73a34ba3c9032b93937b960911b60448201526064016107e4565b61231d61159f8761108b60085490565b111580156115bf5750600482015460058301546115bc9088611b78565b11155b61160b5760405162461bcd60e51b815260206004820152601c60248201527f53616c6520776f756c6420657863656564206d617820737570706c790000000060448201526064016107e4565b61161788888834611b84565b5050505050505050565b600a546001600160a01b0316331461164b5760405162461bcd60e51b81526004016107e49061280c565b6001600160a01b0381166116b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107e4565b6116b981611a18565b50565b60006001600160e01b031982166380ac58cd60e01b14806116ed57506001600160e01b03198216635b5e139f60e01b145b806106d757506301ffc9a760e01b6001600160e01b03198316146106d7565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061174182610d96565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166117f35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107e4565b60006117fe83610d96565b9050806001600160a01b0316846001600160a01b0316148061184557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806118695750836001600160a01b031661185e8461076f565b6001600160a01b0316145b949350505050565b826001600160a01b031661188482610d96565b6001600160a01b0316146118e85760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016107e4565b6001600160a01b03821661194a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107e4565b611955838383611d99565b61196060008261170c565b6001600160a01b03831660009081526003602052604081208054600192906119899084906128ed565b90915550506001600160a01b03821660009081526003602052604081208054600192906119b7908490612904565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611acc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107e4565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611b44848484611871565b611b5084848484611e51565b6110485760405162461bcd60e51b81526004016107e49061291c565b6000611255828461296e565b60006112558284612904565b60005b82811015611c09576000611b9a60085490565b9050611ba68682611f5e565b60408051828152602081018790529081018490526001600160a01b03871660608201527f5d509ef5933c18126720cf960511ab9bb8dad804cb6fb9cda8d82e80dbc6808d9060800160405180910390a15080611c01816128a3565b915050611b87565b506000838152600e6020526040902060050154611c269083611b78565b6000848152600e6020908152604080832060050193909355600f81528282206001600160a01b038816835290522054611c5f9083611b78565b6000938452600f602090815260408086206001600160a01b03909716865295905293909220929092555050565b6060600b80546106ec90612780565b606081611cbf5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ce95780611cd3816128a3565b9150611ce29050600a836129a3565b9150611cc3565b60008167ffffffffffffffff811115611d0457611d046124a2565b6040519080825280601f01601f191660200182016040528015611d2e576020820181803683370190505b5090505b841561186957611d436001836128ed565b9150611d50600a866129b7565b611d5b906030612904565b60f81b818381518110611d7057611d70612877565b60200101906001600160f81b031916908160001a905350611d92600a866129a3565b9450611d32565b6001600160a01b038316611df457611def81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611e17565b816001600160a01b0316836001600160a01b031614611e1757611e178382611f78565b6001600160a01b038216611e2e5761091a81612015565b826001600160a01b0316826001600160a01b03161461091a5761091a82826120c4565b60006001600160a01b0384163b15611f5357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e959033908990889088906004016129cb565b602060405180830381600087803b158015611eaf57600080fd5b505af1925050508015611edf575060408051601f3d908101601f19168201909252611edc91810190612a08565b60015b611f39573d808015611f0d576040519150601f19603f3d011682016040523d82523d6000602084013e611f12565b606091505b508051611f315760405162461bcd60e51b81526004016107e49061291c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611869565b506001949350505050565b610be8828260405180602001604052806000815250612108565b60006001611f8584610e0d565b611f8f91906128ed565b600083815260076020526040902054909150808214611fe2576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612027906001906128ed565b6000838152600960205260408120546008805493945090928490811061204f5761204f612877565b90600052602060002001549050806008838154811061207057612070612877565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806120a8576120a8612a25565b6001900381819060005260206000200160009055905550505050565b60006120cf83610e0d565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b612112838361213b565b61211f6000848484611e51565b61091a5760405162461bcd60e51b81526004016107e49061291c565b6001600160a01b0382166121915760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107e4565b6000818152600260205260409020546001600160a01b0316156121f65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107e4565b61220260008383611d99565b6001600160a01b038216600090815260036020526040812080546001929061222b908490612904565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461229590612780565b90600052602060002090601f0160209004810192826122b757600085556122fd565b82601f106122d057805160ff19168380011785556122fd565b828001600101855582156122fd579182015b828111156122fd5782518255916020019190600101906122e2565b5061230992915061230d565b5090565b5b80821115612309576000815560010161230e565b6001600160e01b0319811681146116b957600080fd5b60006020828403121561234a57600080fd5b813561125581612322565b60005b83811015612370578181015183820152602001612358565b838111156110485750506000910152565b60008151808452612399816020860160208601612355565b601f01601f19169290920160200192915050565b6020815260006112556020830184612381565b6000602082840312156123d257600080fd5b5035919050565b80356001600160a01b03811681146123f057600080fd5b919050565b6000806040838503121561240857600080fd5b612411836123d9565b946020939093013593505050565b6000806040838503121561243257600080fd5b82359150612442602084016123d9565b90509250929050565b60008060006060848603121561246057600080fd5b612469846123d9565b9250612477602085016123d9565b9150604084013590509250925092565b60006020828403121561249957600080fd5b611255826123d9565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156124d3576124d36124a2565b604051601f8501601f19908116603f011681019082821181831017156124fb576124fb6124a2565b8160405280935085815286868601111561251457600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561254057600080fd5b813567ffffffffffffffff81111561255757600080fd5b8201601f8101841361256857600080fd5b611869848235602084016124b8565b80151581146116b957600080fd5b6000806040838503121561259857600080fd5b6125a1836123d9565b915060208301356125b181612577565b809150509250929050565b60008060008060008060c087890312156125d557600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b6000806000806080858703121561261557600080fd5b61261e856123d9565b935061262c602086016123d9565b925060408501359150606085013567ffffffffffffffff81111561264f57600080fd5b8501601f8101871361266057600080fd5b61266f878235602084016124b8565b91505092959194509250565b60008060006040848603121561269057600080fd5b833567ffffffffffffffff808211156126a857600080fd5b818601915086601f8301126126bc57600080fd5b8135818111156126cb57600080fd5b8760208260051b85010111156126e057600080fd5b6020928301989097509590910135949350505050565b60008060008060008060c0878903121561270f57600080fd5b612718876123d9565b95506020870135945060408701359350606087013560ff8116811461273c57600080fd5b9598949750929560808101359460a0909101359350915050565b6000806040838503121561276957600080fd5b612772836123d9565b9150612442602084016123d9565b600181811c9082168061279457607f821691505b602082108114156127b557634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561285357600080fd5b5051919050565b60006020828403121561286c57600080fd5b815161125581612577565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156128b7576128b761288d565b5060010190565b600083516128d0818460208801612355565b8351908301906128e4818360208801612355565b01949350505050565b6000828210156128ff576128ff61288d565b500390565b600082198211156129175761291761288d565b500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008160001904831182151516156129885761298861288d565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826129b2576129b261298d565b500490565b6000826129c6576129c661298d565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129fe90830184612381565b9695505050505050565b600060208284031215612a1a57600080fd5b815161125581612322565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220ceea7561350a10e62ef4ed78811c1461c9912d64b43a6cc90cf3ddabadfd202a64736f6c63430008090033

Deployed Bytecode Sourcemap

53382:4546:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46394:224;;;;;;;;;;-1:-1:-1;46394:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;46394:224:0;;;;;;;;33213:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;53606:32::-;;;;;;;;;;-1:-1:-1;53606:32:0;;;;-1:-1:-1;;;;;53606:32:0;;;;;;-1:-1:-1;;;;;1507:32:1;;;1489:51;;1477:2;1462:18;53606:32:0;1343:203:1;34773:221:0;;;;;;;;;;-1:-1:-1;34773:221:0;;;;;:::i;:::-;;:::i;34296:411::-;;;;;;;;;;-1:-1:-1;34296:411:0;;;;;:::i;:::-;;:::i;:::-;;47034:113;;;;;;;;;;-1:-1:-1;47122:10:0;:17;47034:113;;;2319:25:1;;;2307:2;2292:18;47034:113:0;2173:177:1;53688:69:0;;;;;;;;;;-1:-1:-1;53688:69:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;35523:339;;;;;;;;;;-1:-1:-1;35523:339:0;;;;;:::i;:::-;;:::i;46702:256::-;;;;;;;;;;-1:-1:-1;46702:256:0;;;;;:::i;:::-;;:::i;53502:41::-;;;;;;;;;;;;53539:4;53502:41;;57635:174;;;;;;;;;;-1:-1:-1;57635:174:0;;;;;:::i;:::-;;:::i;57312:311::-;;;;;;;;;;-1:-1:-1;57312:311:0;;;;;:::i;:::-;;:::i;35933:185::-;;;;;;;;;;-1:-1:-1;35933:185:0;;;;;:::i;:::-;;:::i;57078:222::-;;;;;;;;;;-1:-1:-1;57078:222:0;;;;;:::i;:::-;;:::i;47224:233::-;;;;;;;;;;-1:-1:-1;47224:233:0;;;;;:::i;:::-;;:::i;57817:104::-;;;;;;;;;;-1:-1:-1;57817:104:0;;;;;:::i;:::-;;:::i;32907:239::-;;;;;;;;;;-1:-1:-1;32907:239:0;;;;;:::i;:::-;;:::i;53571:28::-;;;;;;;;;;-1:-1:-1;53571:28:0;;;;-1:-1:-1;;;;;53571:28:0;;;32637:208;;;;;;;;;;-1:-1:-1;32637:208:0;;;;;:::i;:::-;;:::i;11771:103::-;;;;;;;;;;;;;:::i;11120:87::-;;;;;;;;;;-1:-1:-1;11193:6:0;;-1:-1:-1;;;;;11193:6:0;11120:87;;33382:104;;;;;;;;;;;;;:::i;35066:155::-;;;;;;;;;;-1:-1:-1;35066:155:0;;;;;:::i;:::-;;:::i;56033:623::-;;;;;;;;;;-1:-1:-1;56033:623:0;;;;;:::i;:::-;;:::i;53645:35::-;;;;;;;;;;-1:-1:-1;53645:35:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5621:25:1;;;5677:2;5662:18;;5655:34;;;;5705:18;;;5698:34;;;;5763:2;5748:18;;5741:34;5806:3;5791:19;;5784:35;5850:3;5835:19;;5828:35;5608:3;5593:19;53645:35:0;5334:535:1;36189:328:0;;;;;;;;;;-1:-1:-1;36189:328:0;;;;;:::i;:::-;;:::i;55089:357::-;;;;;;;;;;-1:-1:-1;55089:357:0;;;;;:::i;:::-;;:::i;56780:132::-;;;;;;;;;;-1:-1:-1;56780:132:0;;;;;:::i;:::-;;:::i;33557:334::-;;;;;;;;;;-1:-1:-1;33557:334:0;;;;;:::i;:::-;;:::i;56920:150::-;;;;;;;;;;-1:-1:-1;56920:150:0;;;;;:::i;:::-;;:::i;54159:922::-;;;;;;:::i;:::-;;:::i;35292:164::-;;;;;;;;;;-1:-1:-1;35292:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;35413:25:0;;;35389:4;35413:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;35292:164;12029:201;;;;;;;;;;-1:-1:-1;12029:201:0;;;;;:::i;:::-;;:::i;46394:224::-;46496:4;-1:-1:-1;;;;;;46520:50:0;;-1:-1:-1;;;46520:50:0;;:90;;;46574:36;46598:11;46574:23;:36::i;:::-;46513:97;46394:224;-1:-1:-1;;46394:224:0:o;33213:100::-;33267:13;33300:5;33293:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33213:100;:::o;34773:221::-;34849:7;38116:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38116:16:0;34869:73;;;;-1:-1:-1;;;34869:73:0;;8715:2:1;34869:73:0;;;8697:21:1;8754:2;8734:18;;;8727:30;8793:34;8773:18;;;8766:62;-1:-1:-1;;;8844:18:1;;;8837:42;8896:19;;34869:73:0;;;;;;;;;-1:-1:-1;34962:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34962:24:0;;34773:221::o;34296:411::-;34377:13;34393:23;34408:7;34393:14;:23::i;:::-;34377:39;;34441:5;-1:-1:-1;;;;;34435:11:0;:2;-1:-1:-1;;;;;34435:11:0;;;34427:57;;;;-1:-1:-1;;;34427:57:0;;9128:2:1;34427:57:0;;;9110:21:1;9167:2;9147:18;;;9140:30;9206:34;9186:18;;;9179:62;-1:-1:-1;;;9257:18:1;;;9250:31;9298:19;;34427:57:0;8926:397:1;34427:57:0;9924:10;-1:-1:-1;;;;;34519:21:0;;;;:62;;-1:-1:-1;34544:37:0;34561:5;9924:10;35292:164;:::i;34544:37::-;34497:168;;;;-1:-1:-1;;;34497:168:0;;9530:2:1;34497:168:0;;;9512:21:1;9569:2;9549:18;;;9542:30;9608:34;9588:18;;;9581:62;9679:26;9659:18;;;9652:54;9723:19;;34497:168:0;9328:420:1;34497:168:0;34678:21;34687:2;34691:7;34678:8;:21::i;:::-;34366:341;34296:411;;:::o;35523:339::-;35718:41;9924:10;35751:7;35718:18;:41::i;:::-;35710:103;;;;-1:-1:-1;;;35710:103:0;;;;;;;:::i;:::-;35826:28;35836:4;35842:2;35846:7;35826:9;:28::i;46702:256::-;46799:7;46835:23;46852:5;46835:16;:23::i;:::-;46827:5;:31;46819:87;;;;-1:-1:-1;;;46819:87:0;;10373:2:1;46819:87:0;;;10355:21:1;10412:2;10392:18;;;10385:30;10451:34;10431:18;;;10424:62;-1:-1:-1;;;10502:18:1;;;10495:41;10553:19;;46819:87:0;10171:407:1;46819:87:0;-1:-1:-1;;;;;;46924:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;46702:256::o;57635:174::-;11193:6;;-1:-1:-1;;;;;11193:6:0;9924:10;11340:23;11332:68;;;;-1:-1:-1;;;11332:68:0;;;;;;;:::i;:::-;57731:70:::1;::::0;-1:-1:-1;;;57731:70:0;;57774:4:::1;57731:70;::::0;::::1;11184:34:1::0;57781:10:0::1;11234:18:1::0;;;11227:43;11286:18;;;11279:34;;;-1:-1:-1;;;;;57731:34:0;::::1;::::0;::::1;::::0;11119:18:1;;57731:70:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57635:174:::0;;:::o;57312:311::-;11193:6;;-1:-1:-1;;;;;11193:6:0;9924:10;11340:23;11332:68;;;;-1:-1:-1;;;11332:68:0;;;;;;;:::i;:::-;57408:51:::1;::::0;-1:-1:-1;;;57408:51:0;;57453:4:::1;57408:51;::::0;::::1;1489::1::0;57391:14:0::1;::::0;-1:-1:-1;;;;;57408:36:0;::::1;::::0;::::1;::::0;1462:18:1;;57408:51:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57391:68;;57487:1;57478:6;:10;57470:37;;;::::0;-1:-1:-1;;;57470:37:0;;11715:2:1;57470:37:0::1;::::0;::::1;11697:21:1::0;11754:2;11734:18;;;11727:30;-1:-1:-1;;;11773:18:1;;;11766:45;11828:18;;57470:37:0::1;11513:339:1::0;57470:37:0::1;57522:10:::0;;57518:98:::1;;57549:55;::::0;-1:-1:-1;;;57549:55:0;;57585:10:::1;57549:55;::::0;::::1;12031:51:1::0;12098:18;;;12091:34;;;-1:-1:-1;;;;;57549:35:0;::::1;::::0;::::1;::::0;12004:18:1;;57549:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;57518:98::-;57380:243;57312:311:::0;:::o;35933:185::-;36071:39;36088:4;36094:2;36098:7;36071:39;;;;;;;;;;;;:16;:39::i;57078:222::-;11193:6;;-1:-1:-1;;;;;11193:6:0;9924:10;11340:23;11332:68;;;;-1:-1:-1;;;11332:68:0;;;;;;;:::i;:::-;57162:12:::1;57188:9;-1:-1:-1::0;;;;;57180:23:0::1;57225:6;57180:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57161:85;;;57265:7;57257:35;;;::::0;-1:-1:-1;;;57257:35:0;;11715:2:1;57257:35:0::1;::::0;::::1;11697:21:1::0;11754:2;11734:18;;;11727:30;-1:-1:-1;;;11773:18:1;;;11766:45;11828:18;;57257:35:0::1;11513:339:1::0;47224:233:0;47299:7;47335:30;47122:10;:17;;47034:113;47335:30;47327:5;:38;47319:95;;;;-1:-1:-1;;;47319:95:0;;12798:2:1;47319:95:0;;;12780:21:1;12837:2;12817:18;;;12810:30;12876:34;12856:18;;;12849:62;-1:-1:-1;;;12927:18:1;;;12920:42;12979:19;;47319:95:0;12596:408:1;47319:95:0;47432:10;47443:5;47432:17;;;;;;;;:::i;:::-;;;;;;;;;47425:24;;47224:233;;;:::o;57817:104::-;11193:6;;-1:-1:-1;;;;;11193:6:0;9924:10;11340:23;11332:68;;;;-1:-1:-1;;;11332:68:0;;;;;;;:::i;:::-;57892:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;32907:239::-:0;32979:7;33015:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33015:16:0;33050:19;33042:73;;;;-1:-1:-1;;;33042:73:0;;13343:2:1;33042:73:0;;;13325:21:1;13382:2;13362:18;;;13355:30;13421:34;13401:18;;;13394:62;-1:-1:-1;;;13472:18:1;;;13465:39;13521:19;;33042:73:0;13141:405:1;32637:208:0;32709:7;-1:-1:-1;;;;;32737:19:0;;32729:74;;;;-1:-1:-1;;;32729:74:0;;13753:2:1;32729:74:0;;;13735:21:1;13792:2;13772:18;;;13765:30;13831:34;13811:18;;;13804:62;-1:-1:-1;;;13882:18:1;;;13875:40;13932:19;;32729:74:0;13551:406:1;32729:74:0;-1:-1:-1;;;;;;32821:16:0;;;;;:9;:16;;;;;;;32637:208::o;11771:103::-;11193:6;;-1:-1:-1;;;;;11193:6:0;9924:10;11340:23;11332:68;;;;-1:-1:-1;;;11332:68:0;;;;;;;:::i;:::-;11836:30:::1;11863:1;11836:18;:30::i;:::-;11771:103::o:0;33382:104::-;33438:13;33471:7;33464:14;;;;;:::i;35066:155::-;35161:52;9924:10;35194:8;35204;35161:18;:52::i;56033:623::-;11193:6;;-1:-1:-1;;;;;11193:6:0;9924:10;11340:23;11332:68;;;;-1:-1:-1;;;11332:68:0;;;;;;;:::i;:::-;56257:9:::1;56249:7;:17;56241:40;;;::::0;-1:-1:-1;;;56241:40:0;;14164:2:1;56241:40:0::1;::::0;::::1;14146:21:1::0;14203:2;14183:18;;;14176:30;-1:-1:-1;;;14222:18:1;;;14215:41;14273:18;;56241:40:0::1;13962:335:1::0;56241:40:0::1;56306:1;56300:3;:7;:29;;;;;56318:11;56311:3;:18;;56300:29;56292:55;;;::::0;-1:-1:-1;;;56292:55:0;;14504:2:1;56292:55:0::1;::::0;::::1;14486:21:1::0;14543:2;14523:18;;;14516:30;-1:-1:-1;;;14562:18:1;;;14555:44;14616:18;;56292:55:0::1;14302:338:1::0;56292:55:0::1;56378:1;56366:11;:13;:42;;;;;53539:4;56383:11;:25;;56366:42;56358:73;;;::::0;-1:-1:-1;;;56358:73:0;;14847:2:1;56358:73:0::1;::::0;::::1;14829:21:1::0;14886:2;14866:18;;;14859:30;-1:-1:-1;;;14905:18:1;;;14898:49;14964:18;;56358:73:0::1;14645:343:1::0;56358:73:0::1;56444:18;56465:12:::0;;;:5:::1;:12;::::0;;;;;56489:27;;;56527:13:::1;::::0;::::1;:23:::0;;;;56561:9:::1;::::0;::::1;:15:::0;56587:11:::1;::::0;::::1;:19:::0;56617:17:::1;;:31:::0;56033:623::o;36189:328::-;36364:41;9924:10;36397:7;36364:18;:41::i;:::-;36356:103;;;;-1:-1:-1;;;36356:103:0;;;;;;;:::i;:::-;36470:39;36484:4;36490:2;36494:7;36503:5;36470:13;:39::i;:::-;36189:328;;;;:::o;55089:357::-;11193:6;;-1:-1:-1;;;;;11193:6:0;9924:10;11340:23;11332:68;;;;-1:-1:-1;;;11332:68:0;;;;;;;:::i;:::-;55184:13:::1;55200:55;55219:34;:8:::0;55232:13;55219:12:::1;:34::i;:::-;47122:10:::0;:17;55200:13:::1;:17:::0;::::1;:55::i;:::-;55184:71;;53539:4;55274:5;:19;;55266:52;;;::::0;-1:-1:-1;;;55266:52:0;;15195:2:1;55266:52:0::1;::::0;::::1;15177:21:1::0;15234:2;15214:18;;;15207:30;-1:-1:-1;;;15253:18:1;;;15246:51;15314:18;;55266:52:0::1;14993:345:1::0;55266:52:0::1;55334:9;55329:110;55345:24:::0;;::::1;55329:110;;;55391:36;55397:13;;55411:1;55397:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;55414:1;55416:8;55425:1;55391:5;:36::i;:::-;55371:3:::0;::::1;::::0;::::1;:::i;:::-;;;;55329:110;;;;55173:273;55089:357:::0;;;:::o;56780:132::-;11193:6;;-1:-1:-1;;;;;11193:6:0;9924:10;11340:23;11332:68;;;;-1:-1:-1;;;11332:68:0;;;;;;;:::i;:::-;56866:17:::1;:38:::0;;-1:-1:-1;;;;;;56866:38:0::1;-1:-1:-1::0;;;;;56866:38:0;;;::::1;::::0;;;::::1;::::0;;56780:132::o;33557:334::-;38092:4;38116:16;;;:7;:16;;;;;;33630:13;;-1:-1:-1;;;;;38116:16:0;33656:76;;;;-1:-1:-1;;;33656:76:0;;15817:2:1;33656:76:0;;;15799:21:1;15856:2;15836:18;;;15829:30;15895:34;15875:18;;;15868:62;-1:-1:-1;;;15946:18:1;;;15939:45;16001:19;;33656:76:0;15615:411:1;33656:76:0;33745:21;33769:10;:8;:10::i;:::-;33745:34;;33821:1;33803:7;33797:21;:25;:86;;;;;;;;;;;;;;;;;33849:7;33858:18;:7;:16;:18::i;:::-;33832:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33797:86;33790:93;33557:334;-1:-1:-1;;;33557:334:0:o;56920:150::-;11193:6;;-1:-1:-1;;;;;11193:6:0;9924:10;11340:23;11332:68;;;;-1:-1:-1;;;11332:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56996:17:0;::::1;56988:42;;;::::0;-1:-1:-1;;;56988:42:0;;16708:2:1;56988:42:0::1;::::0;::::1;16690:21:1::0;16747:2;16727:18;;;16720:30;-1:-1:-1;;;16766:18:1;;;16759:43;16819:18;;56988:42:0::1;16506:337:1::0;56988:42:0::1;57041:13;:21:::0;;-1:-1:-1;;;;;;57041:21:0::1;-1:-1:-1::0;;;;;57041:21:0;;;::::1;::::0;;;::::1;::::0;;56920:150::o;54159:922::-;54293:17;;54352:13;;54282:90;;-1:-1:-1;;;54282:90:0;;-1:-1:-1;;;;;17243:15:1;;;54282:90:0;;;17225:34:1;17275:18;;;17268:34;;;17318:18;;;17311:34;;;54342:9:0;17361:18:1;;;17354:34;54352:13:0;;;17404:19:1;;;17397:44;17490:4;17478:17;;17457:19;;;17450:46;17512:19;;;17505:35;;;17556:19;;;17549:35;;;54293:17:0;;;54282:37;;17159:19:1;;54282:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54274:120;;;;-1:-1:-1;;;54274:120:0;;17797:2:1;54274:120:0;;;17779:21:1;17836:2;17816:18;;;17809:30;-1:-1:-1;;;17855:18:1;;;17848:48;17913:18;;54274:120:0;17595:342:1;54274:120:0;54413:10;-1:-1:-1;;;;;54413:18:0;;;54405:45;;;;-1:-1:-1;;;54405:45:0;;18144:2:1;54405:45:0;;;18126:21:1;18183:2;18163:18;;;18156:30;-1:-1:-1;;;18202:18:1;;;18195:45;18257:18;;54405:45:0;17942:339:1;54405:45:0;54461:18;54482:12;;;:5;:12;;;;;54514:15;;:17;;;;:50;;-1:-1:-1;54533:15:0;;54549;-1:-1:-1;54514:50:0;54506:74;;;;-1:-1:-1;;;54506:74:0;;18488:2:1;54506:74:0;;;18470:21:1;18527:2;18507:18;;;18500:30;-1:-1:-1;;;18546:18:1;;;18539:42;18598:18;;54506:74:0;18286:336:1;54506:74:0;54613:15;54599:5;:13;;;:29;54591:50;;;;-1:-1:-1;;;54591:50:0;;18829:2:1;54591:50:0;;;18811:21:1;18868:1;18848:18;;;18841:29;-1:-1:-1;;;18886:18:1;;;18879:39;18935:18;;54591:50:0;18627:332:1;54591:50:0;54673:11;;;;:25;;54689:8;54673:15;:25::i;:::-;54660:9;:38;54652:65;;;;-1:-1:-1;;;54652:65:0;;19166:2:1;54652:65:0;;;19148:21:1;19205:2;19185:18;;;19178:30;-1:-1:-1;;;19224:18:1;;;19217:45;19279:18;;54652:65:0;18964:339:1;54652:65:0;54728:23;54754:21;;;:14;:21;;;;;;;;-1:-1:-1;;;;;54754:29:0;;;;;;;;;;54802:12;;;;;:58;;-1:-1:-1;54851:9:0;;;;54818:29;:8;54831:15;54818:12;:29::i;:::-;:42;;54802:58;54794:84;;;;-1:-1:-1;;;54794:84:0;;19510:2:1;54794:84:0;;;19492:21:1;19549:2;19529:18;;;19522:30;-1:-1:-1;;;19568:18:1;;;19561:44;19622:18;;54794:84:0;19308:338:1;54794:84:0;53539:4;54897:27;54915:8;54897:13;47122:10;:17;;47034:113;54897:27;:41;;:95;;;;-1:-1:-1;54975:17:0;;;;54942:15;;;;:29;;54962:8;54942:19;:29::i;:::-;:50;;54897:95;54889:135;;;;-1:-1:-1;;;54889:135:0;;19853:2:1;54889:135:0;;;19835:21:1;19892:2;19872:18;;;19865:30;19931;19911:18;;;19904:58;19979:18;;54889:135:0;19651:352:1;54889:135:0;55035:38;55041:6;55048:5;55054:8;55063:9;55035:5;:38::i;:::-;54263:818;;54159:922;;;;;;:::o;12029:201::-;11193:6;;-1:-1:-1;;;;;11193:6:0;9924:10;11340:23;11332:68;;;;-1:-1:-1;;;11332:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12118:22:0;::::1;12110:73;;;::::0;-1:-1:-1;;;12110:73:0;;20210:2:1;12110:73:0::1;::::0;::::1;20192:21:1::0;20249:2;20229:18;;;20222:30;20288:34;20268:18;;;20261:62;-1:-1:-1;;;20339:18:1;;;20332:36;20385:19;;12110:73:0::1;20008:402:1::0;12110:73:0::1;12194:28;12213:8;12194:18;:28::i;:::-;12029:201:::0;:::o;32268:305::-;32370:4;-1:-1:-1;;;;;;32407:40:0;;-1:-1:-1;;;32407:40:0;;:105;;-1:-1:-1;;;;;;;32464:48:0;;-1:-1:-1;;;32464:48:0;32407:105;:158;;;-1:-1:-1;;;;;;;;;;24036:40:0;;;32529:36;23927:157;42173:174;42248:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;42248:29:0;-1:-1:-1;;;;;42248:29:0;;;;;;;;:24;;42302:23;42248:24;42302:14;:23::i;:::-;-1:-1:-1;;;;;42293:46:0;;;;;;;;;;;42173:174;;:::o;38321:348::-;38414:4;38116:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38116:16:0;38431:73;;;;-1:-1:-1;;;38431:73:0;;20617:2:1;38431:73:0;;;20599:21:1;20656:2;20636:18;;;20629:30;20695:34;20675:18;;;20668:62;-1:-1:-1;;;20746:18:1;;;20739:42;20798:19;;38431:73:0;20415:408:1;38431:73:0;38515:13;38531:23;38546:7;38531:14;:23::i;:::-;38515:39;;38584:5;-1:-1:-1;;;;;38573:16:0;:7;-1:-1:-1;;;;;38573:16:0;;:52;;;-1:-1:-1;;;;;;35413:25:0;;;35389:4;35413:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;38593:32;38573:87;;;;38653:7;-1:-1:-1;;;;;38629:31:0;:20;38641:7;38629:11;:20::i;:::-;-1:-1:-1;;;;;38629:31:0;;38573:87;38565:96;38321:348;-1:-1:-1;;;;38321:348:0:o;41430:625::-;41589:4;-1:-1:-1;;;;;41562:31:0;:23;41577:7;41562:14;:23::i;:::-;-1:-1:-1;;;;;41562:31:0;;41554:81;;;;-1:-1:-1;;;41554:81:0;;21030:2:1;41554:81:0;;;21012:21:1;21069:2;21049:18;;;21042:30;21108:34;21088:18;;;21081:62;-1:-1:-1;;;21159:18:1;;;21152:35;21204:19;;41554:81:0;20828:401:1;41554:81:0;-1:-1:-1;;;;;41654:16:0;;41646:65;;;;-1:-1:-1;;;41646:65:0;;21436:2:1;41646:65:0;;;21418:21:1;21475:2;21455:18;;;21448:30;21514:34;21494:18;;;21487:62;-1:-1:-1;;;21565:18:1;;;21558:34;21609:19;;41646:65:0;21234:400:1;41646:65:0;41724:39;41745:4;41751:2;41755:7;41724:20;:39::i;:::-;41828:29;41845:1;41849:7;41828:8;:29::i;:::-;-1:-1:-1;;;;;41870:15:0;;;;;;:9;:15;;;;;:20;;41889:1;;41870:15;:20;;41889:1;;41870:20;:::i;:::-;;;;-1:-1:-1;;;;;;;41901:13:0;;;;;;:9;:13;;;;;:18;;41918:1;;41901:13;:18;;41918:1;;41901:18;:::i;:::-;;;;-1:-1:-1;;41930:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;41930:21:0;-1:-1:-1;;;;;41930:21:0;;;;;;;;;41969:27;;41930:16;;41969:27;;;;;;;34366:341;34296:411;;:::o;12390:191::-;12483:6;;;-1:-1:-1;;;;;12500:17:0;;;-1:-1:-1;;;;;;12500:17:0;;;;;;;12533:40;;12483:6;;;12500:17;12483:6;;12533:40;;12464:16;;12533:40;12453:128;12390:191;:::o;42489:315::-;42644:8;-1:-1:-1;;;;;42635:17:0;:5;-1:-1:-1;;;;;42635:17:0;;;42627:55;;;;-1:-1:-1;;;42627:55:0;;22104:2:1;42627:55:0;;;22086:21:1;22143:2;22123:18;;;22116:30;22182:27;22162:18;;;22155:55;22227:18;;42627:55:0;21902:349:1;42627:55:0;-1:-1:-1;;;;;42693:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;42693:46:0;;;;;;;;;;42755:41;;540::1;;;42755::0;;513:18:1;42755:41:0;;;;;;;42489:315;;;:::o;37399:::-;37556:28;37566:4;37572:2;37576:7;37556:9;:28::i;:::-;37603:48;37626:4;37632:2;37636:7;37645:5;37603:22;:48::i;:::-;37595:111;;;;-1:-1:-1;;;37595:111:0;;;;;;;:::i;3614:98::-;3672:7;3699:5;3703:1;3699;:5;:::i;2876:98::-;2934:7;2961:5;2965:1;2961;:5;:::i;55454:571::-;55555:9;55550:310;55574:8;55570:1;:12;55550:310;;;55604:17;55624:13;47122:10;:17;;47034:113;55624:13;55604:33;;55652:28;55662:6;55670:9;55652;:28::i;:::-;55704:144;;;23079:25:1;;;23135:2;23120:18;;23113:34;;;23163:18;;;23156:34;;;-1:-1:-1;;;;;23226:32:1;;23221:2;23206:18;;23199:60;55704:144:0;;23066:3:1;23051:19;55704:144:0;;;;;;;-1:-1:-1;55584:3:0;;;;:::i;:::-;;;;55550:310;;;-1:-1:-1;55895:12:0;;;;:5;:12;;;;;:22;;;:36;;55922:8;55895:26;:36::i;:::-;55870:12;;;;:5;:12;;;;;;;;:22;;:61;;;;55974:14;:21;;;;;-1:-1:-1;;;;;55974:29:0;;;;;;;;:43;;56008:8;55974:33;:43::i;:::-;55942:21;;;;:14;:21;;;;;;;;-1:-1:-1;;;;;55942:29:0;;;;;;;;;;;;:75;;;;-1:-1:-1;;55454:571:0:o;56664:108::-;56724:13;56757:7;56750:14;;;;;:::i;7406:723::-;7462:13;7683:10;7679:53;;-1:-1:-1;;7710:10:0;;;;;;;;;;;;-1:-1:-1;;;7710:10:0;;;;;7406:723::o;7679:53::-;7757:5;7742:12;7798:78;7805:9;;7798:78;;7831:8;;;;:::i;:::-;;-1:-1:-1;7854:10:0;;-1:-1:-1;7862:2:0;7854:10;;:::i;:::-;;;7798:78;;;7886:19;7918:6;7908:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7908:17:0;;7886:39;;7936:154;7943:10;;7936:154;;7970:11;7980:1;7970:11;;:::i;:::-;;-1:-1:-1;8039:10:0;8047:2;8039:5;:10;:::i;:::-;8026:24;;:2;:24;:::i;:::-;8013:39;;7996:6;8003;7996:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;7996:56:0;;;;;;;;-1:-1:-1;8067:11:0;8076:2;8067:11;;:::i;:::-;;;7936:154;;48070:589;-1:-1:-1;;;;;48276:18:0;;48272:187;;48311:40;48343:7;49486:10;:17;;49459:24;;;;:15;:24;;;;;:44;;;49514:24;;;;;;;;;;;;49382:164;48311:40;48272:187;;;48381:2;-1:-1:-1;;;;;48373:10:0;:4;-1:-1:-1;;;;;48373:10:0;;48369:90;;48400:47;48433:4;48439:7;48400:32;:47::i;:::-;-1:-1:-1;;;;;48473:16:0;;48469:183;;48506:45;48543:7;48506:36;:45::i;48469:183::-;48579:4;-1:-1:-1;;;;;48573:10:0;:2;-1:-1:-1;;;;;48573:10:0;;48569:83;;48600:40;48628:2;48632:7;48600:27;:40::i;43369:799::-;43524:4;-1:-1:-1;;;;;43545:13:0;;14116:19;:23;43541:620;;43581:72;;-1:-1:-1;;;43581:72:0;;-1:-1:-1;;;;;43581:36:0;;;;;:72;;9924:10;;43632:4;;43638:7;;43647:5;;43581:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43581:72:0;;;;;;;;-1:-1:-1;;43581:72:0;;;;;;;;;;;;:::i;:::-;;;43577:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43823:13:0;;43819:272;;43866:60;;-1:-1:-1;;;43866:60:0;;;;;;;:::i;43819:272::-;44041:6;44035:13;44026:6;44022:2;44018:15;44011:38;43577:529;-1:-1:-1;;;;;;43704:51:0;-1:-1:-1;;;43704:51:0;;-1:-1:-1;43697:58:0;;43541:620;-1:-1:-1;44145:4:0;43369:799;;;;;;:::o;39011:110::-;39087:26;39097:2;39101:7;39087:26;;;;;;;;;;;;:9;:26::i;50173:988::-;50439:22;50489:1;50464:22;50481:4;50464:16;:22::i;:::-;:26;;;;:::i;:::-;50501:18;50522:26;;;:17;:26;;;;;;50439:51;;-1:-1:-1;50655:28:0;;;50651:328;;-1:-1:-1;;;;;50722:18:0;;50700:19;50722:18;;;:12;:18;;;;;;;;:34;;;;;;;;;50773:30;;;;;;:44;;;50890:30;;:17;:30;;;;;:43;;;50651:328;-1:-1:-1;51075:26:0;;;;:17;:26;;;;;;;;51068:33;;;-1:-1:-1;;;;;51119:18:0;;;;;:12;:18;;;;;:34;;;;;;;51112:41;50173:988::o;51456:1079::-;51734:10;:17;51709:22;;51734:21;;51754:1;;51734:21;:::i;:::-;51766:18;51787:24;;;:15;:24;;;;;;52160:10;:26;;51709:46;;-1:-1:-1;51787:24:0;;51709:46;;52160:26;;;;;;:::i;:::-;;;;;;;;;52138:48;;52224:11;52199:10;52210;52199:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;52304:28;;;:15;:28;;;;;;;:41;;;52476:24;;;;;52469:31;52511:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;51527:1008;;;51456:1079;:::o;48960:221::-;49045:14;49062:20;49079:2;49062:16;:20::i;:::-;-1:-1:-1;;;;;49093:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;49138:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;48960:221:0:o;39348:321::-;39478:18;39484:2;39488:7;39478:5;:18::i;:::-;39529:54;39560:1;39564:2;39568:7;39577:5;39529:22;:54::i;:::-;39507:154;;;;-1:-1:-1;;;39507:154:0;;;;;;;:::i;40005:439::-;-1:-1:-1;;;;;40085:16:0;;40077:61;;;;-1:-1:-1;;;40077:61:0;;24726:2:1;40077:61:0;;;24708:21:1;;;24745:18;;;24738:30;24804:34;24784:18;;;24777:62;24856:18;;40077:61:0;24524:356:1;40077:61:0;38092:4;38116:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38116:16:0;:30;40149:58;;;;-1:-1:-1;;;40149:58:0;;25087:2:1;40149:58:0;;;25069:21:1;25126:2;25106:18;;;25099:30;25165;25145:18;;;25138:58;25213:18;;40149:58:0;24885:352:1;40149:58:0;40220:45;40249:1;40253:2;40257:7;40220:20;:45::i;:::-;-1:-1:-1;;;;;40278:13:0;;;;;;:9;:13;;;;;:18;;40295:1;;40278:13;:18;;40295:1;;40278:18;:::i;:::-;;;;-1:-1:-1;;40307:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;40307:21:0;-1:-1:-1;;;;;40307:21:0;;;;;;;;40346:33;;40307:16;;;40346:33;;40307:16;;40346:33;57380:243:::1;57312:311:::0;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1551:180::-;1610:6;1663:2;1651:9;1642:7;1638:23;1634:32;1631:52;;;1679:1;1676;1669:12;1631:52;-1:-1:-1;1702:23:1;;1551:180;-1:-1:-1;1551:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:::-;2423:6;2431;2484:2;2472:9;2463:7;2459:23;2455:32;2452:52;;;2500:1;2497;2490:12;2452:52;2536:9;2523:23;2513:33;;2565:38;2599:2;2588:9;2584:18;2565:38;:::i;:::-;2555:48;;2355:254;;;;;:::o;2614:328::-;2691:6;2699;2707;2760:2;2748:9;2739:7;2735:23;2731:32;2728:52;;;2776:1;2773;2766:12;2728:52;2799:29;2818:9;2799:29;:::i;:::-;2789:39;;2847:38;2881:2;2870:9;2866:18;2847:38;:::i;:::-;2837:48;;2932:2;2921:9;2917:18;2904:32;2894:42;;2614:328;;;;;:::o;2947:186::-;3006:6;3059:2;3047:9;3038:7;3034:23;3030:32;3027:52;;;3075:1;3072;3065:12;3027:52;3098:29;3117:9;3098:29;:::i;3138:127::-;3199:10;3194:3;3190:20;3187:1;3180:31;3230:4;3227:1;3220:15;3254:4;3251:1;3244:15;3270:632;3335:5;3365:18;3406:2;3398:6;3395:14;3392:40;;;3412:18;;:::i;:::-;3487:2;3481:9;3455:2;3541:15;;-1:-1:-1;;3537:24:1;;;3563:2;3533:33;3529:42;3517:55;;;3587:18;;;3607:22;;;3584:46;3581:72;;;3633:18;;:::i;:::-;3673:10;3669:2;3662:22;3702:6;3693:15;;3732:6;3724;3717:22;3772:3;3763:6;3758:3;3754:16;3751:25;3748:45;;;3789:1;3786;3779:12;3748:45;3839:6;3834:3;3827:4;3819:6;3815:17;3802:44;3894:1;3887:4;3878:6;3870;3866:19;3862:30;3855:41;;;;3270:632;;;;;:::o;3907:451::-;3976:6;4029:2;4017:9;4008:7;4004:23;4000:32;3997:52;;;4045:1;4042;4035:12;3997:52;4085:9;4072:23;4118:18;4110:6;4107:30;4104:50;;;4150:1;4147;4140:12;4104:50;4173:22;;4226:4;4218:13;;4214:27;-1:-1:-1;4204:55:1;;4255:1;4252;4245:12;4204:55;4278:74;4344:7;4339:2;4326:16;4321:2;4317;4313:11;4278:74;:::i;4363:118::-;4449:5;4442:13;4435:21;4428:5;4425:32;4415:60;;4471:1;4468;4461:12;4486:315;4551:6;4559;4612:2;4600:9;4591:7;4587:23;4583:32;4580:52;;;4628:1;4625;4618:12;4580:52;4651:29;4670:9;4651:29;:::i;:::-;4641:39;;4730:2;4719:9;4715:18;4702:32;4743:28;4765:5;4743:28;:::i;:::-;4790:5;4780:15;;;4486:315;;;;;:::o;4806:523::-;4910:6;4918;4926;4934;4942;4950;5003:3;4991:9;4982:7;4978:23;4974:33;4971:53;;;5020:1;5017;5010:12;4971:53;-1:-1:-1;;5043:23:1;;;5113:2;5098:18;;5085:32;;-1:-1:-1;5164:2:1;5149:18;;5136:32;;5215:2;5200:18;;5187:32;;-1:-1:-1;5266:3:1;5251:19;;5238:33;;-1:-1:-1;5318:3:1;5303:19;5290:33;;-1:-1:-1;4806:523:1;-1:-1:-1;4806:523:1:o;5874:667::-;5969:6;5977;5985;5993;6046:3;6034:9;6025:7;6021:23;6017:33;6014:53;;;6063:1;6060;6053:12;6014:53;6086:29;6105:9;6086:29;:::i;:::-;6076:39;;6134:38;6168:2;6157:9;6153:18;6134:38;:::i;:::-;6124:48;;6219:2;6208:9;6204:18;6191:32;6181:42;;6274:2;6263:9;6259:18;6246:32;6301:18;6293:6;6290:30;6287:50;;;6333:1;6330;6323:12;6287:50;6356:22;;6409:4;6401:13;;6397:27;-1:-1:-1;6387:55:1;;6438:1;6435;6428:12;6387:55;6461:74;6527:7;6522:2;6509:16;6504:2;6500;6496:11;6461:74;:::i;:::-;6451:84;;;5874:667;;;;;;;:::o;6546:689::-;6641:6;6649;6657;6710:2;6698:9;6689:7;6685:23;6681:32;6678:52;;;6726:1;6723;6716:12;6678:52;6766:9;6753:23;6795:18;6836:2;6828:6;6825:14;6822:34;;;6852:1;6849;6842:12;6822:34;6890:6;6879:9;6875:22;6865:32;;6935:7;6928:4;6924:2;6920:13;6916:27;6906:55;;6957:1;6954;6947:12;6906:55;6997:2;6984:16;7023:2;7015:6;7012:14;7009:34;;;7039:1;7036;7029:12;7009:34;7094:7;7087:4;7077:6;7074:1;7070:14;7066:2;7062:23;7058:34;7055:47;7052:67;;;7115:1;7112;7105:12;7052:67;7146:4;7138:13;;;;7170:6;;-1:-1:-1;7208:20:1;;;;7195:34;;6546:689;-1:-1:-1;;;;6546:689:1:o;7240:618::-;7342:6;7350;7358;7366;7374;7382;7435:3;7423:9;7414:7;7410:23;7406:33;7403:53;;;7452:1;7449;7442:12;7403:53;7475:29;7494:9;7475:29;:::i;:::-;7465:39;;7551:2;7540:9;7536:18;7523:32;7513:42;;7602:2;7591:9;7587:18;7574:32;7564:42;;7656:2;7645:9;7641:18;7628:32;7700:4;7693:5;7689:16;7682:5;7679:27;7669:55;;7720:1;7717;7710:12;7669:55;7240:618;;;;-1:-1:-1;7240:618:1;;7795:3;7780:19;;7767:33;;7847:3;7832:19;;;7819:33;;-1:-1:-1;7240:618:1;-1:-1:-1;;7240:618:1:o;7863:260::-;7931:6;7939;7992:2;7980:9;7971:7;7967:23;7963:32;7960:52;;;8008:1;8005;7998:12;7960:52;8031:29;8050:9;8031:29;:::i;:::-;8021:39;;8079:38;8113:2;8102:9;8098:18;8079:38;:::i;8128:380::-;8207:1;8203:12;;;;8250;;;8271:61;;8325:4;8317:6;8313:17;8303:27;;8271:61;8378:2;8370:6;8367:14;8347:18;8344:38;8341:161;;;8424:10;8419:3;8415:20;8412:1;8405:31;8459:4;8456:1;8449:15;8487:4;8484:1;8477:15;8341:161;;8128:380;;;:::o;9753:413::-;9955:2;9937:21;;;9994:2;9974:18;;;9967:30;10033:34;10028:2;10013:18;;10006:62;-1:-1:-1;;;10099:2:1;10084:18;;10077:47;10156:3;10141:19;;9753:413::o;10583:356::-;10785:2;10767:21;;;10804:18;;;10797:30;10863:34;10858:2;10843:18;;10836:62;10930:2;10915:18;;10583:356::o;11324:184::-;11394:6;11447:2;11435:9;11426:7;11422:23;11418:32;11415:52;;;11463:1;11460;11453:12;11415:52;-1:-1:-1;11486:16:1;;11324:184;-1:-1:-1;11324:184:1:o;12136:245::-;12203:6;12256:2;12244:9;12235:7;12231:23;12227:32;12224:52;;;12272:1;12269;12262:12;12224:52;12304:9;12298:16;12323:28;12345:5;12323:28;:::i;13009:127::-;13070:10;13065:3;13061:20;13058:1;13051:31;13101:4;13098:1;13091:15;13125:4;13122:1;13115:15;15343:127;15404:10;15399:3;15395:20;15392:1;15385:31;15435:4;15432:1;15425:15;15459:4;15456:1;15449:15;15475:135;15514:3;-1:-1:-1;;15535:17:1;;15532:43;;;15555:18;;:::i;:::-;-1:-1:-1;15602:1:1;15591:13;;15475:135::o;16031:470::-;16210:3;16248:6;16242:13;16264:53;16310:6;16305:3;16298:4;16290:6;16286:17;16264:53;:::i;:::-;16380:13;;16339:16;;;;16402:57;16380:13;16339:16;16436:4;16424:17;;16402:57;:::i;:::-;16475:20;;16031:470;-1:-1:-1;;;;16031:470:1:o;21639:125::-;21679:4;21707:1;21704;21701:8;21698:34;;;21712:18;;:::i;:::-;-1:-1:-1;21749:9:1;;21639:125::o;21769:128::-;21809:3;21840:1;21836:6;21833:1;21830:13;21827:39;;;21846:18;;:::i;:::-;-1:-1:-1;21882:9:1;;21769:128::o;22256:414::-;22458:2;22440:21;;;22497:2;22477:18;;;22470:30;22536:34;22531:2;22516:18;;22509:62;-1:-1:-1;;;22602:2:1;22587:18;;22580:48;22660:3;22645:19;;22256:414::o;22675:168::-;22715:7;22781:1;22777;22773:6;22769:14;22766:1;22763:21;22758:1;22751:9;22744:17;22740:45;22737:71;;;22788:18;;:::i;:::-;-1:-1:-1;22828:9:1;;22675:168::o;23270:127::-;23331:10;23326:3;23322:20;23319:1;23312:31;23362:4;23359:1;23352:15;23386:4;23383:1;23376:15;23402:120;23442:1;23468;23458:35;;23473:18;;:::i;:::-;-1:-1:-1;23507:9:1;;23402:120::o;23527:112::-;23559:1;23585;23575:35;;23590:18;;:::i;:::-;-1:-1:-1;23624:9:1;;23527:112::o;23644:489::-;-1:-1:-1;;;;;23913:15:1;;;23895:34;;23965:15;;23960:2;23945:18;;23938:43;24012:2;23997:18;;23990:34;;;24060:3;24055:2;24040:18;;24033:31;;;23838:4;;24081:46;;24107:19;;24099:6;24081:46;:::i;:::-;24073:54;23644:489;-1:-1:-1;;;;;;23644:489:1:o;24138:249::-;24207:6;24260:2;24248:9;24239:7;24235:23;24231:32;24228:52;;;24276:1;24273;24266:12;24228:52;24308:9;24302:16;24327:30;24351:5;24327:30;:::i;24392:127::-;24453:10;24448:3;24444:20;24441:1;24434:31;24484:4;24481:1;24474:15;24508:4;24505:1;24498:15

Swarm Source

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