ETH Price: $3,479.31 (+0.91%)

Token

Gnome Garden (GNOME)
 

Overview

Max Total Supply

6,932 GNOME

Holders

2,566

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
0xwarning.eth
Balance
1 GNOME
0x2ef1630993bc569a18f8c406ab720e2d040e155a
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:
GnomeGardenNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// _____/\\\\\\\\\\\\______________________________________________________________________________/\\\\\\\\\\\\______________________________________/\\\_______________________________        
//  ___/\\\//////////_____________________________________________________________________________/\\\//////////______________________________________\/\\\_______________________________       
//   __/\\\_______________________________________________________________________________________/\\\_________________________________________________\/\\\_______________________________      
//    _\/\\\____/\\\\\\\__/\\/\\\\\\_______/\\\\\_______/\\\\\__/\\\\\_______/\\\\\\\\____________\/\\\____/\\\\\\\__/\\\\\\\\\_____/\\/\\\\\\\_________\/\\\______/\\\\\\\\___/\\/\\\\\\___     
//     _\/\\\___\/////\\\_\/\\\////\\\____/\\\///\\\___/\\\///\\\\\///\\\___/\\\/////\\\___________\/\\\___\/////\\\_\////////\\\___\/\\\/////\\\___/\\\\\\\\\____/\\\/////\\\_\/\\\////\\\__    
//      _\/\\\_______\/\\\_\/\\\__\//\\\__/\\\__\//\\\_\/\\\_\//\\\__\/\\\__/\\\\\\\\\\\____________\/\\\_______\/\\\___/\\\\\\\\\\__\/\\\___\///___/\\\////\\\___/\\\\\\\\\\\__\/\\\__\//\\\_   
//       _\/\\\_______\/\\\_\/\\\___\/\\\_\//\\\__/\\\__\/\\\__\/\\\__\/\\\_\//\\///////_____________\/\\\_______\/\\\__/\\\/////\\\__\/\\\_________\/\\\__\/\\\__\//\\///////___\/\\\___\/\\\_  
//        _\//\\\\\\\\\\\\/__\/\\\___\/\\\__\///\\\\\/___\/\\\__\/\\\__\/\\\__\//\\\\\\\\\\___________\//\\\\\\\\\\\\/__\//\\\\\\\\/\\_\/\\\_________\//\\\\\\\/\\__\//\\\\\\\\\\_\/\\\___\/\\\_ 
//         __\////////////____\///____\///_____\/////_____\///___\///___\///____\//////////_____________\////////////_____\////////\//__\///___________\///////\//____\//////////__\///____\///__

// SPDX-License-Identifier: MIT

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: ECDSA.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: Address.sol



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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: Payment.sol


// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;



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

    uint256 private _totalShares;
    uint256 private _totalReleased;

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

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

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

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

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

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


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

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


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

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

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

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

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

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


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

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

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}
// File: IERC721Receiver.sol



pragma solidity ^0.8.0;

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: 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: ERC721A.sol


pragma solidity ^0.8.0;









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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

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

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

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

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

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

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

pragma solidity ^0.8.2;

contract GnomeGardenNFT is ERC721A, Ownable, ReentrancyGuard {  
    using Strings for uint256;
    string public _partslink;
    bool public byebye = false;
    uint256 constant public gnomes = 9999;
    uint256 constant public gnomenormalbyebye = 1; 
    uint256 constant public gnomeWhitlistByebye = 2; 

    mapping(address => uint256) public howmanygnomes;
    address[] public whitlistaddresses;
    mapping(address => uint256) public whitlistaddressesMap;

   
	constructor() ERC721A("Gnome Garden", "GNOME") {}

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

 	function makinGnome() public nonReentrant {
  	    uint256 totalgnomes = totalSupply();
        require(!byebye,"Making is closed.");
        require(msg.sender == tx.origin,"Contract call not allowed.");
        uint256 gnomebyebye = calUserGnomeRemainMake(msg.sender);
        require(gnomebyebye>0," User maximum quantity exceeded.");

        require(totalgnomes + gnomebyebye <= gnomes,"Exceeding the maximum circulation");
 
        _safeMint(msg.sender, gnomebyebye);
        howmanygnomes[msg.sender] += gnomebyebye;
        if(totalgnomes + gnomebyebye >= gnomes){
            byebye = true;
        }
    }

 	function makeGnomeFly(address lords, uint256 _gnomes) public onlyOwner {
  	    uint256 totalgnomes = totalSupply();
	    require(totalgnomes + _gnomes <= gnomes,"Exceeding the maximum circulation");
        _safeMint(lords, _gnomes);
        
        if(totalgnomes + _gnomes >= gnomes){
            byebye = true;
        }
    }

    function makeGnomeByebye(bool _bye) external onlyOwner {
        byebye = _bye;
    }


    function makeGnomeHaveparts(string memory parts) external onlyOwner {
        _partslink = parts;
    }

    function sumthInboutFunds() public payable onlyOwner {
	(bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
		require(success);
	}


    function calUserGnomeRemainMake(address user) public view returns(uint256){
        uint256 _byebye = gnomenormalbyebye;
         for (uint256 i = 0; i < whitlistaddresses.length; i++) {
             uint256 _count = IERC721(whitlistaddresses[i]).balanceOf(user);
             if(_count > 0){
                _byebye = whitlistaddressesMap[whitlistaddresses[i]];
                if(_byebye > 0){
                    break;
                }else{
                    _byebye = gnomenormalbyebye;
                }
                
             }
         }
         uint256 _remain = _byebye - howmanygnomes[user];
         if(_remain < 0){
            _remain = 0;
         }
         uint256 totalgnomes = totalSupply();
         if(totalgnomes + _remain > gnomes){
             if(_remain > gnomenormalbyebye){
                _remain = gnomenormalbyebye;
                if(totalgnomes + _remain > gnomes){
                    _remain = 0;
                }
             }else{
                _remain = 0;
             }

         }
        return _remain;
    }

    function setWhitlistes(address[] calldata _whitlistaddresses) external onlyOwner{
        for (uint256 i = 0; i < _whitlistaddresses.length; i++) {
            if(whitlistaddressesMap[_whitlistaddresses[i]] == 0){
                whitlistaddresses.push(_whitlistaddresses[i]);
                whitlistaddressesMap[_whitlistaddresses[i]] = gnomeWhitlistByebye;
            }else{
                whitlistaddressesMap[_whitlistaddresses[i]] = gnomeWhitlistByebye;
            }
        }
    }
}

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":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":"_partslink","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"byebye","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"calUserGnomeRemainMake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gnomeWhitlistByebye","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gnomenormalbyebye","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gnomes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"howmanygnomes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_bye","type":"bool"}],"name":"makeGnomeByebye","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lords","type":"address"},{"internalType":"uint256","name":"_gnomes","type":"uint256"}],"name":"makeGnomeFly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"parts","type":"string"}],"name":"makeGnomeHaveparts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"makinGnome","outputs":[],"stateMutability":"nonpayable","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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_whitlistaddresses","type":"address[]"}],"name":"setWhitlistes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sumthInboutFunds","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitlistaddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitlistaddressesMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052600a805460ff191690553480156200001b57600080fd5b50604080518082018252600c81526b23b737b6b29023b0b93232b760a11b602080830191825283518085019094526005845264474e4f4d4560d81b9084015281519192916200006d9160019162000101565b5080516200008390600290602084019062000101565b505050620000a06200009a620000ab60201b60201c565b620000af565b6001600855620001e4565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200010f90620001a7565b90600052602060002090601f0160209004810192826200013357600085556200017e565b82601f106200014e57805160ff19168380011785556200017e565b828001600101855582156200017e579182015b828111156200017e57825182559160200191906001019062000161565b506200018c92915062000190565b5090565b5b808211156200018c576000815560010162000191565b600181811c90821680620001bc57607f821691505b60208210811415620001de57634e487b7160e01b600052602260045260246000fd5b50919050565b61246280620001f46000396000f3fe6080604052600436106101f95760003560e01c8063715018a61161010d578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c514610566578063ee9831e7146105af578063f2fde38b146105dc578063f522fe52146105fc578063f889f9a41461061c57600080fd5b8063b88d4fde146104f1578063be34f38e14610511578063c87b56dd14610526578063ddfcb4d01461054657600080fd5b806395d89b41116100dc57806395d89b4114610482578063a01ffdff14610497578063a22cb465146104b1578063b6d52094146104d157600080fd5b8063715018a614610419578063737c2a3f1461042e5780638da5cb5b1461044e5780638dc3029a1461046c57600080fd5b80632f745c59116101905780634e8b549a1161015f5780634e8b549a146103845780634f6ccce7146103995780636352211e146103b957806369c8c9b5146103d957806370a08231146103f957600080fd5b80632f745c591461030f5780633232deeb1461032f57806342842e0e146103445780634883d8421461036457600080fd5b8063092d7210116101cc578063092d7210146102b0578063095ea7b3146102ba57806318160ddd146102da57806323b872dd146102ef57600080fd5b806301ffc9a7146101fe57806306fdde031461023357806307a2aec914610255578063081812fc14610278575b600080fd5b34801561020a57600080fd5b5061021e6102193660046120bc565b610649565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b506102486106b6565b60405161022a9190612209565b34801561026157600080fd5b5061026a600281565b60405190815260200161022a565b34801561028457600080fd5b5061029861029336600461213f565b610748565b6040516001600160a01b03909116815260200161022a565b6102b86107d8565b005b3480156102c657600080fd5b506102b86102d5366004612002565b61085a565b3480156102e657600080fd5b5060005461026a565b3480156102fb57600080fd5b506102b861030a366004611f20565b610972565b34801561031b57600080fd5b5061026a61032a366004612002565b61097d565b34801561033b57600080fd5b50610248610ada565b34801561035057600080fd5b506102b861035f366004611f20565b610b68565b34801561037057600080fd5b506102b861037f366004612002565b610b83565b34801561039057600080fd5b5061026a600181565b3480156103a557600080fd5b5061026a6103b436600461213f565b610c09565b3480156103c557600080fd5b506102986103d436600461213f565b610c6b565b3480156103e557600080fd5b5061026a6103f4366004611ed2565b610c7d565b34801561040557600080fd5b5061026a610414366004611ed2565b610e06565b34801561042557600080fd5b506102b8610e97565b34801561043a57600080fd5b506102b86104493660046120a1565b610ecd565b34801561045a57600080fd5b506007546001600160a01b0316610298565b34801561047857600080fd5b5061026a61270f81565b34801561048e57600080fd5b50610248610f0a565b3480156104a357600080fd5b50600a5461021e9060ff1681565b3480156104bd57600080fd5b506102b86104cc366004611fd8565b610f19565b3480156104dd57600080fd5b506102b86104ec3660046120f6565b610fde565b3480156104fd57600080fd5b506102b861050c366004611f5c565b61101f565b34801561051d57600080fd5b506102b8611058565b34801561053257600080fd5b5061024861054136600461213f565b611229565b34801561055257600080fd5b506102b861056136600461202c565b6112f7565b34801561057257600080fd5b5061021e610581366004611eed565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156105bb57600080fd5b5061026a6105ca366004611ed2565b600d6020526000908152604090205481565b3480156105e857600080fd5b506102b86105f7366004611ed2565b611474565b34801561060857600080fd5b5061029861061736600461213f565b61150c565b34801561062857600080fd5b5061026a610637366004611ed2565b600b6020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b148061067a57506001600160e01b03198216635b5e139f60e01b145b8061069557506001600160e01b0319821663780e9d6360e01b145b806106b057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546106c590612354565b80601f01602080910402602001604051908101604052809291908181526020018280546106f190612354565b801561073e5780601f106107135761010080835404028352916020019161073e565b820191906000526020600020905b81548152906001019060200180831161072157829003601f168201915b5050505050905090565b6000610755826000541190565b6107bc5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6007546001600160a01b031633146108025760405162461bcd60e51b81526004016107b39061225d565b604051600090339047908381818185875af1925050503d8060008114610844576040519150601f19603f3d011682016040523d82523d6000602084013e610849565b606091505b505090508061085757600080fd5b50565b600061086582610c6b565b9050806001600160a01b0316836001600160a01b031614156108d45760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016107b3565b336001600160a01b03821614806108f057506108f08133610581565b6109625760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016107b3565b61096d838383611536565b505050565b61096d838383611592565b600061098883610e06565b82106109e15760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016107b3565b600080549080805b83811015610a7a576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610a3c57805192505b876001600160a01b0316836001600160a01b03161415610a715786841415610a6a575093506106b092505050565b6001909301925b506001016109e9565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016107b3565b60098054610ae790612354565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1390612354565b8015610b605780601f10610b3557610100808354040283529160200191610b60565b820191906000526020600020905b815481529060010190602001808311610b4357829003601f168201915b505050505081565b61096d8383836040518060200160405280600081525061101f565b6007546001600160a01b03163314610bad5760405162461bcd60e51b81526004016107b39061225d565b60005461270f610bbd83836122e5565b1115610bdb5760405162461bcd60e51b81526004016107b39061221c565b610be58383611877565b61270f610bf283836122e5565b1061096d57600a805460ff19166001179055505050565b600080548210610c675760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016107b3565b5090565b6000610c7682611891565b5192915050565b60006001815b600c54811015610d92576000600c8281548110610ca257610ca26123ea565b6000918252602090912001546040516370a0823160e01b81526001600160a01b038781166004830152909116906370a082319060240160206040518083038186803b158015610cf057600080fd5b505afa158015610d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d289190612158565b90508015610d7f57600d6000600c8481548110610d4757610d476123ea565b60009182526020808320909101546001600160a01b0316835282019290925260400190205492508215610d7a5750610d92565b600192505b5080610d8a8161238f565b915050610c83565b506001600160a01b0383166000908152600b6020526040812054610db69083612311565b60005490915061270f610dc983836122e5565b1115610dfe576001821115610df9576001915061270f610de983836122e5565b1115610df457600091505b610dfe565b600091505b509392505050565b60006001600160a01b038216610e725760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016107b3565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b03163314610ec15760405162461bcd60e51b81526004016107b39061225d565b610ecb6000611968565b565b6007546001600160a01b03163314610ef75760405162461bcd60e51b81526004016107b39061225d565b600a805460ff1916911515919091179055565b6060600280546106c590612354565b6001600160a01b038216331415610f725760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016107b3565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146110085760405162461bcd60e51b81526004016107b39061225d565b805161101b906009906020840190611da0565b5050565b61102a848484611592565b611036848484846119ba565b6110525760405162461bcd60e51b81526004016107b390612292565b50505050565b600260085414156110ab5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107b3565b6002600855600054600a5460ff16156110fa5760405162461bcd60e51b815260206004820152601160248201527026b0b5b4b7339034b99031b637b9b2b21760791b60448201526064016107b3565b3332146111495760405162461bcd60e51b815260206004820152601a60248201527f436f6e74726163742063616c6c206e6f7420616c6c6f7765642e00000000000060448201526064016107b3565b600061115433610c7d565b9050600081116111a65760405162461bcd60e51b815260206004820181905260248201527f2055736572206d6178696d756d207175616e746974792065786365656465642e60448201526064016107b3565b61270f6111b382846122e5565b11156111d15760405162461bcd60e51b81526004016107b39061221c565b6111db3382611877565b336000908152600b6020526040812080548392906111fa9084906122e5565b9091555061270f905061120d82846122e5565b1061122057600a805460ff191660011790555b50506001600855565b6060611236826000541190565b61129a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107b3565b60006112a4611ac8565b90508051600014156112c557604051806020016040528060008152506112f0565b806112cf84611ad7565b6040516020016112e092919061219d565b6040516020818303038152906040525b9392505050565b6007546001600160a01b031633146113215760405162461bcd60e51b81526004016107b39061225d565b60005b8181101561096d57600d6000848484818110611342576113426123ea565b90506020020160208101906113579190611ed2565b6001600160a01b0316815260208101919091526040016000205461141a57600c838383818110611389576113896123ea565b905060200201602081019061139e9190611ed2565b81546001810183556000928352602083200180546001600160a01b0319166001600160a01b0392909216919091179055600290600d908585858181106113e6576113e66123ea565b90506020020160208101906113fb9190611ed2565b6001600160a01b03168152602081019190915260400160002055611462565b6002600d6000858585818110611432576114326123ea565b90506020020160208101906114479190611ed2565b6001600160a01b031681526020810191909152604001600020555b8061146c8161238f565b915050611324565b6007546001600160a01b0316331461149e5760405162461bcd60e51b81526004016107b39061225d565b6001600160a01b0381166115035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b3565b61085781611968565b600c818154811061151c57600080fd5b6000918252602090912001546001600160a01b0316905081565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061159d82611891565b80519091506000906001600160a01b0316336001600160a01b031614806115d45750336115c984610748565b6001600160a01b0316145b806115e6575081516115e69033610581565b9050806116505760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016107b3565b846001600160a01b031682600001516001600160a01b0316146116c45760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016107b3565b6001600160a01b0384166117285760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107b3565b6117386000848460000151611536565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff160217905590860180835291205490911661182d576117e0816000541190565b1561182d578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b61101b828260405180602001604052806000815250611bd5565b60408051808201909152600080825260208201526118b0826000541190565b61190f5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016107b3565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561195e579392505050565b5060001901611911565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b15611abc57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119fe9033908990889088906004016121cc565b602060405180830381600087803b158015611a1857600080fd5b505af1925050508015611a48575060408051601f3d908101601f19168201909252611a45918101906120d9565b60015b611aa2573d808015611a76576040519150601f19603f3d011682016040523d82523d6000602084013e611a7b565b606091505b508051611a9a5760405162461bcd60e51b81526004016107b390612292565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611ac0565b5060015b949350505050565b6060600980546106c590612354565b606081611afb5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611b255780611b0f8161238f565b9150611b1e9050600a836122fd565b9150611aff565b60008167ffffffffffffffff811115611b4057611b40612400565b6040519080825280601f01601f191660200182016040528015611b6a576020820181803683370190505b5090505b8415611ac057611b7f600183612311565b9150611b8c600a866123aa565b611b979060306122e5565b60f81b818381518110611bac57611bac6123ea565b60200101906001600160f81b031916908160001a905350611bce600a866122fd565b9450611b6e565b61096d83838360016000546001600160a01b038516611c405760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107b3565b83611c9e5760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b60648201526084016107b3565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b85811015611d975760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315611d8b57611d6f60008884886119ba565b611d8b5760405162461bcd60e51b81526004016107b390612292565b60019182019101611d1c565b50600055611870565b828054611dac90612354565b90600052602060002090601f016020900481019282611dce5760008555611e14565b82601f10611de757805160ff1916838001178555611e14565b82800160010185558215611e14579182015b82811115611e14578251825591602001919060010190611df9565b50610c679291505b80821115610c675760008155600101611e1c565b600067ffffffffffffffff80841115611e4b57611e4b612400565b604051601f8501601f19908116603f01168101908282118183101715611e7357611e73612400565b81604052809350858152868686011115611e8c57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611ebd57600080fd5b919050565b80358015158114611ebd57600080fd5b600060208284031215611ee457600080fd5b6112f082611ea6565b60008060408385031215611f0057600080fd5b611f0983611ea6565b9150611f1760208401611ea6565b90509250929050565b600080600060608486031215611f3557600080fd5b611f3e84611ea6565b9250611f4c60208501611ea6565b9150604084013590509250925092565b60008060008060808587031215611f7257600080fd5b611f7b85611ea6565b9350611f8960208601611ea6565b925060408501359150606085013567ffffffffffffffff811115611fac57600080fd5b8501601f81018713611fbd57600080fd5b611fcc87823560208401611e30565b91505092959194509250565b60008060408385031215611feb57600080fd5b611ff483611ea6565b9150611f1760208401611ec2565b6000806040838503121561201557600080fd5b61201e83611ea6565b946020939093013593505050565b6000806020838503121561203f57600080fd5b823567ffffffffffffffff8082111561205757600080fd5b818501915085601f83011261206b57600080fd5b81358181111561207a57600080fd5b8660208260051b850101111561208f57600080fd5b60209290920196919550909350505050565b6000602082840312156120b357600080fd5b6112f082611ec2565b6000602082840312156120ce57600080fd5b81356112f081612416565b6000602082840312156120eb57600080fd5b81516112f081612416565b60006020828403121561210857600080fd5b813567ffffffffffffffff81111561211f57600080fd5b8201601f8101841361213057600080fd5b611ac084823560208401611e30565b60006020828403121561215157600080fd5b5035919050565b60006020828403121561216a57600080fd5b5051919050565b60008151808452612189816020860160208601612328565b601f01601f19169290920160200192915050565b600083516121af818460208801612328565b8351908301906121c3818360208801612328565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121ff90830184612171565b9695505050505050565b6020815260006112f06020830184612171565b60208082526021908201527f457863656564696e6720746865206d6178696d756d2063697263756c6174696f6040820152603760f91b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b600082198211156122f8576122f86123be565b500190565b60008261230c5761230c6123d4565b500490565b600082821015612323576123236123be565b500390565b60005b8381101561234357818101518382015260200161232b565b838111156110525750506000910152565b600181811c9082168061236857607f821691505b6020821081141561238957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156123a3576123a36123be565b5060010190565b6000826123b9576123b96123d4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461085757600080fdfea264697066735822122026d70ff68b3aadf2a8a979b297100f73ed54899384e12dae96aa1aead6cc1b0b64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101f95760003560e01c8063715018a61161010d578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c514610566578063ee9831e7146105af578063f2fde38b146105dc578063f522fe52146105fc578063f889f9a41461061c57600080fd5b8063b88d4fde146104f1578063be34f38e14610511578063c87b56dd14610526578063ddfcb4d01461054657600080fd5b806395d89b41116100dc57806395d89b4114610482578063a01ffdff14610497578063a22cb465146104b1578063b6d52094146104d157600080fd5b8063715018a614610419578063737c2a3f1461042e5780638da5cb5b1461044e5780638dc3029a1461046c57600080fd5b80632f745c59116101905780634e8b549a1161015f5780634e8b549a146103845780634f6ccce7146103995780636352211e146103b957806369c8c9b5146103d957806370a08231146103f957600080fd5b80632f745c591461030f5780633232deeb1461032f57806342842e0e146103445780634883d8421461036457600080fd5b8063092d7210116101cc578063092d7210146102b0578063095ea7b3146102ba57806318160ddd146102da57806323b872dd146102ef57600080fd5b806301ffc9a7146101fe57806306fdde031461023357806307a2aec914610255578063081812fc14610278575b600080fd5b34801561020a57600080fd5b5061021e6102193660046120bc565b610649565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b506102486106b6565b60405161022a9190612209565b34801561026157600080fd5b5061026a600281565b60405190815260200161022a565b34801561028457600080fd5b5061029861029336600461213f565b610748565b6040516001600160a01b03909116815260200161022a565b6102b86107d8565b005b3480156102c657600080fd5b506102b86102d5366004612002565b61085a565b3480156102e657600080fd5b5060005461026a565b3480156102fb57600080fd5b506102b861030a366004611f20565b610972565b34801561031b57600080fd5b5061026a61032a366004612002565b61097d565b34801561033b57600080fd5b50610248610ada565b34801561035057600080fd5b506102b861035f366004611f20565b610b68565b34801561037057600080fd5b506102b861037f366004612002565b610b83565b34801561039057600080fd5b5061026a600181565b3480156103a557600080fd5b5061026a6103b436600461213f565b610c09565b3480156103c557600080fd5b506102986103d436600461213f565b610c6b565b3480156103e557600080fd5b5061026a6103f4366004611ed2565b610c7d565b34801561040557600080fd5b5061026a610414366004611ed2565b610e06565b34801561042557600080fd5b506102b8610e97565b34801561043a57600080fd5b506102b86104493660046120a1565b610ecd565b34801561045a57600080fd5b506007546001600160a01b0316610298565b34801561047857600080fd5b5061026a61270f81565b34801561048e57600080fd5b50610248610f0a565b3480156104a357600080fd5b50600a5461021e9060ff1681565b3480156104bd57600080fd5b506102b86104cc366004611fd8565b610f19565b3480156104dd57600080fd5b506102b86104ec3660046120f6565b610fde565b3480156104fd57600080fd5b506102b861050c366004611f5c565b61101f565b34801561051d57600080fd5b506102b8611058565b34801561053257600080fd5b5061024861054136600461213f565b611229565b34801561055257600080fd5b506102b861056136600461202c565b6112f7565b34801561057257600080fd5b5061021e610581366004611eed565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156105bb57600080fd5b5061026a6105ca366004611ed2565b600d6020526000908152604090205481565b3480156105e857600080fd5b506102b86105f7366004611ed2565b611474565b34801561060857600080fd5b5061029861061736600461213f565b61150c565b34801561062857600080fd5b5061026a610637366004611ed2565b600b6020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b148061067a57506001600160e01b03198216635b5e139f60e01b145b8061069557506001600160e01b0319821663780e9d6360e01b145b806106b057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546106c590612354565b80601f01602080910402602001604051908101604052809291908181526020018280546106f190612354565b801561073e5780601f106107135761010080835404028352916020019161073e565b820191906000526020600020905b81548152906001019060200180831161072157829003601f168201915b5050505050905090565b6000610755826000541190565b6107bc5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6007546001600160a01b031633146108025760405162461bcd60e51b81526004016107b39061225d565b604051600090339047908381818185875af1925050503d8060008114610844576040519150601f19603f3d011682016040523d82523d6000602084013e610849565b606091505b505090508061085757600080fd5b50565b600061086582610c6b565b9050806001600160a01b0316836001600160a01b031614156108d45760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016107b3565b336001600160a01b03821614806108f057506108f08133610581565b6109625760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016107b3565b61096d838383611536565b505050565b61096d838383611592565b600061098883610e06565b82106109e15760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016107b3565b600080549080805b83811015610a7a576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610a3c57805192505b876001600160a01b0316836001600160a01b03161415610a715786841415610a6a575093506106b092505050565b6001909301925b506001016109e9565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016107b3565b60098054610ae790612354565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1390612354565b8015610b605780601f10610b3557610100808354040283529160200191610b60565b820191906000526020600020905b815481529060010190602001808311610b4357829003601f168201915b505050505081565b61096d8383836040518060200160405280600081525061101f565b6007546001600160a01b03163314610bad5760405162461bcd60e51b81526004016107b39061225d565b60005461270f610bbd83836122e5565b1115610bdb5760405162461bcd60e51b81526004016107b39061221c565b610be58383611877565b61270f610bf283836122e5565b1061096d57600a805460ff19166001179055505050565b600080548210610c675760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016107b3565b5090565b6000610c7682611891565b5192915050565b60006001815b600c54811015610d92576000600c8281548110610ca257610ca26123ea565b6000918252602090912001546040516370a0823160e01b81526001600160a01b038781166004830152909116906370a082319060240160206040518083038186803b158015610cf057600080fd5b505afa158015610d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d289190612158565b90508015610d7f57600d6000600c8481548110610d4757610d476123ea565b60009182526020808320909101546001600160a01b0316835282019290925260400190205492508215610d7a5750610d92565b600192505b5080610d8a8161238f565b915050610c83565b506001600160a01b0383166000908152600b6020526040812054610db69083612311565b60005490915061270f610dc983836122e5565b1115610dfe576001821115610df9576001915061270f610de983836122e5565b1115610df457600091505b610dfe565b600091505b509392505050565b60006001600160a01b038216610e725760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016107b3565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b03163314610ec15760405162461bcd60e51b81526004016107b39061225d565b610ecb6000611968565b565b6007546001600160a01b03163314610ef75760405162461bcd60e51b81526004016107b39061225d565b600a805460ff1916911515919091179055565b6060600280546106c590612354565b6001600160a01b038216331415610f725760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016107b3565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146110085760405162461bcd60e51b81526004016107b39061225d565b805161101b906009906020840190611da0565b5050565b61102a848484611592565b611036848484846119ba565b6110525760405162461bcd60e51b81526004016107b390612292565b50505050565b600260085414156110ab5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107b3565b6002600855600054600a5460ff16156110fa5760405162461bcd60e51b815260206004820152601160248201527026b0b5b4b7339034b99031b637b9b2b21760791b60448201526064016107b3565b3332146111495760405162461bcd60e51b815260206004820152601a60248201527f436f6e74726163742063616c6c206e6f7420616c6c6f7765642e00000000000060448201526064016107b3565b600061115433610c7d565b9050600081116111a65760405162461bcd60e51b815260206004820181905260248201527f2055736572206d6178696d756d207175616e746974792065786365656465642e60448201526064016107b3565b61270f6111b382846122e5565b11156111d15760405162461bcd60e51b81526004016107b39061221c565b6111db3382611877565b336000908152600b6020526040812080548392906111fa9084906122e5565b9091555061270f905061120d82846122e5565b1061122057600a805460ff191660011790555b50506001600855565b6060611236826000541190565b61129a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107b3565b60006112a4611ac8565b90508051600014156112c557604051806020016040528060008152506112f0565b806112cf84611ad7565b6040516020016112e092919061219d565b6040516020818303038152906040525b9392505050565b6007546001600160a01b031633146113215760405162461bcd60e51b81526004016107b39061225d565b60005b8181101561096d57600d6000848484818110611342576113426123ea565b90506020020160208101906113579190611ed2565b6001600160a01b0316815260208101919091526040016000205461141a57600c838383818110611389576113896123ea565b905060200201602081019061139e9190611ed2565b81546001810183556000928352602083200180546001600160a01b0319166001600160a01b0392909216919091179055600290600d908585858181106113e6576113e66123ea565b90506020020160208101906113fb9190611ed2565b6001600160a01b03168152602081019190915260400160002055611462565b6002600d6000858585818110611432576114326123ea565b90506020020160208101906114479190611ed2565b6001600160a01b031681526020810191909152604001600020555b8061146c8161238f565b915050611324565b6007546001600160a01b0316331461149e5760405162461bcd60e51b81526004016107b39061225d565b6001600160a01b0381166115035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b3565b61085781611968565b600c818154811061151c57600080fd5b6000918252602090912001546001600160a01b0316905081565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061159d82611891565b80519091506000906001600160a01b0316336001600160a01b031614806115d45750336115c984610748565b6001600160a01b0316145b806115e6575081516115e69033610581565b9050806116505760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016107b3565b846001600160a01b031682600001516001600160a01b0316146116c45760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016107b3565b6001600160a01b0384166117285760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107b3565b6117386000848460000151611536565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff160217905590860180835291205490911661182d576117e0816000541190565b1561182d578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b61101b828260405180602001604052806000815250611bd5565b60408051808201909152600080825260208201526118b0826000541190565b61190f5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016107b3565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561195e579392505050565b5060001901611911565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b15611abc57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119fe9033908990889088906004016121cc565b602060405180830381600087803b158015611a1857600080fd5b505af1925050508015611a48575060408051601f3d908101601f19168201909252611a45918101906120d9565b60015b611aa2573d808015611a76576040519150601f19603f3d011682016040523d82523d6000602084013e611a7b565b606091505b508051611a9a5760405162461bcd60e51b81526004016107b390612292565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611ac0565b5060015b949350505050565b6060600980546106c590612354565b606081611afb5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611b255780611b0f8161238f565b9150611b1e9050600a836122fd565b9150611aff565b60008167ffffffffffffffff811115611b4057611b40612400565b6040519080825280601f01601f191660200182016040528015611b6a576020820181803683370190505b5090505b8415611ac057611b7f600183612311565b9150611b8c600a866123aa565b611b979060306122e5565b60f81b818381518110611bac57611bac6123ea565b60200101906001600160f81b031916908160001a905350611bce600a866122fd565b9450611b6e565b61096d83838360016000546001600160a01b038516611c405760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107b3565b83611c9e5760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b60648201526084016107b3565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b85811015611d975760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315611d8b57611d6f60008884886119ba565b611d8b5760405162461bcd60e51b81526004016107b390612292565b60019182019101611d1c565b50600055611870565b828054611dac90612354565b90600052602060002090601f016020900481019282611dce5760008555611e14565b82601f10611de757805160ff1916838001178555611e14565b82800160010185558215611e14579182015b82811115611e14578251825591602001919060010190611df9565b50610c679291505b80821115610c675760008155600101611e1c565b600067ffffffffffffffff80841115611e4b57611e4b612400565b604051601f8501601f19908116603f01168101908282118183101715611e7357611e73612400565b81604052809350858152868686011115611e8c57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611ebd57600080fd5b919050565b80358015158114611ebd57600080fd5b600060208284031215611ee457600080fd5b6112f082611ea6565b60008060408385031215611f0057600080fd5b611f0983611ea6565b9150611f1760208401611ea6565b90509250929050565b600080600060608486031215611f3557600080fd5b611f3e84611ea6565b9250611f4c60208501611ea6565b9150604084013590509250925092565b60008060008060808587031215611f7257600080fd5b611f7b85611ea6565b9350611f8960208601611ea6565b925060408501359150606085013567ffffffffffffffff811115611fac57600080fd5b8501601f81018713611fbd57600080fd5b611fcc87823560208401611e30565b91505092959194509250565b60008060408385031215611feb57600080fd5b611ff483611ea6565b9150611f1760208401611ec2565b6000806040838503121561201557600080fd5b61201e83611ea6565b946020939093013593505050565b6000806020838503121561203f57600080fd5b823567ffffffffffffffff8082111561205757600080fd5b818501915085601f83011261206b57600080fd5b81358181111561207a57600080fd5b8660208260051b850101111561208f57600080fd5b60209290920196919550909350505050565b6000602082840312156120b357600080fd5b6112f082611ec2565b6000602082840312156120ce57600080fd5b81356112f081612416565b6000602082840312156120eb57600080fd5b81516112f081612416565b60006020828403121561210857600080fd5b813567ffffffffffffffff81111561211f57600080fd5b8201601f8101841361213057600080fd5b611ac084823560208401611e30565b60006020828403121561215157600080fd5b5035919050565b60006020828403121561216a57600080fd5b5051919050565b60008151808452612189816020860160208601612328565b601f01601f19169290920160200192915050565b600083516121af818460208801612328565b8351908301906121c3818360208801612328565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121ff90830184612171565b9695505050505050565b6020815260006112f06020830184612171565b60208082526021908201527f457863656564696e6720746865206d6178696d756d2063697263756c6174696f6040820152603760f91b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b600082198211156122f8576122f86123be565b500190565b60008261230c5761230c6123d4565b500490565b600082821015612323576123236123be565b500390565b60005b8381101561234357818101518382015260200161232b565b838111156110525750506000910152565b600181811c9082168061236857607f821691505b6020821081141561238957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156123a3576123a36123be565b5060010190565b6000826123b9576123b96123d4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461085757600080fdfea264697066735822122026d70ff68b3aadf2a8a979b297100f73ed54899384e12dae96aa1aead6cc1b0b64736f6c63430008070033

Deployed Bytecode Sourcemap

58028:3627:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42185:372;;;;;;;;;;-1:-1:-1;42185:372:0;;;;;:::i;:::-;;:::i;:::-;;;6922:14:1;;6915:22;6897:41;;6885:2;6870:18;42185:372:0;;;;;;;;44071:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;58291:47::-;;;;;;;;;;;;58337:1;58291:47;;;;;16849:25:1;;;16837:2;16822:18;58291:47:0;16703:177:1;45633:214:0;;;;;;;;;;-1:-1:-1;45633:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6220:32:1;;;6202:51;;6190:2;6175:18;45633:214:0;6056:203:1;59877:160:0;;;:::i;:::-;;45154:413;;;;;;;;;;-1:-1:-1;45154:413:0;;;;;:::i;:::-;;:::i;40442:100::-;;;;;;;;;;-1:-1:-1;40495:7:0;40522:12;40442:100;;46509:162;;;;;;;;;;-1:-1:-1;46509:162:0;;;;;:::i;:::-;;:::i;41106:1007::-;;;;;;;;;;-1:-1:-1;41106:1007:0;;;;;:::i;:::-;;:::i;58130:24::-;;;;;;;;;;;;;:::i;46742:177::-;;;;;;;;;;-1:-1:-1;46742:177:0;;;;;:::i;:::-;;:::i;59320:339::-;;;;;;;;;;-1:-1:-1;59320:339:0;;;;;:::i;:::-;;:::i;58238:45::-;;;;;;;;;;;;58282:1;58238:45;;40619:187;;;;;;;;;;-1:-1:-1;40619:187:0;;;;;:::i;:::-;;:::i;43880:124::-;;;;;;;;;;-1:-1:-1;43880:124:0;;;;;:::i;:::-;;:::i;60047:1097::-;;;;;;;;;;-1:-1:-1;60047:1097:0;;;;;:::i;:::-;;:::i;42621:221::-;;;;;;;;;;-1:-1:-1;42621:221:0;;;;;:::i;:::-;;:::i;15772:94::-;;;;;;;;;;;;;:::i;59667:87::-;;;;;;;;;;-1:-1:-1;59667:87:0;;;;;:::i;:::-;;:::i;15121:::-;;;;;;;;;;-1:-1:-1;15194:6:0;;-1:-1:-1;;;;;15194:6:0;15121:87;;58194:37;;;;;;;;;;;;58227:4;58194:37;;44240:104;;;;;;;;;;;;;:::i;58161:26::-;;;;;;;;;;-1:-1:-1;58161:26:0;;;;;;;;45919:288;;;;;;;;;;-1:-1:-1;45919:288:0;;;;;:::i;:::-;;:::i;59764:105::-;;;;;;;;;;-1:-1:-1;59764:105:0;;;;;:::i;:::-;;:::i;46990:355::-;;;;;;;;;;-1:-1:-1;46990:355:0;;;;;:::i;:::-;;:::i;58684:630::-;;;;;;;;;;;;;:::i;44415:335::-;;;;;;;;;;-1:-1:-1;44415:335:0;;;;;:::i;:::-;;:::i;61152:500::-;;;;;;;;;;-1:-1:-1;61152:500:0;;;;;:::i;:::-;;:::i;46278:164::-;;;;;;;;;;-1:-1:-1;46278:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;46399:25:0;;;46375:4;46399:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;46278:164;58444:55;;;;;;;;;;-1:-1:-1;58444:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;16021:192;;;;;;;;;;-1:-1:-1;16021:192:0;;;;;:::i;:::-;;:::i;58403:34::-;;;;;;;;;;-1:-1:-1;58403:34:0;;;;;:::i;:::-;;:::i;58348:48::-;;;;;;;;;;-1:-1:-1;58348:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;42185:372;42287:4;-1:-1:-1;;;;;;42324:40:0;;-1:-1:-1;;;42324:40:0;;:105;;-1:-1:-1;;;;;;;42381:48:0;;-1:-1:-1;;;42381:48:0;42324:105;:172;;;-1:-1:-1;;;;;;;42446:50:0;;-1:-1:-1;;;42446:50:0;42324:172;:225;;;-1:-1:-1;;;;;;;;;;32682:40:0;;;42513:36;42304:245;42185:372;-1:-1:-1;;42185:372:0:o;44071:100::-;44125:13;44158:5;44151:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44071:100;:::o;45633:214::-;45701:7;45729:16;45737:7;47657:4;47691:12;-1:-1:-1;47681:22:0;47600:111;45729:16;45721:74;;;;-1:-1:-1;;;45721:74:0;;15784:2:1;45721:74:0;;;15766:21:1;15823:2;15803:18;;;15796:30;15862:34;15842:18;;;15835:62;-1:-1:-1;;;15913:18:1;;;15906:43;15966:19;;45721:74:0;;;;;;;;;-1:-1:-1;45815:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45815:24:0;;45633:214::o;59877:160::-;15194:6;;-1:-1:-1;;;;;15194:6:0;14022:10;15341:23;15333:68;;;;-1:-1:-1;;;15333:68:0;;;;;;;:::i;:::-;59953:58:::1;::::0;59935:12:::1;::::0;59961:10:::1;::::0;59985:21:::1;::::0;59935:12;59953:58;59935:12;59953:58;59985:21;59961:10;59953:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59934:77;;;60024:7;60016:16;;;::::0;::::1;;59930:107;59877:160::o:0;45154:413::-;45227:13;45243:24;45259:7;45243:15;:24::i;:::-;45227:40;;45292:5;-1:-1:-1;;;;;45286:11:0;:2;-1:-1:-1;;;;;45286:11:0;;;45278:58;;;;-1:-1:-1;;;45278:58:0;;12959:2:1;45278:58:0;;;12941:21:1;12998:2;12978:18;;;12971:30;13037:34;13017:18;;;13010:62;-1:-1:-1;;;13088:18:1;;;13081:32;13130:19;;45278:58:0;12757:398:1;45278:58:0;14022:10;-1:-1:-1;;;;;45371:21:0;;;;:62;;-1:-1:-1;45396:37:0;45413:5;14022:10;46278:164;:::i;45396:37::-;45349:169;;;;-1:-1:-1;;;45349:169:0;;10163:2:1;45349:169:0;;;10145:21:1;10202:2;10182:18;;;10175:30;10241:34;10221:18;;;10214:62;10312:27;10292:18;;;10285:55;10357:19;;45349:169:0;9961:421:1;45349:169:0;45531:28;45540:2;45544:7;45553:5;45531:8;:28::i;:::-;45216:351;45154:413;;:::o;46509:162::-;46635:28;46645:4;46651:2;46655:7;46635:9;:28::i;41106:1007::-;41195:7;41231:16;41241:5;41231:9;:16::i;:::-;41223:5;:24;41215:71;;;;-1:-1:-1;;;41215:71:0;;7375:2:1;41215:71:0;;;7357:21:1;7414:2;7394:18;;;7387:30;7453:34;7433:18;;;7426:62;-1:-1:-1;;;7504:18:1;;;7497:32;7546:19;;41215:71:0;7173:398:1;41215:71:0;41297:22;40522:12;;;41297:22;;41560:466;41580:14;41576:1;:18;41560:466;;;41620:31;41654:14;;;:11;:14;;;;;;;;;41620:48;;;;;;;;;-1:-1:-1;;;;;41620:48:0;;;;;-1:-1:-1;;;41620:48:0;;;;;;;;;;;;41691:28;41687:111;;41764:14;;;-1:-1:-1;41687:111:0;41841:5;-1:-1:-1;;;;;41820:26:0;:17;-1:-1:-1;;;;;41820:26:0;;41816:195;;;41890:5;41875:11;:20;41871:85;;;-1:-1:-1;41931:1:0;-1:-1:-1;41924:8:0;;-1:-1:-1;;;41924:8:0;41871:85;41978:13;;;;;41816:195;-1:-1:-1;41596:3:0;;41560:466;;;-1:-1:-1;42049:56:0;;-1:-1:-1;;;42049:56:0;;14593:2:1;42049:56:0;;;14575:21:1;14632:2;14612:18;;;14605:30;14671:34;14651:18;;;14644:62;-1:-1:-1;;;14722:18:1;;;14715:44;14776:19;;42049:56:0;14391:410:1;58130:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46742:177::-;46872:39;46889:4;46895:2;46899:7;46872:39;;;;;;;;;;;;:16;:39::i;59320:339::-;15194:6;;-1:-1:-1;;;;;15194:6:0;14022:10;15341:23;15333:68;;;;-1:-1:-1;;;15333:68:0;;;;;;;:::i;:::-;59401:19:::1;40522:12:::0;58227:4:::1;59452:21;59466:7:::0;40522:12;59452:21:::1;:::i;:::-;:31;;59444:76;;;;-1:-1:-1::0;;;59444:76:0::1;;;;;;;:::i;:::-;59531:25;59541:5;59548:7;59531:9;:25::i;:::-;58227:4;59580:21;59594:7:::0;59580:11;:21:::1;:::i;:::-;:31;59577:75;;59627:6;:13:::0;;-1:-1:-1;;59627:13:0::1;59636:4;59627:13;::::0;;59391:268:::1;59320:339:::0;;:::o;40619:187::-;40686:7;40522:12;;40714:5;:21;40706:69;;;;-1:-1:-1;;;40706:69:0;;8951:2:1;40706:69:0;;;8933:21:1;8990:2;8970:18;;;8963:30;9029:34;9009:18;;;9002:62;-1:-1:-1;;;9080:18:1;;;9073:33;9123:19;;40706:69:0;8749:399:1;40706:69:0;-1:-1:-1;40793:5:0;40619:187::o;43880:124::-;43944:7;43971:20;43983:7;43971:11;:20::i;:::-;:25;;43880:124;-1:-1:-1;;43880:124:0:o;60047:1097::-;60113:7;58282:1;60113:7;60179:436;60203:17;:24;60199:28;;60179:436;;;60250:14;60275:17;60293:1;60275:20;;;;;;;;:::i;:::-;;;;;;;;;;;60267:45;;-1:-1:-1;;;60267:45:0;;-1:-1:-1;;;;;6220:32:1;;;60267:45:0;;;6202:51:1;60275:20:0;;;;60267:39;;6175:18:1;;60267:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60250:62;-1:-1:-1;60331:10:0;;60328:275;;60371:20;:42;60392:17;60410:1;60392:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;60392:20:0;60371:42;;;;;;;;;;;;;;-1:-1:-1;60435:11:0;;60432:137;;60470:5;;;60432:137;58282:1;60522:27;;60432:137;-1:-1:-1;60229:3:0;;;;:::i;:::-;;;;60179:436;;;-1:-1:-1;;;;;;60654:19:0;;60626:15;60654:19;;;:13;:19;;;;;;60644:29;;:7;:29;:::i;:::-;60750:19;40522:12;60626:47;;-1:-1:-1;58227:4:0;60800:21;60626:47;40522:12;60800:21;:::i;:::-;:30;60797:315;;;58282:1;60850:7;:27;60847:251;;;58282:1;;-1:-1:-1;58227:4:0;60946:21;58282:1;60946:11;:21;:::i;:::-;:30;60943:88;;;61010:1;61000:11;;60943:88;60847:251;;;61080:1;61070:11;;60847:251;-1:-1:-1;61129:7:0;60047:1097;-1:-1:-1;;;60047:1097:0:o;42621:221::-;42685:7;-1:-1:-1;;;;;42713:19:0;;42705:75;;;;-1:-1:-1;;;42705:75:0;;10589:2:1;42705:75:0;;;10571:21:1;10628:2;10608:18;;;10601:30;10667:34;10647:18;;;10640:62;-1:-1:-1;;;10718:18:1;;;10711:41;10769:19;;42705:75:0;10387:407:1;42705:75:0;-1:-1:-1;;;;;;42806:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;42806:27:0;;42621:221::o;15772:94::-;15194:6;;-1:-1:-1;;;;;15194:6:0;14022:10;15341:23;15333:68;;;;-1:-1:-1;;;15333:68:0;;;;;;;:::i;:::-;15837:21:::1;15855:1;15837:9;:21::i;:::-;15772:94::o:0;59667:87::-;15194:6;;-1:-1:-1;;;;;15194:6:0;14022:10;15341:23;15333:68;;;;-1:-1:-1;;;15333:68:0;;;;;;;:::i;:::-;59733:6:::1;:13:::0;;-1:-1:-1;;59733:13:0::1;::::0;::::1;;::::0;;;::::1;::::0;;59667:87::o;44240:104::-;44296:13;44329:7;44322:14;;;;;:::i;45919:288::-;-1:-1:-1;;;;;46014:24:0;;14022:10;46014:24;;46006:63;;;;-1:-1:-1;;;46006:63:0;;12185:2:1;46006:63:0;;;12167:21:1;12224:2;12204:18;;;12197:30;12263:28;12243:18;;;12236:56;12309:18;;46006:63:0;11983:350:1;46006:63:0;14022:10;46082:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;46082:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;46082:53:0;;;;;;;;;;46151:48;;6897:41:1;;;46082:42:0;;14022:10;46151:48;;6870:18:1;46151:48:0;;;;;;;45919:288;;:::o;59764:105::-;15194:6;;-1:-1:-1;;;;;15194:6:0;14022:10;15341:23;15333:68;;;;-1:-1:-1;;;15333:68:0;;;;;;;:::i;:::-;59843:18;;::::1;::::0;:10:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;59764:105:::0;:::o;46990:355::-;47149:28;47159:4;47165:2;47169:7;47149:9;:28::i;:::-;47210:48;47233:4;47239:2;47243:7;47252:5;47210:22;:48::i;:::-;47188:149;;;;-1:-1:-1;;;47188:149:0;;;;;;;:::i;:::-;46990:355;;;;:::o;58684:630::-;57054:1;57652:7;;:19;;57644:63;;;;-1:-1:-1;;;57644:63:0;;15008:2:1;57644:63:0;;;14990:21:1;15047:2;15027:18;;;15020:30;15086:33;15066:18;;;15059:61;15137:18;;57644:63:0;14806:355:1;57644:63:0;57054:1;57785:7;:18;58736:19:::1;40522:12:::0;58791:6:::1;::::0;::::1;;58790:7;58782:36;;;::::0;-1:-1:-1;;;58782:36:0;;16198:2:1;58782:36:0::1;::::0;::::1;16180:21:1::0;16237:2;16217:18;;;16210:30;-1:-1:-1;;;16256:18:1;;;16249:47;16313:18;;58782:36:0::1;15996:341:1::0;58782:36:0::1;58837:10;58851:9;58837:23;58829:61;;;::::0;-1:-1:-1;;;58829:61:0;;7778:2:1;58829:61:0::1;::::0;::::1;7760:21:1::0;7817:2;7797:18;;;7790:30;7856:28;7836:18;;;7829:56;7902:18;;58829:61:0::1;7576:350:1::0;58829:61:0::1;58901:19;58923:34;58946:10;58923:22;:34::i;:::-;58901:56;;58988:1;58976:11;:13;58968:57;;;::::0;-1:-1:-1;;;58968:57:0;;16544:2:1;58968:57:0::1;::::0;::::1;16526:21:1::0;;;16563:18;;;16556:30;16622:34;16602:18;;;16595:62;16674:18;;58968:57:0::1;16342:356:1::0;58968:57:0::1;58227:4;59046:25;59060:11:::0;59046;:25:::1;:::i;:::-;:35;;59038:80;;;;-1:-1:-1::0;;;59038:80:0::1;;;;;;;:::i;:::-;59132:34;59142:10;59154:11;59132:9;:34::i;:::-;59191:10;59177:25;::::0;;;:13:::1;:25;::::0;;;;:40;;59206:11;;59177:25;:40:::1;::::0;59206:11;;59177:40:::1;:::i;:::-;::::0;;;-1:-1:-1;58227:4:0::1;::::0;-1:-1:-1;59231:25:0::1;59245:11:::0;59231;:25:::1;:::i;:::-;:35;59228:79;;59282:6;:13:::0;;-1:-1:-1;;59282:13:0::1;59291:4;59282:13;::::0;;59228:79:::1;-1:-1:-1::0;;57010:1:0;57964:7;:22;58684:630::o;44415:335::-;44488:13;44522:16;44530:7;47657:4;47691:12;-1:-1:-1;47681:22:0;47600:111;44522:16;44514:76;;;;-1:-1:-1;;;44514:76:0;;11769:2:1;44514:76:0;;;11751:21:1;11808:2;11788:18;;;11781:30;11847:34;11827:18;;;11820:62;-1:-1:-1;;;11898:18:1;;;11891:45;11953:19;;44514:76:0;11567:411:1;44514:76:0;44603:21;44627:10;:8;:10::i;:::-;44603:34;;44661:7;44655:21;44680:1;44655:26;;:87;;;;;;;;;;;;;;;;;44708:7;44717:18;:7;:16;:18::i;:::-;44691:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44655:87;44648:94;44415:335;-1:-1:-1;;;44415:335:0:o;61152:500::-;15194:6;;-1:-1:-1;;;;;15194:6:0;14022:10;15341:23;15333:68;;;;-1:-1:-1;;;15333:68:0;;;;;;;:::i;:::-;61248:9:::1;61243:402;61263:29:::0;;::::1;61243:402;;;61317:20;:43;61338:18;;61357:1;61338:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;61317:43:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;61317:43:0;;61314:320:::1;;61385:17;61408:18;;61427:1;61408:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;61385:45:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;61385:45:0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;61385:45:0::1;-1:-1:-1::0;;;;;61385:45:0;;;::::1;::::0;;;::::1;::::0;;58337:1:::1;::::0;61449:20:::1;::::0;61470:18;;61489:1;61470:21;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;61449:43:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;61449:43:0;:65;61314:320:::1;;;58337:1;61553:20;:43;61574:18;;61593:1;61574:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;61553:43:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;61553:43:0;:65;61314:320:::1;61294:3:::0;::::1;::::0;::::1;:::i;:::-;;;;61243:402;;16021:192:::0;15194:6;;-1:-1:-1;;;;;15194:6:0;14022:10;15341:23;15333:68;;;;-1:-1:-1;;;15333:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16110:22:0;::::1;16102:73;;;::::0;-1:-1:-1;;;16102:73:0;;8133:2:1;16102:73:0::1;::::0;::::1;8115:21:1::0;8172:2;8152:18;;;8145:30;8211:34;8191:18;;;8184:62;-1:-1:-1;;;8262:18:1;;;8255:36;8308:19;;16102:73:0::1;7931:402:1::0;16102:73:0::1;16186:19;16196:8;16186:9;:19::i;58403:34::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58403:34:0;;-1:-1:-1;58403:34:0;:::o;52520:196::-;52635:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;52635:29:0;-1:-1:-1;;;;;52635:29:0;;;;;;;;;52680:28;;52635:24;;52680:28;;;;;;;52520:196;;;:::o;50400:2002::-;50515:35;50553:20;50565:7;50553:11;:20::i;:::-;50628:18;;50515:58;;-1:-1:-1;50586:22:0;;-1:-1:-1;;;;;50612:34:0;14022:10;-1:-1:-1;;;;;50612:34:0;;:87;;;-1:-1:-1;14022:10:0;50663:20;50675:7;50663:11;:20::i;:::-;-1:-1:-1;;;;;50663:36:0;;50612:87;:154;;;-1:-1:-1;50733:18:0;;50716:50;;14022:10;46278:164;:::i;50716:50::-;50586:181;;50788:17;50780:80;;;;-1:-1:-1;;;50780:80:0;;12540:2:1;50780:80:0;;;12522:21:1;12579:2;12559:18;;;12552:30;12618:34;12598:18;;;12591:62;-1:-1:-1;;;12669:18:1;;;12662:48;12727:19;;50780:80:0;12338:414:1;50780:80:0;50903:4;-1:-1:-1;;;;;50881:26:0;:13;:18;;;-1:-1:-1;;;;;50881:26:0;;50873:77;;;;-1:-1:-1;;;50873:77:0;;11001:2:1;50873:77:0;;;10983:21:1;11040:2;11020:18;;;11013:30;11079:34;11059:18;;;11052:62;-1:-1:-1;;;11130:18:1;;;11123:36;11176:19;;50873:77:0;10799:402:1;50873:77:0;-1:-1:-1;;;;;50969:16:0;;50961:66;;;;-1:-1:-1;;;50961:66:0;;9355:2:1;50961:66:0;;;9337:21:1;9394:2;9374:18;;;9367:30;9433:34;9413:18;;;9406:62;-1:-1:-1;;;9484:18:1;;;9477:35;9529:19;;50961:66:0;9153:401:1;50961:66:0;51148:49;51165:1;51169:7;51178:13;:18;;;51148:8;:49::i;:::-;-1:-1:-1;;;;;51493:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;51493:31:0;;;-1:-1:-1;;;;;51493:31:0;;;-1:-1:-1;;51493:31:0;;;;;;;51539:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;51539:29:0;;;;;;;;;;;;;51585:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;51630:61:0;;;;-1:-1:-1;;;51675:15:0;51630:61;;;;;;51965:11;;;51995:24;;;;;:29;51965:11;;51995:29;51991:295;;52063:20;52071:11;47657:4;47691:12;-1:-1:-1;47681:22:0;47600:111;52063:20;52059:212;;;52140:18;;;52108:24;;;:11;:24;;;;;;;;:50;;52223:28;;;;52181:70;;-1:-1:-1;;;52181:70:0;-1:-1:-1;;;;;;52181:70:0;;;-1:-1:-1;;;;;52108:50:0;;;52181:70;;;;;;;52059:212;51468:829;52333:7;52329:2;-1:-1:-1;;;;;52314:27:0;52323:4;-1:-1:-1;;;;;52314:27:0;;;;;;;;;;;52352:42;50504:1898;;50400:2002;;;:::o;47719:104::-;47788:27;47798:2;47802:8;47788:27;;;;;;;;;;;;:9;:27::i;43281:537::-;-1:-1:-1;;;;;;;;;;;;;;;;;43384:16:0;43392:7;47657:4;47691:12;-1:-1:-1;47681:22:0;47600:111;43384:16;43376:71;;;;-1:-1:-1;;;43376:71:0;;8540:2:1;43376:71:0;;;8522:21:1;8579:2;8559:18;;;8552:30;8618:34;8598:18;;;8591:62;-1:-1:-1;;;8669:18:1;;;8662:40;8719:19;;43376:71:0;8338:406:1;43376:71:0;43505:7;43485:245;43552:31;43586:17;;;:11;:17;;;;;;;;;43552:51;;;;;;;;;-1:-1:-1;;;;;43552:51:0;;;;;-1:-1:-1;;;43552:51:0;;;;;;;;;;;;43626:28;43622:93;;43686:9;43281:537;-1:-1:-1;;;43281:537:0:o;43622:93::-;-1:-1:-1;;;43525:6:0;43485:245;;16221:173;16296:6;;;-1:-1:-1;;;;;16313:17:0;;;-1:-1:-1;;;;;;16313:17:0;;;;;;;16346:40;;16296:6;;;16313:17;16296:6;;16346:40;;16277:16;;16346:40;16266:128;16221:173;:::o;53281:804::-;53436:4;-1:-1:-1;;;;;53457:13:0;;17458:20;17506:8;53453:625;;53493:72;;-1:-1:-1;;;53493:72:0;;-1:-1:-1;;;;;53493:36:0;;;;;:72;;14022:10;;53544:4;;53550:7;;53559:5;;53493:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53493:72:0;;;;;;;;-1:-1:-1;;53493:72:0;;;;;;;;;;;;:::i;:::-;;;53489:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53739:13:0;;53735:273;;53782:61;;-1:-1:-1;;;53782:61:0;;;;;;;:::i;53735:273::-;53958:6;53952:13;53943:6;53939:2;53935:15;53928:38;53489:534;-1:-1:-1;;;;;;53616:55:0;-1:-1:-1;;;53616:55:0;;-1:-1:-1;53609:62:0;;53453:625;-1:-1:-1;54062:4:0;53453:625;53281:804;;;;;;:::o;58567:111::-;58627:13;58660:10;58653:17;;;;;:::i;2116:723::-;2172:13;2393:10;2389:53;;-1:-1:-1;;2420:10:0;;;;;;;;;;;;-1:-1:-1;;;2420:10:0;;;;;2116:723::o;2389:53::-;2467:5;2452:12;2508:78;2515:9;;2508:78;;2541:8;;;;:::i;:::-;;-1:-1:-1;2564:10:0;;-1:-1:-1;2572:2:0;2564:10;;:::i;:::-;;;2508:78;;;2596:19;2628:6;2618:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2618:17:0;;2596:39;;2646:154;2653:10;;2646:154;;2680:11;2690:1;2680:11;;:::i;:::-;;-1:-1:-1;2749:10:0;2757:2;2749:5;:10;:::i;:::-;2736:24;;:2;:24;:::i;:::-;2723:39;;2706:6;2713;2706:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2706:56:0;;;;;;;;-1:-1:-1;2777:11:0;2786:2;2777:11;;:::i;:::-;;;2646:154;;48186:163;48309:32;48315:2;48319:8;48329:5;48336:4;48747:20;48770:12;-1:-1:-1;;;;;48801:16:0;;48793:62;;;;-1:-1:-1;;;48793:62:0;;13782:2:1;48793:62:0;;;13764:21:1;13821:2;13801:18;;;13794:30;13860:34;13840:18;;;13833:62;-1:-1:-1;;;13911:18:1;;;13904:31;13952:19;;48793:62:0;13580:397:1;48793:62:0;48874:13;48866:66;;;;-1:-1:-1;;;48866:66:0;;14184:2:1;48866:66:0;;;14166:21:1;14223:2;14203:18;;;14196:30;14262:34;14242:18;;;14235:62;-1:-1:-1;;;14313:18:1;;;14306:38;14361:19;;48866:66:0;13982:404:1;48866:66:0;-1:-1:-1;;;;;49284:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;49284:45:0;;-1:-1:-1;;;;;49284:45:0;;;;;;;;;;49344:50;;;;;;;;;;;;;;49411:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;49461:66:0;;;;-1:-1:-1;;;49511:15:0;49461:66;;;;;;;49411:25;;49596:415;49616:8;49612:1;:12;49596:415;;;49655:38;;49680:12;;-1:-1:-1;;;;;49655:38:0;;;49672:1;;49655:38;;49672:1;;49655:38;49716:4;49712:249;;;49779:59;49810:1;49814:2;49818:12;49832:5;49779:22;:59::i;:::-;49745:196;;;;-1:-1:-1;;;49745:196:0;;;;;;;:::i;:::-;49981:14;;;;;49626:3;49596:415;;;-1:-1:-1;50027:12:0;:27;50078:60;46990:355;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:186;1052:6;1105:2;1093:9;1084:7;1080:23;1076:32;1073:52;;;1121:1;1118;1111:12;1073:52;1144:29;1163:9;1144:29;:::i;1184:260::-;1252:6;1260;1313:2;1301:9;1292:7;1288:23;1284:32;1281:52;;;1329:1;1326;1319:12;1281:52;1352:29;1371:9;1352:29;:::i;:::-;1342:39;;1400:38;1434:2;1423:9;1419:18;1400:38;:::i;:::-;1390:48;;1184:260;;;;;:::o;1449:328::-;1526:6;1534;1542;1595:2;1583:9;1574:7;1570:23;1566:32;1563:52;;;1611:1;1608;1601:12;1563:52;1634:29;1653:9;1634:29;:::i;:::-;1624:39;;1682:38;1716:2;1705:9;1701:18;1682:38;:::i;:::-;1672:48;;1767:2;1756:9;1752:18;1739:32;1729:42;;1449:328;;;;;:::o;1782:666::-;1877:6;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;1994:29;2013:9;1994:29;:::i;:::-;1984:39;;2042:38;2076:2;2065:9;2061:18;2042:38;:::i;:::-;2032:48;;2127:2;2116:9;2112:18;2099:32;2089:42;;2182:2;2171:9;2167:18;2154:32;2209:18;2201:6;2198:30;2195:50;;;2241:1;2238;2231:12;2195:50;2264:22;;2317:4;2309:13;;2305:27;-1:-1:-1;2295:55:1;;2346:1;2343;2336:12;2295:55;2369:73;2434:7;2429:2;2416:16;2411:2;2407;2403:11;2369:73;:::i;:::-;2359:83;;;1782:666;;;;;;;:::o;2453:254::-;2518:6;2526;2579:2;2567:9;2558:7;2554:23;2550:32;2547:52;;;2595:1;2592;2585:12;2547:52;2618:29;2637:9;2618:29;:::i;:::-;2608:39;;2666:35;2697:2;2686:9;2682:18;2666:35;:::i;2712:254::-;2780:6;2788;2841:2;2829:9;2820:7;2816:23;2812:32;2809:52;;;2857:1;2854;2847:12;2809:52;2880:29;2899:9;2880:29;:::i;:::-;2870:39;2956:2;2941:18;;;;2928:32;;-1:-1:-1;;;2712:254:1:o;2971:615::-;3057:6;3065;3118:2;3106:9;3097:7;3093:23;3089:32;3086:52;;;3134:1;3131;3124:12;3086:52;3174:9;3161:23;3203:18;3244:2;3236:6;3233:14;3230:34;;;3260:1;3257;3250:12;3230:34;3298:6;3287:9;3283:22;3273:32;;3343:7;3336:4;3332:2;3328:13;3324:27;3314:55;;3365:1;3362;3355:12;3314:55;3405:2;3392:16;3431:2;3423:6;3420:14;3417:34;;;3447:1;3444;3437:12;3417:34;3500:7;3495:2;3485:6;3482:1;3478:14;3474:2;3470:23;3466:32;3463:45;3460:65;;;3521:1;3518;3511:12;3460:65;3552:2;3544:11;;;;;3574:6;;-1:-1:-1;2971:615:1;;-1:-1:-1;;;;2971:615:1:o;3591:180::-;3647:6;3700:2;3688:9;3679:7;3675:23;3671:32;3668:52;;;3716:1;3713;3706:12;3668:52;3739:26;3755:9;3739:26;:::i;3776:245::-;3834:6;3887:2;3875:9;3866:7;3862:23;3858:32;3855:52;;;3903:1;3900;3893:12;3855:52;3942:9;3929:23;3961:30;3985:5;3961:30;:::i;4026:249::-;4095:6;4148:2;4136:9;4127:7;4123:23;4119:32;4116:52;;;4164:1;4161;4154:12;4116:52;4196:9;4190:16;4215:30;4239:5;4215:30;:::i;4280:450::-;4349:6;4402:2;4390:9;4381:7;4377:23;4373:32;4370:52;;;4418:1;4415;4408:12;4370:52;4458:9;4445:23;4491:18;4483:6;4480:30;4477:50;;;4523:1;4520;4513:12;4477:50;4546:22;;4599:4;4591:13;;4587:27;-1:-1:-1;4577:55:1;;4628:1;4625;4618:12;4577:55;4651:73;4716:7;4711:2;4698:16;4693:2;4689;4685:11;4651:73;:::i;4735:180::-;4794:6;4847:2;4835:9;4826:7;4822:23;4818:32;4815:52;;;4863:1;4860;4853:12;4815:52;-1:-1:-1;4886:23:1;;4735:180;-1:-1:-1;4735:180:1:o;4920:184::-;4990:6;5043:2;5031:9;5022:7;5018:23;5014:32;5011:52;;;5059:1;5056;5049:12;5011:52;-1:-1:-1;5082:16:1;;4920:184;-1:-1:-1;4920:184:1:o;5109:257::-;5150:3;5188:5;5182:12;5215:6;5210:3;5203:19;5231:63;5287:6;5280:4;5275:3;5271:14;5264:4;5257:5;5253:16;5231:63;:::i;:::-;5348:2;5327:15;-1:-1:-1;;5323:29:1;5314:39;;;;5355:4;5310:50;;5109:257;-1:-1:-1;;5109:257:1:o;5371:470::-;5550:3;5588:6;5582:13;5604:53;5650:6;5645:3;5638:4;5630:6;5626:17;5604:53;:::i;:::-;5720:13;;5679:16;;;;5742:57;5720:13;5679:16;5776:4;5764:17;;5742:57;:::i;:::-;5815:20;;5371:470;-1:-1:-1;;;;5371:470:1:o;6264:488::-;-1:-1:-1;;;;;6533:15:1;;;6515:34;;6585:15;;6580:2;6565:18;;6558:43;6632:2;6617:18;;6610:34;;;6680:3;6675:2;6660:18;;6653:31;;;6458:4;;6701:45;;6726:19;;6718:6;6701:45;:::i;:::-;6693:53;6264:488;-1:-1:-1;;;;;;6264:488:1:o;6949:219::-;7098:2;7087:9;7080:21;7061:4;7118:44;7158:2;7147:9;7143:18;7135:6;7118:44;:::i;9559:397::-;9761:2;9743:21;;;9800:2;9780:18;;;9773:30;9839:34;9834:2;9819:18;;9812:62;-1:-1:-1;;;9905:2:1;9890:18;;9883:31;9946:3;9931:19;;9559:397::o;11206:356::-;11408:2;11390:21;;;11427:18;;;11420:30;11486:34;11481:2;11466:18;;11459:62;11553:2;11538:18;;11206:356::o;13160:415::-;13362:2;13344:21;;;13401:2;13381:18;;;13374:30;13440:34;13435:2;13420:18;;13413:62;-1:-1:-1;;;13506:2:1;13491:18;;13484:49;13565:3;13550:19;;13160:415::o;16885:128::-;16925:3;16956:1;16952:6;16949:1;16946:13;16943:39;;;16962:18;;:::i;:::-;-1:-1:-1;16998:9:1;;16885:128::o;17018:120::-;17058:1;17084;17074:35;;17089:18;;:::i;:::-;-1:-1:-1;17123:9:1;;17018:120::o;17143:125::-;17183:4;17211:1;17208;17205:8;17202:34;;;17216:18;;:::i;:::-;-1:-1:-1;17253:9:1;;17143:125::o;17273:258::-;17345:1;17355:113;17369:6;17366:1;17363:13;17355:113;;;17445:11;;;17439:18;17426:11;;;17419:39;17391:2;17384:10;17355:113;;;17486:6;17483:1;17480:13;17477:48;;;-1:-1:-1;;17521:1:1;17503:16;;17496:27;17273:258::o;17536:380::-;17615:1;17611:12;;;;17658;;;17679:61;;17733:4;17725:6;17721:17;17711:27;;17679:61;17786:2;17778:6;17775:14;17755:18;17752:38;17749:161;;;17832:10;17827:3;17823:20;17820:1;17813:31;17867:4;17864:1;17857:15;17895:4;17892:1;17885:15;17749:161;;17536:380;;;:::o;17921:135::-;17960:3;-1:-1:-1;;17981:17:1;;17978:43;;;18001:18;;:::i;:::-;-1:-1:-1;18048:1:1;18037:13;;17921:135::o;18061:112::-;18093:1;18119;18109:35;;18124:18;;:::i;:::-;-1:-1:-1;18158:9:1;;18061:112::o;18178:127::-;18239:10;18234:3;18230:20;18227:1;18220:31;18270:4;18267:1;18260:15;18294:4;18291:1;18284:15;18310:127;18371:10;18366:3;18362:20;18359:1;18352:31;18402:4;18399:1;18392:15;18426:4;18423:1;18416:15;18442:127;18503:10;18498:3;18494:20;18491:1;18484:31;18534:4;18531:1;18524:15;18558:4;18555:1;18548:15;18574:127;18635:10;18630:3;18626:20;18623:1;18616:31;18666:4;18663:1;18656:15;18690:4;18687:1;18680:15;18706:131;-1:-1:-1;;;;;;18780:32:1;;18770:43;;18760:71;;18827:1;18824;18817:12

Swarm Source

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