ETH Price: $2,527.76 (+5.16%)
 

Overview

Max Total Supply

5,555 LAJ

Holders

1,798

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
0 LAJ
0x66cab872b20987e45db1ecb1d3823faaa0cbb368
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

This project is all about you & your NFT journey.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LifesAJoke

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-08-02
*/

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: erc721b/contracts/ERC721B.sol



pragma solidity ^0.8.0;





error InvalidCall();
error BalanceQueryZeroAddress();
error NonExistentToken();
error ApprovalToCurrentOwner();
error ApprovalOwnerIsOperator();
error NotERC721Receiver();
error ERC721ReceiverNotReceived();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] 
 * Non-Fungible Token Standard, including the Metadata extension and 
 * token Auto-ID generation.
 *
 * You must provide `name()` `symbol()` and `tokenURI(uint256 tokenId)`
 * to conform with IERC721Metadata
 */
abstract contract ERC721B is Context, ERC165, IERC721 {

  // ============ Storage ============

  // The last token id minted
  uint256 private _lastTokenId;
  // Mapping from token ID to owner address
  mapping(uint256 => address) internal _owners;
  // Mapping owner address to token count
  mapping(address => uint256) internal _balances;

  // Mapping from token ID to approved address
  mapping(uint256 => address) private _tokenApprovals;
  // Mapping from owner to operator approvals
  mapping(address => mapping(address => bool)) private _operatorApprovals;

  // ============ Read Methods ============

  /**
   * @dev See {IERC721-balanceOf}.
   */
  function balanceOf(address owner) 
    public view virtual override returns(uint256) 
  {
    if (owner == address(0)) revert BalanceQueryZeroAddress();
    return _balances[owner];
  }

  /**
   * @dev Shows the overall amount of tokens generated in the contract
   */
  function totalSupply() public view virtual returns(uint256) {
    return _lastTokenId;
  }

  /**
   * @dev See {IERC721-ownerOf}.
   */
  function ownerOf(uint256 tokenId) 
    public view virtual override returns(address) 
  {
    unchecked {
      //this is the situation when _owners normalized
      uint256 id = tokenId;
      if (_owners[id] != address(0)) {
        return _owners[id];
      }
      //this is the situation when _owners is not normalized
      if (id > 0 && id <= _lastTokenId) {
        //there will never be a case where token 1 is address(0)
        while(true) {
          id--;
          if (id == 0) {
            break;
          } else if (_owners[id] != address(0)) {
            return _owners[id];
          }
        }
      }
    }

    revert NonExistentToken();
  }

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

  // ============ Approval Methods ============

  /**
   * @dev See {IERC721-approve}.
   */
  function approve(address to, uint256 tokenId) public virtual override {
    address owner = ERC721B.ownerOf(tokenId);
    if (to == owner) revert ApprovalToCurrentOwner();

    address sender = _msgSender();
    if (sender != owner && !isApprovedForAll(owner, sender)) 
      revert ApprovalToCurrentOwner();

    _approve(to, tokenId, owner);
  }

  /**
   * @dev See {IERC721-getApproved}.
   */
  function getApproved(uint256 tokenId) 
    public view virtual override returns(address) 
  {
    if (!_exists(tokenId)) revert NonExistentToken();
    return _tokenApprovals[tokenId];
  }

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

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) 
    public virtual override 
  {
    _setApprovalForAll(_msgSender(), operator, approved);
  }

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

  /**
   * @dev transfers token considering approvals
   */
  function _approveTransfer(
    address spender, 
    address from, 
    address to, 
    uint256 tokenId
  ) internal virtual {
    if (!_isApprovedOrOwner(spender, tokenId, from)) 
      revert InvalidCall();

    _transfer(from, to, tokenId);
  }

  /**
   * @dev Safely transfers token considering approvals
   */
  function _approveSafeTransfer(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) internal virtual {
    _approveTransfer(_msgSender(), from, to, tokenId);
    //see: @openzep/utils/Address.sol
    if (to.code.length > 0
      && !_checkOnERC721Received(from, to, tokenId, _data)
    ) revert ERC721ReceiverNotReceived();
  }

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

  /**
   * @dev Approve `operator` to operate on all of `owner` tokens
   *
   * Emits a {ApprovalForAll} event.
   */
  function _setApprovalForAll(
    address owner,
    address operator,
    bool approved
  ) internal virtual {
    if (owner == operator) revert ApprovalOwnerIsOperator();
    _operatorApprovals[owner][operator] = approved;
    emit ApprovalForAll(owner, operator, approved);
  }

  // ============ Mint Methods ============

  /**
   * @dev Mints `tokenId` and transfers it to `to`.
   *
   * WARNING: Usage of this method is discouraged, use {_safeMint} 
   * whenever possible
   *
   * Requirements:
   *
   * - `tokenId` must not exist.
   * - `to` cannot be the zero address.
   *
   * Emits a {Transfer} event.
   */
  function _mint(
    address to,
    uint256 amount,
    bytes memory _data,
    bool safeCheck
  ) private {
    if(amount == 0 || to == address(0)) revert InvalidCall();
    uint256 startTokenId = _lastTokenId + 1;
    
    _beforeTokenTransfers(address(0), to, startTokenId, amount);
    
    unchecked {
      _lastTokenId += amount;
      _balances[to] += amount;
      _owners[startTokenId] = to;

      _afterTokenTransfers(address(0), to, startTokenId, amount);

      uint256 updatedIndex = startTokenId;
      uint256 endIndex = updatedIndex + amount;
      //if do safe check and,
      //check if contract one time (instead of loop)
      //see: @openzep/utils/Address.sol
      if (safeCheck && to.code.length > 0) {
        //loop emit transfer and received check
        do {
          emit Transfer(address(0), to, updatedIndex);
          if (!_checkOnERC721Received(address(0), to, updatedIndex++, _data))
            revert ERC721ReceiverNotReceived();
        } while (updatedIndex != endIndex);
        return;
      }

      do {
        emit Transfer(address(0), to, updatedIndex++);
      } while (updatedIndex != endIndex);
    }
  }

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

  /**
   * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], 
   * with an additional `data` parameter which is forwarded in 
   * {IERC721Receiver-onERC721Received} to contract recipients.
   */
  function _safeMint(
    address to,
    uint256 amount,
    bytes memory _data
  ) internal virtual {
    _mint(to, amount, _data, true);
  }

  // ============ Transfer Methods ============

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

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

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

  /**
   * @dev Internal function to invoke {IERC721Receiver-onERC721Received} 
   * on a target address. The call is not executed if the target address 
   * is not a contract.
   */
  function _checkOnERC721Received(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) private returns (bool) {
    try IERC721Receiver(to).onERC721Received(
      _msgSender(), from, tokenId, _data
    ) returns (bytes4 retval) {
      return retval == IERC721Receiver.onERC721Received.selector;
    } catch (bytes memory reason) {
      if (reason.length == 0) {
        revert NotERC721Receiver();
      } else {
        assembly {
          revert(add(32, reason), mload(reason))
        }
      }
    }
  }

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

  /**
   * @dev Safely transfers `tokenId` token from `from` to `to`, checking 
   * first that contract recipients are aware of the ERC721 protocol to 
   * prevent tokens from being forever locked.
   *
   * `_data` is additional data, it has no specified format and it is 
   * sent in call to `to`.
   *
   * This internal function is equivalent to {safeTransferFrom}, and can 
   * be used to e.g.
   * implement alternative mechanisms to perform token transfer, such as 
   * signature-based.
   *
   * Requirements:
   *
   * - `from` cannot be the zero address.
   * - `to` cannot be the zero address.
   * - `tokenId` token must exist and be owned by `from`.
   * - If `to` refers to a smart contract, it must implement 
   *   {IERC721Receiver-onERC721Received}, which is called upon a 
   *   safe transfer.
   *
   * Emits a {Transfer} event.
   */
  function _safeTransfer(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) internal virtual {
    _transfer(from, to, tokenId);
    //see: @openzep/utils/Address.sol
    if (to.code.length > 0
      && !_checkOnERC721Received(from, to, tokenId, _data)
    ) revert ERC721ReceiverNotReceived();
  }

  /**
   * @dev Transfers `tokenId` from `from` to `to`. As opposed to 
   * {transferFrom}, this imposes no restrictions on msg.sender.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `tokenId` token must be owned by `from`.
   *
   * Emits a {Transfer} event.
   */
  function _transfer(address from, address to, uint256 tokenId) private {
    //if transfer to null or not the owner
    if (to == address(0) || from != ERC721B.ownerOf(tokenId)) 
      revert InvalidCall();

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

    unchecked {
      //this is the situation when _owners are normalized
      _balances[to] += 1;
      _balances[from] -= 1;
      _owners[tokenId] = to;
      //this is the situation when _owners are not normalized
      uint256 nextTokenId = tokenId + 1;
      if (nextTokenId <= _lastTokenId && _owners[nextTokenId] == address(0)) {
        _owners[nextTokenId] = from;
      }
    }

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

  // ============ TODO Methods ============

  /**
   * @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
   * amount - 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 amount
  ) 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
   * amount - 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 amount
  ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;


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

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

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

// File: lifesajoke.sol


pragma solidity ^0.8.0;  







contract LifesAJoke is Ownable,AccessControl,ReentrancyGuard,ERC721B,IERC721Metadata{ 
  using Strings for uint256;
    
  bytes32 private constant _MINTER_ROLE = keccak256("MINTER_ROLE"); 
  bytes32 private constant _APPROVED_ROLE = keccak256("APPROVED_ROLE");
  bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
  uint16 public constant MAX_SUPPLY = 5555; 
  string private notRevealURI = "ipfs://bafkreiek6ux4f5rsgcomruroxlldosakkrvs74l74njui4m3bjka3fjyvy";  
 
  mapping(address => uint256) public minted; 
  bool public isStartPublicSale = false; 
  bool public isStartWhiteListSale = false; 
  string private _baseTokenURI; 
  string private _CONTRACT_URI = "ipfs://bafkreicih7gxqyngcsk7ip6wcoccfbz3wh6ecfabfgzmpybtkh7fiwg6vu";  
  uint256 public maxPerWallet = 1; 
  uint256 public mintPrice = 0 ether;   
  uint256 public creatorFees = 1000; 
  address public treasury = 0xfa83B36104cbB964a001B91bc4154C673408FeD2; 
  
  constructor() {
    _setupRole(DEFAULT_ADMIN_ROLE, 0xb98325778f105A6B57b9Ed79F563b26a88c5A0A3); 
  }

  function isApprovedForAll(
    address owner, 
    address operator
  ) public view override(ERC721B, IERC721) returns(bool) {
    return hasRole(_APPROVED_ROLE, operator) 
      || super.isApprovedForAll(owner, operator);
  } 
  
  function name() external pure override returns(string memory) {
    return "LifesAJokeNFT"; 
  }
  
  function symbol() external pure override returns(string memory) {
    return "LAJ";  
  }

  function contractURI() external view returns(string memory) {
    return _CONTRACT_URI;
  }

  function royaltyInfo(
    uint256 tokenId,
    uint256 salePrice
  ) external view returns (
    address receiver,
    uint256 royaltyAmount
  ) {
    if (treasury == address(0) || !_exists(tokenId)) 
      revert InvalidCall();
    
    return (
      payable(treasury), 
      (salePrice * creatorFees) / 10000
    );
  }
 
  function tokenURI(uint256 tokenId) external view override returns(string memory) {
    if(!_exists(tokenId)) revert InvalidCall();
    return bytes(_baseTokenURI).length > 0 ? string(
      abi.encodePacked(_baseTokenURI, tokenId.toString(), ".json")
    ) : notRevealURI;
  } 

  function mint(uint256 quantity) external payable nonReentrant {
    address recipient = _msgSender(); 
    if (recipient.code.length > 0 
      || !isStartPublicSale 
      || quantity == 0  
      || (quantity + minted[recipient]) > maxPerWallet 
      || (quantity * mintPrice) > msg.value 
      || (totalSupply() + quantity) > MAX_SUPPLY
    ) revert InvalidCall(); 
    minted[recipient] += quantity;
    _safeMint(recipient, quantity);
  } 

  function whiteListMint(
    uint256 quantity, 
    bytes memory proof
  ) external payable nonReentrant {
    address recipient = _msgSender(); 
    if (quantity == 0  
      || !isStartWhiteListSale 
      || (quantity + minted[recipient]) > maxPerWallet 
      || (quantity * mintPrice) > msg.value 
      || (totalSupply() + quantity) > MAX_SUPPLY 
      || !hasRole(_MINTER_ROLE, ECDSA.recover(
        ECDSA.toEthSignedMessageHash(
          keccak256(abi.encodePacked("whiteListMint", recipient))
        ),
        proof
      ))
    ) revert InvalidCall(); 
    minted[recipient] += quantity;
    _safeMint(recipient, quantity);
  }  

  function mintForAddress(
    address recipient,
    uint256 quantity
  ) external onlyOwner nonReentrant { 
    if (quantity == 0  
      || (totalSupply() + quantity) > MAX_SUPPLY
    ) revert InvalidCall();

    _safeMint(recipient, quantity);
  }
  
  function setBaseURI(string memory uri) external onlyOwner {
    _baseTokenURI = uri;
  }
  
  function setContractURI(string memory _uri) external onlyOwner {
    _CONTRACT_URI = _uri;
  }
  
  function setMaxPerWallet(uint256 max) external onlyOwner {
    maxPerWallet = max;
  } 
  
  function setNotRevealURI(string memory _notRevealURI) external onlyOwner {
    notRevealURI = _notRevealURI;
  } 

  function setMintPrice(uint256 price) external onlyOwner {
    mintPrice = price;
  } 

  function setPausesStates(bool _isStartPublicSale,bool _isStartWhiteListSale) external onlyOwner {
    isStartPublicSale = _isStartPublicSale;
    isStartWhiteListSale = _isStartWhiteListSale;
  }  
  
  function withdraw(address to) external onlyOwner nonReentrant {  
    payable(to).transfer(address(this).balance);
  } 
   
  function updateFees(uint256 percent) external onlyOwner {
    if (percent > 1000) revert InvalidCall();
    creatorFees = percent;
  }
 
  function supportsInterface(
    bytes4 interfaceId
  ) public view override(AccessControl, ERC721B, IERC165) returns(bool) { 
    return interfaceId == type(IERC721Metadata).interfaceId 
      || interfaceId == _INTERFACE_ID_ERC2981 
      || super.supportsInterface(interfaceId);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalOwnerIsOperator","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"BalanceQueryZeroAddress","type":"error"},{"inputs":[],"name":"ERC721ReceiverNotReceived","type":"error"},{"inputs":[],"name":"InvalidCall","type":"error"},{"inputs":[],"name":"NonExistentToken","type":"error"},{"inputs":[],"name":"NotERC721Receiver","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creatorFees","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":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isStartPublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isStartWhiteListSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealURI","type":"string"}],"name":"setNotRevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isStartPublicSale","type":"bool"},{"internalType":"bool","name":"_isStartWhiteListSale","type":"bool"}],"name":"setPausesStates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"whiteListMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610100604052604260808181529062002b6060a03980516200002a91600891602090910190620001c9565b50600a805461ffff191690556040805160808101909152604280825262002ba2602083013980516200006591600c91602090910190620001c9565b506001600d556000600e556103e8600f55601080546001600160a01b03191673fa83b36104cbb964a001b91bc4154c673408fed2179055348015620000a957600080fd5b50620000b533620000e1565b6001600255620000db600073b98325778f105a6b57b9ed79f563b26a88c5a0a362000131565b620002ac565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6200013d828262000141565b5050565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff166200013d5760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b828054620001d7906200026f565b90600052602060002090601f016020900481019282620001fb576000855562000246565b82601f106200021657805160ff191683800117855562000246565b8280016001018555821562000246579182015b828111156200024657825182559160200191906001019062000229565b506200025492915062000258565b5090565b5b8082111562000254576000815560010162000259565b600181811c908216806200028457607f821691505b60208210811415620002a657634e487b7160e01b600052602260045260246000fd5b50919050565b6128a480620002bc6000396000f3fe6080604052600436106102675760003560e01c806370a0823111610144578063bff0412e116100b6578063e8a3d4851161007a578063e8a3d4851461077a578063e985e9c51461078f578063f254933d146107af578063f2fde38b146107cf578063f4a0a528146107ef578063ff29fdaf1461080f57600080fd5b8063bff0412e146106e7578063c87b56dd14610707578063ca6b507614610727578063d547741f1461073a578063e268e4d31461075a57600080fd5b8063938e3d7b11610108578063938e3d7b1461063357806395d89b4114610653578063a0712d681461067f578063a217fddf14610692578063a22cb465146106a7578063b88d4fde146106c757600080fd5b806370a08231146105a0578063715018a6146105c057806378dacee1146105d55780638da5cb5b146105f557806391d148541461061357600080fd5b806332cb6b0c116101dd57806355f804b3116101a157806355f804b3146104f45780635accac991461051457806361d027b3146105345780636352211e146105545780636694ba61146105745780636817c76c1461058a57600080fd5b806332cb6b0c1461045557806336568abe1461047e57806342842e0e1461049e578063453c2310146104be57806351cff8d9146104d457600080fd5b80631e7269c51161022f5780631e7269c5146103595780631fe4d4841461038657806323b872dd146103a5578063248a9ca3146103c55780632a55205a146103f65780632f2ff15d1461043557600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102e0578063095ea7b31461031857806318160ddd1461033a575b600080fd5b34801561027857600080fd5b5061028c6102873660046123f0565b610829565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b5060408051808201909152600d81526c131a59995cd0529bdad9539195609a1b60208201525b6040516102989190612691565b3480156102ec57600080fd5b506103006102fb3660046123b4565b61086f565b6040516001600160a01b039091168152602001610298565b34801561032457600080fd5b5061033861033336600461236e565b6108b3565b005b34801561034657600080fd5b506003545b604051908152602001610298565b34801561036557600080fd5b5061034b610374366004612252565b60096020526000908152604090205481565b34801561039257600080fd5b50600a5461028c90610100900460ff1681565b3480156103b157600080fd5b506103386103c03660046122a0565b610943565b3480156103d157600080fd5b5061034b6103e03660046123b4565b6000908152600160208190526040909120015490565b34801561040257600080fd5b506104166104113660046124ba565b610954565b604080516001600160a01b039093168352602083019190915201610298565b34801561044157600080fd5b506103386104503660046123cd565b6109cb565b34801561046157600080fd5b5061046b6115b381565b60405161ffff9091168152602001610298565b34801561048a57600080fd5b506103386104993660046123cd565b6109f1565b3480156104aa57600080fd5b506103386104b93660046122a0565b610a74565b3480156104ca57600080fd5b5061034b600d5481565b3480156104e057600080fd5b506103386104ef366004612252565b610a8f565b34801561050057600080fd5b5061033861050f36600461242a565b610afb565b34801561052057600080fd5b5061033861052f36600461242a565b610b16565b34801561054057600080fd5b50601054610300906001600160a01b031681565b34801561056057600080fd5b5061030061056f3660046123b4565b610b31565b34801561058057600080fd5b5061034b600f5481565b34801561059657600080fd5b5061034b600e5481565b3480156105ac57600080fd5b5061034b6105bb366004612252565b610bee565b3480156105cc57600080fd5b50610338610c33565b3480156105e157600080fd5b506103386105f03660046123b4565b610c47565b34801561060157600080fd5b506000546001600160a01b0316610300565b34801561061f57600080fd5b5061028c61062e3660046123cd565b610c77565b34801561063f57600080fd5b5061033861064e36600461242a565b610ca2565b34801561065f57600080fd5b506040805180820190915260038152622620a560e91b60208201526102d3565b61033861068d3660046123b4565b610cbd565b34801561069e57600080fd5b5061034b600081565b3480156106b357600080fd5b506103386106c2366004612344565b610db9565b3480156106d357600080fd5b506103386106e23660046122dc565b610dc4565b3480156106f357600080fd5b50610338610702366004612398565b610dd0565b34801561071357600080fd5b506102d36107223660046123b4565b610dfc565b610338610735366004612473565b610efb565b34801561074657600080fd5b506103386107553660046123cd565b6110c6565b34801561076657600080fd5b506103386107753660046123b4565b6110ec565b34801561078657600080fd5b506102d36110f9565b34801561079b57600080fd5b5061028c6107aa36600461226d565b61118b565b3480156107bb57600080fd5b506103386107ca36600461236e565b6111ee565b3480156107db57600080fd5b506103386107ea366004612252565b611265565b3480156107fb57600080fd5b5061033861080a3660046123b4565b6112de565b34801561081b57600080fd5b50600a5461028c9060ff1681565b60006001600160e01b03198216635b5e139f60e01b148061085a57506001600160e01b0319821663152a902d60e11b145b806108695750610869826112eb565b92915050565b600061087a82611310565b61089757604051634a1850bf60e11b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108be82610b31565b9050806001600160a01b0316836001600160a01b031614156108f35760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821681148015906109145750610912828261118b565b155b156109325760405163250fdee360e21b815260040160405180910390fd5b61093d848484611325565b50505050565b61094f33848484611381565b505050565b60105460009081906001600160a01b03161580610977575061097584611310565b155b156109955760405163574b16a760e11b815260040160405180910390fd5b601054600f546001600160a01b0390911690612710906109b59086612707565b6109bf91906126f3565b915091505b9250929050565b600082815260016020819052604090912001546109e7816113b4565b61094f83836113be565b6001600160a01b0381163314610a665760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610a708282611429565b5050565b61094f83838360405180602001604052806000815250610dc4565b610a97611490565b600280541415610ab95760405162461bcd60e51b8152600401610a5d906126a4565b600280556040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610af2573d6000803e3d6000fd5b50506001600255565b610b03611490565b8051610a7090600b9060208401906120f7565b610b1e611490565b8051610a709060089060208401906120f7565b60008181526004602052604081205482906001600160a01b031615610b6e576000908152600460205260409020546001600160a01b031692915050565b600081118015610b8057506003548111155b15610bd4575b6000190180610b9457610bd4565b6000818152600460205260409020546001600160a01b031615610bcf576000908152600460205260409020546001600160a01b031692915050565b610b86565b50604051634a1850bf60e11b815260040160405180910390fd5b60006001600160a01b038216610c17576040516316285dcb60e11b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205490565b610c3b611490565b610c4560006114ea565b565b610c4f611490565b6103e8811115610c725760405163574b16a760e11b815260040160405180910390fd5b600f55565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b610caa611490565b8051610a7090600c9060208401906120f7565b600280541415610cdf5760405162461bcd60e51b8152600401610a5d906126a4565b6002805533803b151580610cf65750600a5460ff16155b80610cff575081155b80610d2d5750600d546001600160a01b038216600090815260096020526040902054610d2b90846126db565b115b80610d44575034600e5483610d429190612707565b115b80610d6357506115b382610d5760035490565b610d6191906126db565b115b15610d815760405163574b16a760e11b815260040160405180910390fd5b6001600160a01b03811660009081526009602052604081208054849290610da99084906126db565b90915550610af29050818361153a565b610a70338383611554565b61093d848484846115f4565b610dd8611490565b600a805461ffff191692151561ff0019169290921761010091151591909102179055565b6060610e0782611310565b610e245760405163574b16a760e11b815260040160405180910390fd5b6000600b8054610e3390612780565b905011610eca5760088054610e4790612780565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7390612780565b8015610ec05780601f10610e9557610100808354040283529160200191610ec0565b820191906000526020600020905b815481529060010190602001808311610ea357829003601f168201915b5050505050610869565b600b610ed583611641565b604051602001610ee6929190612524565b60405160208183030381529060405292915050565b600280541415610f1d5760405162461bcd60e51b8152600401610a5d906126a4565b6002805533821580610f375750600a54610100900460ff16155b80610f655750600d546001600160a01b038216600090815260096020526040902054610f6390856126db565b115b80610f7c575034600e5484610f7a9190612707565b115b80610f9b57506115b383610f8f60035490565b610f9991906126db565b115b806110665750604080516c1dda1a5d19531a5cdd135a5b9d609a1b602080830191909152606084901b6bffffffffffffffffffffffff1916602d830152825160218184030181526041830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006061840152607d8084019190915283518084039091018152609d9092019092528051910120611064907f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a69061062e9085611747565b155b156110845760405163574b16a760e11b815260040160405180910390fd5b6001600160a01b038116600090815260096020526040812080548592906110ac9084906126db565b909155506110bc9050818461153a565b5050600160025550565b600082815260016020819052604090912001546110e2816113b4565b61094f8383611429565b6110f4611490565b600d55565b6060600c805461110890612780565b80601f016020809104026020016040519081016040528092919081815260200182805461113490612780565b80156111815780601f1061115657610100808354040283529160200191611181565b820191906000526020600020905b81548152906001019060200180831161116457829003601f168201915b5050505050905090565b60006111b77f4a0c3698e72495f6d49f6ef074f2b34cac5b153c817a7cc37789cccbb873cf5d83610c77565b806111e757506001600160a01b0380841660009081526007602090815260408083209386168352929052205460ff165b9392505050565b6111f6611490565b6002805414156112185760405162461bcd60e51b8152600401610a5d906126a4565b6002805580158061123d57506115b38161123160035490565b61123b91906126db565b115b1561125b5760405163574b16a760e11b815260040160405180910390fd5b610af2828261153a565b61126d611490565b6001600160a01b0381166112d25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a5d565b6112db816114ea565b50565b6112e6611490565b600e55565b60006001600160e01b031982166380ac58cd60e01b148061086957506108698261176b565b60008082118015610869575050600354101590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61138c8482856117a0565b6113a95760405163574b16a760e11b815260040160405180910390fd5b61093d8383836117eb565b6112db8133611935565b6113c88282610c77565b610a705760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6114338282610c77565b15610a705760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000546001600160a01b03163314610c455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a5d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a70828260405180602001604052806000815250611999565b816001600160a01b0316836001600160a01b031614156115875760405163079f14e360e51b815260040160405180910390fd5b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61160033858585611381565b6000836001600160a01b03163b1180156116235750611621848484846119a6565b155b1561093d57604051631f11849560e21b815260040160405180910390fd5b6060816116655750506040805180820190915260018152600360fc1b602082015290565b8160005b811561168f5780611679816127bb565b91506116889050600a836126f3565b9150611669565b60008167ffffffffffffffff8111156116aa576116aa612842565b6040519080825280601f01601f1916602001820160405280156116d4576020820181803683370190505b5090505b841561173f576116e9600183612726565b91506116f6600a866127d6565b6117019060306126db565b60f81b8183815181106117165761171661282c565b60200101906001600160f81b031916908160001a905350611738600a866126f3565b94506116d8565b949350505050565b60008060006117568585611a9d565b9150915061176381611b0a565b509392505050565b60006001600160e01b03198216637965db0b60e01b148061086957506301ffc9a760e01b6001600160e01b0319831614610869565b6000816001600160a01b0316846001600160a01b031614806117db5750836001600160a01b03166117d08461086f565b6001600160a01b0316145b8061173f575061173f828561118b565b6001600160a01b038216158061181b575061180581610b31565b6001600160a01b0316836001600160a01b031614155b156118395760405163574b16a760e11b815260040160405180910390fd5b61184560008285611325565b6001600160a01b03808316600081815260056020908152604080832080546001908101909155948816835280832080546000190190558583526004909152902080546001600160a01b03191690911790556003549082019081118015906118c157506000818152600460205260409020546001600160a01b0316155b156118ee57600081815260046020526040902080546001600160a01b0319166001600160a01b0386161790555b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61193f8282610c77565b610a7057611957816001600160a01b03166014611cc5565b611962836020611cc5565b6040516020016119739291906125df565b60408051601f198184030181529082905262461bcd60e51b8252610a5d91600401612691565b61094f8383836001611e61565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119db903390899088908890600401612654565b602060405180830381600087803b1580156119f557600080fd5b505af1925050508015611a25575060408051601f3d908101601f19168201909252611a229181019061240d565b60015b611a80573d808015611a53576040519150601f19603f3d011682016040523d82523d6000602084013e611a58565b606091505b508051611a7857604051630568cbab60e01b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b600080825160411415611ad45760208301516040840151606085015160001a611ac887828585611fd1565b945094505050506109c4565b825160401415611afe5760208301516040840151611af38683836120be565b9350935050506109c4565b506000905060026109c4565b6000816004811115611b1e57611b1e612816565b1415611b275750565b6001816004811115611b3b57611b3b612816565b1415611b895760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a5d565b6002816004811115611b9d57611b9d612816565b1415611beb5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a5d565b6003816004811115611bff57611bff612816565b1415611c585760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a5d565b6004816004811115611c6c57611c6c612816565b14156112db5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610a5d565b60606000611cd4836002612707565b611cdf9060026126db565b67ffffffffffffffff811115611cf757611cf7612842565b6040519080825280601f01601f191660200182016040528015611d21576020820181803683370190505b509050600360fc1b81600081518110611d3c57611d3c61282c565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611d6b57611d6b61282c565b60200101906001600160f81b031916908160001a9053506000611d8f846002612707565b611d9a9060016126db565b90505b6001811115611e12576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611dce57611dce61282c565b1a60f81b828281518110611de457611de461282c565b60200101906001600160f81b031916908160001a90535060049490941c93611e0b81612769565b9050611d9d565b5083156111e75760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a5d565b821580611e7557506001600160a01b038416155b15611e935760405163574b16a760e11b815260040160405180910390fd5b60006003546001611ea491906126db565b905060038054850190556001600160a01b03851660008181526005602090815260408083208054890190558483526004909152902080546001600160a01b031916909117905580848101838015611f0557506000876001600160a01b03163b115b15611f83575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611f5660008884806001019550886119a6565b611f7357604051631f11849560e21b815260040160405180910390fd5b80821415611f0b5750505061093d565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611f845750505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561200857506000905060036120b5565b8460ff16601b1415801561202057508460ff16601c14155b1561203157506000905060046120b5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612085573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166120ae576000600192509250506120b5565b9150600090505b94509492505050565b6000806001600160ff1b038316816120db60ff86901c601b6126db565b90506120e987828885611fd1565b935093505050935093915050565b82805461210390612780565b90600052602060002090601f016020900481019282612125576000855561216b565b82601f1061213e57805160ff191683800117855561216b565b8280016001018555821561216b579182015b8281111561216b578251825591602001919060010190612150565b5061217792915061217b565b5090565b5b80821115612177576000815560010161217c565b600067ffffffffffffffff808411156121ab576121ab612842565b604051601f8501601f19908116603f011681019082821181831017156121d3576121d3612842565b816040528093508581528686860111156121ec57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461221d57600080fd5b919050565b8035801515811461221d57600080fd5b600082601f83011261224357600080fd5b6111e783833560208501612190565b60006020828403121561226457600080fd5b6111e782612206565b6000806040838503121561228057600080fd5b61228983612206565b915061229760208401612206565b90509250929050565b6000806000606084860312156122b557600080fd5b6122be84612206565b92506122cc60208501612206565b9150604084013590509250925092565b600080600080608085870312156122f257600080fd5b6122fb85612206565b935061230960208601612206565b925060408501359150606085013567ffffffffffffffff81111561232c57600080fd5b61233887828801612232565b91505092959194509250565b6000806040838503121561235757600080fd5b61236083612206565b915061229760208401612222565b6000806040838503121561238157600080fd5b61238a83612206565b946020939093013593505050565b600080604083850312156123ab57600080fd5b61236083612222565b6000602082840312156123c657600080fd5b5035919050565b600080604083850312156123e057600080fd5b8235915061229760208401612206565b60006020828403121561240257600080fd5b81356111e781612858565b60006020828403121561241f57600080fd5b81516111e781612858565b60006020828403121561243c57600080fd5b813567ffffffffffffffff81111561245357600080fd5b8201601f8101841361246457600080fd5b61173f84823560208401612190565b6000806040838503121561248657600080fd5b82359150602083013567ffffffffffffffff8111156124a457600080fd5b6124b085828601612232565b9150509250929050565b600080604083850312156124cd57600080fd5b50508035926020909101359150565b600081518084526124f481602086016020860161273d565b601f01601f19169290920160200192915050565b6000815161251a81856020860161273d565b9290920192915050565b600080845481600182811c91508083168061254057607f831692505b602080841082141561256057634e487b7160e01b86526022600452602486fd5b8180156125745760018114612585576125b2565b60ff198616895284890196506125b2565b60008b81526020902060005b868110156125aa5781548b820152908501908301612591565b505084890196505b5050505050506125d66125c58286612508565b64173539b7b760d91b815260050190565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161261781601785016020880161273d565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161264881602884016020880161273d565b01602801949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612687908301846124dc565b9695505050505050565b6020815260006111e760208301846124dc565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156126ee576126ee6127ea565b500190565b60008261270257612702612800565b500490565b6000816000190483118215151615612721576127216127ea565b500290565b600082821015612738576127386127ea565b500390565b60005b83811015612758578181015183820152602001612740565b8381111561093d5750506000910152565b600081612778576127786127ea565b506000190190565b600181811c9082168061279457607f821691505b602082108114156127b557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127cf576127cf6127ea565b5060010190565b6000826127e5576127e5612800565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146112db57600080fdfea2646970667358221220d3f0b10d8b44bb57a84778cc7b9827fd9bd0545f3bde5751e5326dcd4c7299d964736f6c63430008070033697066733a2f2f6261666b726569656b367578346635727367636f6d7275726f786c6c646f73616b6b72767337346c37346e6a7569346d33626a6b6133666a797679697066733a2f2f6261666b72656963696837677871796e6763736b3769703677636f636366627a33776836656366616266677a6d707962746b683766697767367675

Deployed Bytecode

0x6080604052600436106102675760003560e01c806370a0823111610144578063bff0412e116100b6578063e8a3d4851161007a578063e8a3d4851461077a578063e985e9c51461078f578063f254933d146107af578063f2fde38b146107cf578063f4a0a528146107ef578063ff29fdaf1461080f57600080fd5b8063bff0412e146106e7578063c87b56dd14610707578063ca6b507614610727578063d547741f1461073a578063e268e4d31461075a57600080fd5b8063938e3d7b11610108578063938e3d7b1461063357806395d89b4114610653578063a0712d681461067f578063a217fddf14610692578063a22cb465146106a7578063b88d4fde146106c757600080fd5b806370a08231146105a0578063715018a6146105c057806378dacee1146105d55780638da5cb5b146105f557806391d148541461061357600080fd5b806332cb6b0c116101dd57806355f804b3116101a157806355f804b3146104f45780635accac991461051457806361d027b3146105345780636352211e146105545780636694ba61146105745780636817c76c1461058a57600080fd5b806332cb6b0c1461045557806336568abe1461047e57806342842e0e1461049e578063453c2310146104be57806351cff8d9146104d457600080fd5b80631e7269c51161022f5780631e7269c5146103595780631fe4d4841461038657806323b872dd146103a5578063248a9ca3146103c55780632a55205a146103f65780632f2ff15d1461043557600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102e0578063095ea7b31461031857806318160ddd1461033a575b600080fd5b34801561027857600080fd5b5061028c6102873660046123f0565b610829565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b5060408051808201909152600d81526c131a59995cd0529bdad9539195609a1b60208201525b6040516102989190612691565b3480156102ec57600080fd5b506103006102fb3660046123b4565b61086f565b6040516001600160a01b039091168152602001610298565b34801561032457600080fd5b5061033861033336600461236e565b6108b3565b005b34801561034657600080fd5b506003545b604051908152602001610298565b34801561036557600080fd5b5061034b610374366004612252565b60096020526000908152604090205481565b34801561039257600080fd5b50600a5461028c90610100900460ff1681565b3480156103b157600080fd5b506103386103c03660046122a0565b610943565b3480156103d157600080fd5b5061034b6103e03660046123b4565b6000908152600160208190526040909120015490565b34801561040257600080fd5b506104166104113660046124ba565b610954565b604080516001600160a01b039093168352602083019190915201610298565b34801561044157600080fd5b506103386104503660046123cd565b6109cb565b34801561046157600080fd5b5061046b6115b381565b60405161ffff9091168152602001610298565b34801561048a57600080fd5b506103386104993660046123cd565b6109f1565b3480156104aa57600080fd5b506103386104b93660046122a0565b610a74565b3480156104ca57600080fd5b5061034b600d5481565b3480156104e057600080fd5b506103386104ef366004612252565b610a8f565b34801561050057600080fd5b5061033861050f36600461242a565b610afb565b34801561052057600080fd5b5061033861052f36600461242a565b610b16565b34801561054057600080fd5b50601054610300906001600160a01b031681565b34801561056057600080fd5b5061030061056f3660046123b4565b610b31565b34801561058057600080fd5b5061034b600f5481565b34801561059657600080fd5b5061034b600e5481565b3480156105ac57600080fd5b5061034b6105bb366004612252565b610bee565b3480156105cc57600080fd5b50610338610c33565b3480156105e157600080fd5b506103386105f03660046123b4565b610c47565b34801561060157600080fd5b506000546001600160a01b0316610300565b34801561061f57600080fd5b5061028c61062e3660046123cd565b610c77565b34801561063f57600080fd5b5061033861064e36600461242a565b610ca2565b34801561065f57600080fd5b506040805180820190915260038152622620a560e91b60208201526102d3565b61033861068d3660046123b4565b610cbd565b34801561069e57600080fd5b5061034b600081565b3480156106b357600080fd5b506103386106c2366004612344565b610db9565b3480156106d357600080fd5b506103386106e23660046122dc565b610dc4565b3480156106f357600080fd5b50610338610702366004612398565b610dd0565b34801561071357600080fd5b506102d36107223660046123b4565b610dfc565b610338610735366004612473565b610efb565b34801561074657600080fd5b506103386107553660046123cd565b6110c6565b34801561076657600080fd5b506103386107753660046123b4565b6110ec565b34801561078657600080fd5b506102d36110f9565b34801561079b57600080fd5b5061028c6107aa36600461226d565b61118b565b3480156107bb57600080fd5b506103386107ca36600461236e565b6111ee565b3480156107db57600080fd5b506103386107ea366004612252565b611265565b3480156107fb57600080fd5b5061033861080a3660046123b4565b6112de565b34801561081b57600080fd5b50600a5461028c9060ff1681565b60006001600160e01b03198216635b5e139f60e01b148061085a57506001600160e01b0319821663152a902d60e11b145b806108695750610869826112eb565b92915050565b600061087a82611310565b61089757604051634a1850bf60e11b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108be82610b31565b9050806001600160a01b0316836001600160a01b031614156108f35760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821681148015906109145750610912828261118b565b155b156109325760405163250fdee360e21b815260040160405180910390fd5b61093d848484611325565b50505050565b61094f33848484611381565b505050565b60105460009081906001600160a01b03161580610977575061097584611310565b155b156109955760405163574b16a760e11b815260040160405180910390fd5b601054600f546001600160a01b0390911690612710906109b59086612707565b6109bf91906126f3565b915091505b9250929050565b600082815260016020819052604090912001546109e7816113b4565b61094f83836113be565b6001600160a01b0381163314610a665760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610a708282611429565b5050565b61094f83838360405180602001604052806000815250610dc4565b610a97611490565b600280541415610ab95760405162461bcd60e51b8152600401610a5d906126a4565b600280556040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610af2573d6000803e3d6000fd5b50506001600255565b610b03611490565b8051610a7090600b9060208401906120f7565b610b1e611490565b8051610a709060089060208401906120f7565b60008181526004602052604081205482906001600160a01b031615610b6e576000908152600460205260409020546001600160a01b031692915050565b600081118015610b8057506003548111155b15610bd4575b6000190180610b9457610bd4565b6000818152600460205260409020546001600160a01b031615610bcf576000908152600460205260409020546001600160a01b031692915050565b610b86565b50604051634a1850bf60e11b815260040160405180910390fd5b60006001600160a01b038216610c17576040516316285dcb60e11b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205490565b610c3b611490565b610c4560006114ea565b565b610c4f611490565b6103e8811115610c725760405163574b16a760e11b815260040160405180910390fd5b600f55565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b610caa611490565b8051610a7090600c9060208401906120f7565b600280541415610cdf5760405162461bcd60e51b8152600401610a5d906126a4565b6002805533803b151580610cf65750600a5460ff16155b80610cff575081155b80610d2d5750600d546001600160a01b038216600090815260096020526040902054610d2b90846126db565b115b80610d44575034600e5483610d429190612707565b115b80610d6357506115b382610d5760035490565b610d6191906126db565b115b15610d815760405163574b16a760e11b815260040160405180910390fd5b6001600160a01b03811660009081526009602052604081208054849290610da99084906126db565b90915550610af29050818361153a565b610a70338383611554565b61093d848484846115f4565b610dd8611490565b600a805461ffff191692151561ff0019169290921761010091151591909102179055565b6060610e0782611310565b610e245760405163574b16a760e11b815260040160405180910390fd5b6000600b8054610e3390612780565b905011610eca5760088054610e4790612780565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7390612780565b8015610ec05780601f10610e9557610100808354040283529160200191610ec0565b820191906000526020600020905b815481529060010190602001808311610ea357829003601f168201915b5050505050610869565b600b610ed583611641565b604051602001610ee6929190612524565b60405160208183030381529060405292915050565b600280541415610f1d5760405162461bcd60e51b8152600401610a5d906126a4565b6002805533821580610f375750600a54610100900460ff16155b80610f655750600d546001600160a01b038216600090815260096020526040902054610f6390856126db565b115b80610f7c575034600e5484610f7a9190612707565b115b80610f9b57506115b383610f8f60035490565b610f9991906126db565b115b806110665750604080516c1dda1a5d19531a5cdd135a5b9d609a1b602080830191909152606084901b6bffffffffffffffffffffffff1916602d830152825160218184030181526041830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006061840152607d8084019190915283518084039091018152609d9092019092528051910120611064907f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a69061062e9085611747565b155b156110845760405163574b16a760e11b815260040160405180910390fd5b6001600160a01b038116600090815260096020526040812080548592906110ac9084906126db565b909155506110bc9050818461153a565b5050600160025550565b600082815260016020819052604090912001546110e2816113b4565b61094f8383611429565b6110f4611490565b600d55565b6060600c805461110890612780565b80601f016020809104026020016040519081016040528092919081815260200182805461113490612780565b80156111815780601f1061115657610100808354040283529160200191611181565b820191906000526020600020905b81548152906001019060200180831161116457829003601f168201915b5050505050905090565b60006111b77f4a0c3698e72495f6d49f6ef074f2b34cac5b153c817a7cc37789cccbb873cf5d83610c77565b806111e757506001600160a01b0380841660009081526007602090815260408083209386168352929052205460ff165b9392505050565b6111f6611490565b6002805414156112185760405162461bcd60e51b8152600401610a5d906126a4565b6002805580158061123d57506115b38161123160035490565b61123b91906126db565b115b1561125b5760405163574b16a760e11b815260040160405180910390fd5b610af2828261153a565b61126d611490565b6001600160a01b0381166112d25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a5d565b6112db816114ea565b50565b6112e6611490565b600e55565b60006001600160e01b031982166380ac58cd60e01b148061086957506108698261176b565b60008082118015610869575050600354101590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61138c8482856117a0565b6113a95760405163574b16a760e11b815260040160405180910390fd5b61093d8383836117eb565b6112db8133611935565b6113c88282610c77565b610a705760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6114338282610c77565b15610a705760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000546001600160a01b03163314610c455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a5d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610a70828260405180602001604052806000815250611999565b816001600160a01b0316836001600160a01b031614156115875760405163079f14e360e51b815260040160405180910390fd5b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61160033858585611381565b6000836001600160a01b03163b1180156116235750611621848484846119a6565b155b1561093d57604051631f11849560e21b815260040160405180910390fd5b6060816116655750506040805180820190915260018152600360fc1b602082015290565b8160005b811561168f5780611679816127bb565b91506116889050600a836126f3565b9150611669565b60008167ffffffffffffffff8111156116aa576116aa612842565b6040519080825280601f01601f1916602001820160405280156116d4576020820181803683370190505b5090505b841561173f576116e9600183612726565b91506116f6600a866127d6565b6117019060306126db565b60f81b8183815181106117165761171661282c565b60200101906001600160f81b031916908160001a905350611738600a866126f3565b94506116d8565b949350505050565b60008060006117568585611a9d565b9150915061176381611b0a565b509392505050565b60006001600160e01b03198216637965db0b60e01b148061086957506301ffc9a760e01b6001600160e01b0319831614610869565b6000816001600160a01b0316846001600160a01b031614806117db5750836001600160a01b03166117d08461086f565b6001600160a01b0316145b8061173f575061173f828561118b565b6001600160a01b038216158061181b575061180581610b31565b6001600160a01b0316836001600160a01b031614155b156118395760405163574b16a760e11b815260040160405180910390fd5b61184560008285611325565b6001600160a01b03808316600081815260056020908152604080832080546001908101909155948816835280832080546000190190558583526004909152902080546001600160a01b03191690911790556003549082019081118015906118c157506000818152600460205260409020546001600160a01b0316155b156118ee57600081815260046020526040902080546001600160a01b0319166001600160a01b0386161790555b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61193f8282610c77565b610a7057611957816001600160a01b03166014611cc5565b611962836020611cc5565b6040516020016119739291906125df565b60408051601f198184030181529082905262461bcd60e51b8252610a5d91600401612691565b61094f8383836001611e61565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119db903390899088908890600401612654565b602060405180830381600087803b1580156119f557600080fd5b505af1925050508015611a25575060408051601f3d908101601f19168201909252611a229181019061240d565b60015b611a80573d808015611a53576040519150601f19603f3d011682016040523d82523d6000602084013e611a58565b606091505b508051611a7857604051630568cbab60e01b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b600080825160411415611ad45760208301516040840151606085015160001a611ac887828585611fd1565b945094505050506109c4565b825160401415611afe5760208301516040840151611af38683836120be565b9350935050506109c4565b506000905060026109c4565b6000816004811115611b1e57611b1e612816565b1415611b275750565b6001816004811115611b3b57611b3b612816565b1415611b895760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a5d565b6002816004811115611b9d57611b9d612816565b1415611beb5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a5d565b6003816004811115611bff57611bff612816565b1415611c585760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a5d565b6004816004811115611c6c57611c6c612816565b14156112db5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610a5d565b60606000611cd4836002612707565b611cdf9060026126db565b67ffffffffffffffff811115611cf757611cf7612842565b6040519080825280601f01601f191660200182016040528015611d21576020820181803683370190505b509050600360fc1b81600081518110611d3c57611d3c61282c565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611d6b57611d6b61282c565b60200101906001600160f81b031916908160001a9053506000611d8f846002612707565b611d9a9060016126db565b90505b6001811115611e12576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611dce57611dce61282c565b1a60f81b828281518110611de457611de461282c565b60200101906001600160f81b031916908160001a90535060049490941c93611e0b81612769565b9050611d9d565b5083156111e75760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a5d565b821580611e7557506001600160a01b038416155b15611e935760405163574b16a760e11b815260040160405180910390fd5b60006003546001611ea491906126db565b905060038054850190556001600160a01b03851660008181526005602090815260408083208054890190558483526004909152902080546001600160a01b031916909117905580848101838015611f0557506000876001600160a01b03163b115b15611f83575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611f5660008884806001019550886119a6565b611f7357604051631f11849560e21b815260040160405180910390fd5b80821415611f0b5750505061093d565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611f845750505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561200857506000905060036120b5565b8460ff16601b1415801561202057508460ff16601c14155b1561203157506000905060046120b5565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612085573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166120ae576000600192509250506120b5565b9150600090505b94509492505050565b6000806001600160ff1b038316816120db60ff86901c601b6126db565b90506120e987828885611fd1565b935093505050935093915050565b82805461210390612780565b90600052602060002090601f016020900481019282612125576000855561216b565b82601f1061213e57805160ff191683800117855561216b565b8280016001018555821561216b579182015b8281111561216b578251825591602001919060010190612150565b5061217792915061217b565b5090565b5b80821115612177576000815560010161217c565b600067ffffffffffffffff808411156121ab576121ab612842565b604051601f8501601f19908116603f011681019082821181831017156121d3576121d3612842565b816040528093508581528686860111156121ec57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461221d57600080fd5b919050565b8035801515811461221d57600080fd5b600082601f83011261224357600080fd5b6111e783833560208501612190565b60006020828403121561226457600080fd5b6111e782612206565b6000806040838503121561228057600080fd5b61228983612206565b915061229760208401612206565b90509250929050565b6000806000606084860312156122b557600080fd5b6122be84612206565b92506122cc60208501612206565b9150604084013590509250925092565b600080600080608085870312156122f257600080fd5b6122fb85612206565b935061230960208601612206565b925060408501359150606085013567ffffffffffffffff81111561232c57600080fd5b61233887828801612232565b91505092959194509250565b6000806040838503121561235757600080fd5b61236083612206565b915061229760208401612222565b6000806040838503121561238157600080fd5b61238a83612206565b946020939093013593505050565b600080604083850312156123ab57600080fd5b61236083612222565b6000602082840312156123c657600080fd5b5035919050565b600080604083850312156123e057600080fd5b8235915061229760208401612206565b60006020828403121561240257600080fd5b81356111e781612858565b60006020828403121561241f57600080fd5b81516111e781612858565b60006020828403121561243c57600080fd5b813567ffffffffffffffff81111561245357600080fd5b8201601f8101841361246457600080fd5b61173f84823560208401612190565b6000806040838503121561248657600080fd5b82359150602083013567ffffffffffffffff8111156124a457600080fd5b6124b085828601612232565b9150509250929050565b600080604083850312156124cd57600080fd5b50508035926020909101359150565b600081518084526124f481602086016020860161273d565b601f01601f19169290920160200192915050565b6000815161251a81856020860161273d565b9290920192915050565b600080845481600182811c91508083168061254057607f831692505b602080841082141561256057634e487b7160e01b86526022600452602486fd5b8180156125745760018114612585576125b2565b60ff198616895284890196506125b2565b60008b81526020902060005b868110156125aa5781548b820152908501908301612591565b505084890196505b5050505050506125d66125c58286612508565b64173539b7b760d91b815260050190565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161261781601785016020880161273d565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161264881602884016020880161273d565b01602801949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612687908301846124dc565b9695505050505050565b6020815260006111e760208301846124dc565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156126ee576126ee6127ea565b500190565b60008261270257612702612800565b500490565b6000816000190483118215151615612721576127216127ea565b500290565b600082821015612738576127386127ea565b500390565b60005b83811015612758578181015183820152602001612740565b8381111561093d5750506000910152565b600081612778576127786127ea565b506000190190565b600181811c9082168061279457607f821691505b602082108114156127b557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127cf576127cf6127ea565b5060010190565b6000826127e5576127e5612800565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146112db57600080fdfea2646970667358221220d3f0b10d8b44bb57a84778cc7b9827fd9bd0545f3bde5751e5326dcd4c7299d964736f6c63430008070033

Deployed Bytecode Sourcemap

52166:4925:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56798:290;;;;;;;;;;-1:-1:-1;56798:290:0;;;;;:::i;:::-;;:::i;:::-;;;10132:14:1;;10125:22;10107:41;;10095:2;10080:18;56798:290:0;;;;;;;;53473:98;;;;;;;;;;-1:-1:-1;53542:22:0;;;;;;;;;;;;-1:-1:-1;;;53542:22:0;;;;53473:98;;;;;;;:::i;40857:193::-;;;;;;;;;;-1:-1:-1;40857:193:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9151:32:1;;;9133:51;;9121:2;9106:18;40857:193:0;8987:203:1;40443:356:0;;;;;;;;;;-1:-1:-1;40443:356:0;;;;;:::i;:::-;;:::i;:::-;;39214:92;;;;;;;;;;-1:-1:-1;39288:12:0;;39214:92;;;10305:25:1;;;10293:2;10278:18;39214:92:0;10159:177:1;52652:41:0;;;;;;;;;;-1:-1:-1;52652:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;52742:40;;;;;;;;;;-1:-1:-1;52742:40:0;;;;;;;;;;;45857:171;;;;;;;;;;-1:-1:-1;45857:171:0;;;;;:::i;:::-;;:::i;28933:131::-;;;;;;;;;;-1:-1:-1;28933:131:0;;;;;:::i;:::-;29007:7;29034:12;;;:6;:12;;;;;;;;:22;;;28933:131;53775:337;;;;;;;;;;-1:-1:-1;53775:337:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;9880:32:1;;;9862:51;;9944:2;9929:18;;9922:34;;;;9835:18;53775:337:0;9688:274:1;29374:147:0;;;;;;;;;;-1:-1:-1;29374:147:0;;;;;:::i;:::-;;:::i;52498:40::-;;;;;;;;;;;;52534:4;52498:40;;;;;14566:6:1;14554:19;;;14536:38;;14524:2;14509:18;52498:40:0;14392:188:1;30518:218:0;;;;;;;;;;-1:-1:-1;30518:218:0;;;;;:::i;:::-;;:::i;46091:165::-;;;;;;;;;;-1:-1:-1;46091:165:0;;;;;:::i;:::-;;:::i;52928:31::-;;;;;;;;;;;;;;;;56524:120;;;;;;;;;;-1:-1:-1;56524:120:0;;;;;:::i;:::-;;:::i;55803:90::-;;;;;;;;;;-1:-1:-1;55803:90:0;;;;;:::i;:::-;;:::i;56102:114::-;;;;;;;;;;-1:-1:-1;56102:114:0;;;;;:::i;:::-;;:::i;53046:68::-;;;;;;;;;;-1:-1:-1;53046:68:0;;;;-1:-1:-1;;;;;53046:68:0;;;39360:690;;;;;;;;;;-1:-1:-1;39360:690:0;;;;;:::i;:::-;;:::i;53007:33::-;;;;;;;;;;;;;;;;52965:34;;;;;;;;;;;;;;;;38932:190;;;;;;;;;;-1:-1:-1;38932:190:0;;;;;:::i;:::-;;:::i;20703:103::-;;;;;;;;;;;;;:::i;56654:137::-;;;;;;;;;;-1:-1:-1;56654:137:0;;;;;:::i;:::-;;:::i;20055:87::-;;;;;;;;;;-1:-1:-1;20101:7:0;20128:6;-1:-1:-1;;;;;20128:6:0;20055:87;;27393:147;;;;;;;;;;-1:-1:-1;27393:147:0;;;;;:::i;:::-;;:::i;55901:96::-;;;;;;;;;;-1:-1:-1;55901:96:0;;;;;:::i;:::-;;:::i;53579:91::-;;;;;;;;;;-1:-1:-1;53650:12:0;;;;;;;;;;;;-1:-1:-1;;;53650:12:0;;;;53579:91;;54407:456;;;;;;:::i;:::-;;:::i;26498:49::-;;;;;;;;;;-1:-1:-1;26498:49:0;26543:4;26498:49;;41345:159;;;;;;;;;;-1:-1:-1;41345:159:0;;;;;:::i;:::-;;:::i;46319:197::-;;;;;;;;;;-1:-1:-1;46319:197:0;;;;;:::i;:::-;;:::i;56316:198::-;;;;;;;;;;-1:-1:-1;56316:198:0;;;;;:::i;:::-;;:::i;54119:281::-;;;;;;;;;;-1:-1:-1;54119:281:0;;;;;:::i;:::-;;:::i;54870:659::-;;;;;;:::i;:::-;;:::i;29814:149::-;;;;;;;;;;-1:-1:-1;29814:149:0;;;;;:::i;:::-;;:::i;56005:88::-;;;;;;;;;;-1:-1:-1;56005:88:0;;;;;:::i;:::-;;:::i;53676:93::-;;;;;;;;;;;;;:::i;53232:232::-;;;;;;;;;;-1:-1:-1;53232:232:0;;;;;:::i;:::-;;:::i;55537:258::-;;;;;;;;;;-1:-1:-1;55537:258:0;;;;;:::i;:::-;;:::i;20961:201::-;;;;;;;;;;-1:-1:-1;20961:201:0;;;;;:::i;:::-;;:::i;56223:86::-;;;;;;;;;;-1:-1:-1;56223:86:0;;;;;:::i;:::-;;:::i;52699:37::-;;;;;;;;;;-1:-1:-1;52699:37:0;;;;;;;;56798:290;56917:4;-1:-1:-1;;;;;;56938:48:0;;-1:-1:-1;;;56938:48:0;;:96;;-1:-1:-1;;;;;;;56998:36:0;;-1:-1:-1;;;56998:36:0;56938:96;:144;;;;57046:36;57070:11;57046:23;:36::i;:::-;56931:151;56798:290;-1:-1:-1;;56798:290:0:o;40857:193::-;40938:7;40963:16;40971:7;40963;:16::i;:::-;40958:48;;40988:18;;-1:-1:-1;;;40988:18:0;;;;;;;;;;;40958:48;-1:-1:-1;41020:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;41020:24:0;;40857:193::o;40443:356::-;40520:13;40536:24;40552:7;40536:15;:24::i;:::-;40520:40;;40577:5;-1:-1:-1;;;;;40571:11:0;:2;-1:-1:-1;;;;;40571:11:0;;40567:48;;;40591:24;;-1:-1:-1;;;40591:24:0;;;;;;;;;;;40567:48;18686:10;-1:-1:-1;;;;;40664:15:0;;;;;;;:51;;;40684:31;40701:5;40708:6;40684:16;:31::i;:::-;40683:32;40664:51;40660:96;;;40732:24;;-1:-1:-1;;;40732:24:0;;;;;;;;;;;40660:96;40765:28;40774:2;40778:7;40787:5;40765:8;:28::i;:::-;40513:286;;40443:356;;:::o;45857:171::-;45973:49;18686:10;46004:4;46010:2;46014:7;45973:16;:49::i;:::-;45857:171;;;:::o;53775:337::-;53937:8;;53876:16;;;;-1:-1:-1;;;;;53937:8:0;:22;;:43;;;53964:16;53972:7;53964;:16::i;:::-;53963:17;53937:43;53933:77;;;53997:13;;-1:-1:-1;;;53997:13:0;;;;;;;;;;;53933:77;54047:8;;54079:11;;-1:-1:-1;;;;;54047:8:0;;;;54094:5;;54067:23;;:9;:23;:::i;:::-;54066:33;;;;:::i;:::-;54023:83;;;;53775:337;;;;;;:::o;29374:147::-;29007:7;29034:12;;;:6;:12;;;;;;;;:22;;26989:16;27000:4;26989:10;:16::i;:::-;29488:25:::1;29499:4;29505:7;29488:10;:25::i;30518:218::-:0;-1:-1:-1;;;;;30614:23:0;;18686:10;30614:23;30606:83;;;;-1:-1:-1;;;30606:83:0;;14178:2:1;30606:83:0;;;14160:21:1;14217:2;14197:18;;;14190:30;14256:34;14236:18;;;14229:62;-1:-1:-1;;;14307:18:1;;;14300:45;14362:19;;30606:83:0;;;;;;;;;30702:26;30714:4;30720:7;30702:11;:26::i;:::-;30518:218;;:::o;46091:165::-;46211:39;46228:4;46234:2;46238:7;46211:39;;;;;;;;;;;;:16;:39::i;56524:120::-;19941:13;:11;:13::i;:::-;1812:1:::1;2410:7:::0;::::1;:19;;2402:63;;;;-1:-1:-1::0;;;2402:63:0::1;;;;;;;:::i;:::-;1812:1;2543:18:::0;;56595:43:::2;::::0;-1:-1:-1;;;;;56595:20:0;::::2;::::0;56616:21:::2;56595:43:::0;::::2;;;::::0;::::2;::::0;;;56616:21;56595:20;:43;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;1768:1:0::1;2722:7;:22:::0;56524:120::o;55803:90::-;19941:13;:11;:13::i;:::-;55868:19;;::::1;::::0;:13:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;56102:114::-:0;19941:13;:11;:13::i;:::-;56182:28;;::::1;::::0;:12:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;39360:690::-:0;39437:7;39564:11;;;:7;:11;;;;;;39544:7;;-1:-1:-1;;;;;39564:11:0;:25;39560:70;;39609:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;39609:11:0;;39360:690;-1:-1:-1;;39360:690:0:o;39560:70::-;39709:1;39704:2;:6;:28;;;;;39720:12;;39714:2;:18;;39704:28;39700:304;;;39811:184;-1:-1:-1;;39836:4:0;39857:7;39853:131;;39881:5;;39853:131;39933:1;39910:11;;;:7;:11;;;;;;-1:-1:-1;;;;;39910:11:0;:25;39906:78;;39959:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;39959:11:0;;39360:690;-1:-1:-1;;39360:690:0:o;39906:78::-;39811:184;;;39457:554;40026:18;;-1:-1:-1;;;40026:18:0;;;;;;;;;;;38932:190;39009:7;-1:-1:-1;;;;;39033:19:0;;39029:57;;39061:25;;-1:-1:-1;;;39061:25:0;;;;;;;;;;;39029:57;-1:-1:-1;;;;;;39100:16:0;;;;;:9;:16;;;;;;;38932:190::o;20703:103::-;19941:13;:11;:13::i;:::-;20768:30:::1;20795:1;20768:18;:30::i;:::-;20703:103::o:0;56654:137::-;19941:13;:11;:13::i;:::-;56731:4:::1;56721:7;:14;56717:40;;;56744:13;;-1:-1:-1::0;;;56744:13:0::1;;;;;;;;;;;56717:40;56764:11;:21:::0;56654:137::o;27393:147::-;27479:4;27503:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;27503:29:0;;;;;;;;;;;;;;;27393:147::o;55901:96::-;19941:13;:11;:13::i;:::-;55971:20;;::::1;::::0;:13:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;54407:456::-:0;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:18;;18686:10;54520:21;::::1;:25:::0;;;:55:::1;;-1:-1:-1::0;54558:17:0::1;::::0;::::1;;54557:18;54520:55;:80;;;-1:-1:-1::0;54587:13:0;;54520:80:::1;:138;;;-1:-1:-1::0;54646:12:0::1;::::0;-1:-1:-1;;;;;54625:17:0;::::1;;::::0;;;:6:::1;:17;::::0;;;;;54614:28:::1;::::0;:8;:28:::1;:::i;:::-;54613:45;54520:138;:184;;;;54695:9;54682;;54671:8;:20;;;;:::i;:::-;54670:34;54520:184;:235;;;-1:-1:-1::0;52534:4:0::1;54733:8:::0;54717:13:::1;39288:12:::0;;;39214:92;54717:13:::1;:24;;;;:::i;:::-;54716:39;54520:235;54516:267;;;54770:13;;-1:-1:-1::0;;;54770:13:0::1;;;;;;;;;;;54516:267;-1:-1:-1::0;;;;;54791:17:0;::::1;;::::0;;;:6:::1;:17;::::0;;;;:29;;54812:8;;54791:17;:29:::1;::::0;54812:8;;54791:29:::1;:::i;:::-;::::0;;;-1:-1:-1;54827:30:0::1;::::0;-1:-1:-1;54837:9:0;54848:8;54827:9:::1;:30::i;41345:159::-:0;41446:52;18686:10;41479:8;41489;41446:18;:52::i;46319:197::-;46464:46;46485:4;46491:2;46495:7;46504:5;46464:20;:46::i;56316:198::-;19941:13;:11;:13::i;:::-;56419:17:::1;:38:::0;;-1:-1:-1;;56464:44:0;56419:38;::::1;;-1:-1:-1::0;;56464:44:0;;;;;56419:38:::1;56464:44:::0;::::1;;::::0;;;::::1;;::::0;;56316:198::o;54119:281::-;54185:13;54211:16;54219:7;54211;:16::i;:::-;54207:42;;54236:13;;-1:-1:-1;;;54236:13:0;;;;;;;;;;;54207:42;54293:1;54269:13;54263:27;;;;;:::i;:::-;;;:31;:131;;54382:12;54263:131;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54329:13;54344:18;:7;:16;:18::i;:::-;54312:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54256:138;54119:281;-1:-1:-1;;54119:281:0:o;54870:659::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;;;;;;:::i;:::-;1812:1;2543:18;;18686:10;55028:13;;;:47:::1;;-1:-1:-1::0;55055:20:0::1;::::0;::::1;::::0;::::1;;;55054:21;55028:47;:104;;;-1:-1:-1::0;55120:12:0::1;::::0;-1:-1:-1;;;;;55099:17:0;::::1;;::::0;;;:6:::1;:17;::::0;;;;;55088:28:::1;::::0;:8;:28:::1;:::i;:::-;55087:45;55028:104;:150;;;;55169:9;55156;;55145:8;:20;;;;:::i;:::-;55144:34;55028:150;:201;;;-1:-1:-1::0;52534:4:0::1;55207:8:::0;55191:13:::1;39288:12:::0;;;39214:92;55191:13:::1;:24;;;;:::i;:::-;55190:39;55028:201;:393;;;-1:-1:-1::0;55339:44:0::1;::::0;;-1:-1:-1;;;55339:44:0::1;::::0;;::::1;8045:28:1::0;;;;8111:2;8107:15;;;-1:-1:-1;;8103:53:1;8089:12;;;8082:75;55339:44:0;;;;;;;;;8173:12:1;;;55339:44:0;;55329:55;;;;::::1;::::0;7672:66:1;13773:58:0;;;7660:79:1;7755:12;;;;7748:28;;;;13773:58:0;;;;;;;;;;7792:12:1;;;;13773:58:0;;;13763:69;;;;;55242:179:::1;::::0;52332:24:::1;::::0;55264:156:::1;::::0;55406:5:::1;55264:13;:156::i;55242:179::-;55241:180;55028:393;55024:425;;;55436:13;;-1:-1:-1::0;;;55436:13:0::1;;;;;;;;;;;55024:425;-1:-1:-1::0;;;;;55457:17:0;::::1;;::::0;;;:6:::1;:17;::::0;;;;:29;;55478:8;;55457:17;:29:::1;::::0;55478:8;;55457:29:::1;:::i;:::-;::::0;;;-1:-1:-1;55493:30:0::1;::::0;-1:-1:-1;55503:9:0;55514:8;55493:9:::1;:30::i;:::-;-1:-1:-1::0;;1768:1:0;2722:7;:22;-1:-1:-1;54870:659:0:o;29814:149::-;29007:7;29034:12;;;:6;:12;;;;;;;;:22;;26989:16;27000:4;26989:10;:16::i;:::-;29929:26:::1;29941:4;29947:7;29929:11;:26::i;56005:88::-:0;19941:13;:11;:13::i;:::-;56069:12:::1;:18:::0;56005:88::o;53676:93::-;53721:13;53750;53743:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53676:93;:::o;53232:232::-;53354:4;53374:33;52404:26;53398:8;53374:7;:33::i;:::-;:84;;;-1:-1:-1;;;;;;41240:25:0;;;41216:4;41240:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;53419:39;53367:91;53232:232;-1:-1:-1;;;53232:232:0:o;55537:258::-;19941:13;:11;:13::i;:::-;1812:1:::1;2410:7:::0;::::1;:19;;2402:63;;;;-1:-1:-1::0;;;2402:63:0::1;;;;;;;:::i;:::-;1812:1;2543:18:::0;;55657:13;;;:65:::2;;-1:-1:-1::0;52534:4:0::2;55700:8:::0;55684:13:::2;39288:12:::0;;;39214:92;55684:13:::2;:24;;;;:::i;:::-;55683:39;55657:65;55653:97;;;55737:13;;-1:-1:-1::0;;;55737:13:0::2;;;;;;;;;;;55653:97;55759:30;55769:9;55780:8;55759:9;:30::i;20961:201::-:0;19941:13;:11;:13::i;:::-;-1:-1:-1;;;;;21050:22:0;::::1;21042:73;;;::::0;-1:-1:-1;;;21042:73:0;;12244:2:1;21042:73:0::1;::::0;::::1;12226:21:1::0;12283:2;12263:18;;;12256:30;12322:34;12302:18;;;12295:62;-1:-1:-1;;;12373:18:1;;;12366:36;12419:19;;21042:73:0::1;12042:402:1::0;21042:73:0::1;21126:28;21145:8;21126:18;:28::i;:::-;20961:201:::0;:::o;56223:86::-;19941:13;:11;:13::i;:::-;56286:9:::1;:17:::0;56223:86::o;40114:224::-;40221:4;-1:-1:-1;;;;;;40245:40:0;;-1:-1:-1;;;40245:40:0;;:87;;;40296:36;40320:11;40296:23;:36::i;47571:129::-;47636:4;47666:1;47656:7;:11;:38;;;;-1:-1:-1;;47682:12:0;;-1:-1:-1;47671:23:0;;47571:129::o;41610:171::-;41706:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;41706:29:0;-1:-1:-1;;;;;41706:29:0;;;;;;;;;41747:28;;41706:24;;41747:28;;;;;;;41610:171;;;:::o;41850:258::-;41993:42;42012:7;42021;42030:4;41993:18;:42::i;:::-;41988:77;;42052:13;;-1:-1:-1;;;42052:13:0;;;;;;;;;;;41988:77;42074:28;42084:4;42090:2;42094:7;42074:9;:28::i;27844:105::-;27911:30;27922:4;18686:10;27911;:30::i;32115:238::-;32199:22;32207:4;32213:7;32199;:22::i;:::-;32194:152;;32238:12;;;;32270:4;32238:12;;;;;;;;-1:-1:-1;;;;;32238:29:0;;;;;;;;;;:36;;-1:-1:-1;;32238:36:0;;;;;;;32294:40;;18686:10;;32238:12;;32294:40;;32238:12;32294:40;32115:238;;:::o;32533:239::-;32617:22;32625:4;32631:7;32617;:22::i;:::-;32613:152;;;32688:5;32656:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;32656:29:0;;;;;;;;;;:37;;-1:-1:-1;;32656:37:0;;;32713:40;18686:10;;32656:12;;32713:40;;32688:5;32713:40;32533:239;;:::o;20220:132::-;20101:7;20128:6;-1:-1:-1;;;;;20128:6:0;18686:10;20284:23;20276:68;;;;-1:-1:-1;;;20276:68:0;;13457:2:1;20276:68:0;;;13439:21:1;;;13476:18;;;13469:30;13535:34;13515:18;;;13508:62;13587:18;;20276:68:0;13255:356:1;21322:191:0;21396:16;21415:6;;-1:-1:-1;;;;;21432:17:0;;;-1:-1:-1;;;;;;21432:17:0;;;;;;21465:40;;21415:6;;;;;;;21465:40;;21396:16;21465:40;21385:128;21322:191;:::o;45273:102::-;45344:25;45354:2;45358:6;45344:25;;;;;;;;;;;;:9;:25::i;43090:287::-;43223:8;-1:-1:-1;;;;;43214:17:0;:5;-1:-1:-1;;;;;43214:17:0;;43210:55;;;43240:25;;-1:-1:-1;;;43240:25:0;;;;;;;;;;;43210:55;-1:-1:-1;;;;;43272:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;43272:46:0;;;;;;;;;;43330:41;;10107::1;;;43330::0;;10080:18:1;43330:41:0;;;;;;;43090:287;;;:::o;42184:367::-;42326:49;18686:10;42357:4;42363:2;42367:7;42326:16;:49::i;:::-;42442:1;42425:2;-1:-1:-1;;;;;42425:14:0;;:18;:78;;;;;42455:48;42478:4;42484:2;42488:7;42497:5;42455:22;:48::i;:::-;42454:49;42425:78;42421:124;;;42518:27;;-1:-1:-1;;;42518:27:0;;;;;;;;;;;3189:723;3245:13;3466:10;3462:53;;-1:-1:-1;;3493:10:0;;;;;;;;;;;;-1:-1:-1;;;3493:10:0;;;;;3189:723::o;3462:53::-;3540:5;3525:12;3581:78;3588:9;;3581:78;;3614:8;;;;:::i;:::-;;-1:-1:-1;3637:10:0;;-1:-1:-1;3645:2:0;3637:10;;:::i;:::-;;;3581:78;;;3669:19;3701:6;3691:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3691:17:0;;3669:39;;3719:154;3726:10;;3719:154;;3753:11;3763:1;3753:11;;:::i;:::-;;-1:-1:-1;3822:10:0;3830:2;3822:5;:10;:::i;:::-;3809:24;;:2;:24;:::i;:::-;3796:39;;3779:6;3786;3779:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3779:56:0;;;;;;;;-1:-1:-1;3850:11:0;3859:2;3850:11;;:::i;:::-;;;3719:154;;;3897:6;3189:723;-1:-1:-1;;;;3189:723:0:o;9769:231::-;9847:7;9868:17;9887:18;9909:27;9920:4;9926:9;9909:10;:27::i;:::-;9867:69;;;;9947:18;9959:5;9947:11;:18::i;:::-;-1:-1:-1;9983:9:0;9769:231;-1:-1:-1;;;9769:231:0:o;27097:204::-;27182:4;-1:-1:-1;;;;;;27206:47:0;;-1:-1:-1;;;27206:47:0;;:87;;-1:-1:-1;;;;;;;;;;24465:40:0;;;27257:36;24356:157;42702:258;42831:4;42862:5;-1:-1:-1;;;;;42851:16:0;:7;-1:-1:-1;;;;;42851:16:0;;:59;;;;42903:7;-1:-1:-1;;;;;42879:31:0;:20;42891:7;42879:11;:20::i;:::-;-1:-1:-1;;;;;42879:31:0;;42851:59;:103;;;;42922:32;42939:5;42946:7;42922:16;:32::i;49243:854::-;-1:-1:-1;;;;;49368:16:0;;;;:52;;;49396:24;49412:7;49396:15;:24::i;:::-;-1:-1:-1;;;;;49388:32:0;:4;-1:-1:-1;;;;;49388:32:0;;;49368:52;49364:86;;;49437:13;;-1:-1:-1;;;49437:13:0;;;;;;;;;;;49364:86;49563:35;49580:1;49584:7;49593:4;49563:8;:35::i;:::-;-1:-1:-1;;;;;49685:13:0;;;;;;;:9;:13;;;;;;;;:18;;49702:1;49685:18;;;;;;49712:15;;;;;;;;:20;;-1:-1:-1;;49712:20:0;;;49741:16;;;:7;:16;;;;;:21;;-1:-1:-1;;;;;;49741:21:0;;;;;;49895:12;;49856:11;;;;49880:27;;;;;:65;;-1:-1:-1;49943:1:0;49911:20;;;:7;:20;;;;;;-1:-1:-1;;;;;49911:20:0;:34;49880:65;49876:119;;;49958:20;;;;:7;:20;;;;;:27;;-1:-1:-1;;;;;;49958:27:0;-1:-1:-1;;;;;49958:27:0;;;;;49876:119;49607:395;50083:7;50079:2;-1:-1:-1;;;;;50064:27:0;50073:4;-1:-1:-1;;;;;50064:27:0;;;;;;;;;;;49243:854;;;:::o;28239:505::-;28328:22;28336:4;28342:7;28328;:22::i;:::-;28323:414;;28516:41;28544:7;-1:-1:-1;;;;;28516:41:0;28554:2;28516:19;:41::i;:::-;28630:38;28658:4;28665:2;28630:19;:38::i;:::-;28421:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;28421:270:0;;;;;;;;;;-1:-1:-1;;;28367:358:0;;;;;;;:::i;45600:147::-;45711:30;45717:2;45721:6;45729:5;45736:4;45711:5;:30::i;46711:558::-;46865:86;;-1:-1:-1;;;46865:86:0;;46848:4;;-1:-1:-1;;;;;46865:36:0;;;;;:86;;18686:10;;46924:4;;46930:7;;46939:5;;46865:86;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46865:86:0;;;;;;;;-1:-1:-1;;46865:86:0;;;;;;;;;;;;:::i;:::-;;;46861:403;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47093:13:0;;47089:168;;47131:19;;-1:-1:-1;;;47131:19:0;;;;;;;;;;;47089:168;47229:6;47223:13;47214:6;47210:2;47206:15;47199:38;46861:403;-1:-1:-1;;;;;;46992:51:0;-1:-1:-1;;;46992:51:0;;-1:-1:-1;46711:558:0;;;;;;:::o;7563:1404::-;7644:7;7653:12;7878:9;:16;7898:2;7878:22;7874:1086;;;8222:4;8207:20;;8201:27;8272:4;8257:20;;8251:27;8330:4;8315:20;;8309:27;7917:9;8301:36;8373:25;8384:4;8301:36;8201:27;8251;8373:10;:25::i;:::-;8366:32;;;;;;;;;7874:1086;8420:9;:16;8440:2;8420:22;8416:544;;;8743:4;8728:20;;8722:27;8794:4;8779:20;;8773:27;8836:23;8847:4;8722:27;8773;8836:10;:23::i;:::-;8829:30;;;;;;;;8416:544;-1:-1:-1;8908:1:0;;-1:-1:-1;8912:35:0;8892:56;;5834:643;5912:20;5903:5;:29;;;;;;;;:::i;:::-;;5899:571;;;5834:643;:::o;5899:571::-;6010:29;6001:5;:38;;;;;;;;:::i;:::-;;5997:473;;;6056:34;;-1:-1:-1;;;6056:34:0;;11170:2:1;6056:34:0;;;11152:21:1;11209:2;11189:18;;;11182:30;11248:26;11228:18;;;11221:54;11292:18;;6056:34:0;10968:348:1;5997:473:0;6121:35;6112:5;:44;;;;;;;;:::i;:::-;;6108:362;;;6173:41;;-1:-1:-1;;;6173:41:0;;11884:2:1;6173:41:0;;;11866:21:1;11923:2;11903:18;;;11896:30;11962:33;11942:18;;;11935:61;12013:18;;6173:41:0;11682:355:1;6108:362:0;6245:30;6236:5;:39;;;;;;;;:::i;:::-;;6232:238;;;6292:44;;-1:-1:-1;;;6292:44:0;;12651:2:1;6292:44:0;;;12633:21:1;12690:2;12670:18;;;12663:30;12729:34;12709:18;;;12702:62;-1:-1:-1;;;12780:18:1;;;12773:32;12822:19;;6292:44:0;12449:398:1;6232:238:0;6367:30;6358:5;:39;;;;;;;;:::i;:::-;;6354:116;;;6414:44;;-1:-1:-1;;;6414:44:0;;13054:2:1;6414:44:0;;;13036:21:1;13093:2;13073:18;;;13066:30;13132:34;13112:18;;;13105:62;-1:-1:-1;;;13183:18:1;;;13176:32;13225:19;;6414:44:0;12852:398:1;4490:451:0;4565:13;4591:19;4623:10;4627:6;4623:1;:10;:::i;:::-;:14;;4636:1;4623:14;:::i;:::-;4613:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4613:25:0;;4591:47;;-1:-1:-1;;;4649:6:0;4656:1;4649:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4649:15:0;;;;;;;;;-1:-1:-1;;;4675:6:0;4682:1;4675:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4675:15:0;;;;;;;;-1:-1:-1;4706:9:0;4718:10;4722:6;4718:1;:10;:::i;:::-;:14;;4731:1;4718:14;:::i;:::-;4706:26;;4701:135;4738:1;4734;:5;4701:135;;;-1:-1:-1;;;4786:5:0;4794:3;4786:11;4773:25;;;;;;;:::i;:::-;;;;4761:6;4768:1;4761:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;4761:37:0;;;;;;;;-1:-1:-1;4823:1:0;4813:11;;;;;4741:3;;;:::i;:::-;;;4701:135;;;-1:-1:-1;4854:10:0;;4846:55;;;;-1:-1:-1;;;4846:55:0;;11523:2:1;4846:55:0;;;11505:21:1;;;11542:18;;;11535:30;11601:34;11581:18;;;11574:62;11653:18;;4846:55:0;11321:356:1;43741:1194:0;43863:11;;;:31;;-1:-1:-1;;;;;;43878:16:0;;;43863:31;43860:56;;;43903:13;;-1:-1:-1;;;43903:13:0;;;;;;;;;;;43860:56;43923:20;43946:12;;43961:1;43946:16;;;;:::i;:::-;43923:39;;44066:12;:22;;;;;;-1:-1:-1;;;;;44097:13:0;;-1:-1:-1;44097:13:0;;;:9;:13;;;;;;;;:23;;;;;;44129:21;;;:7;:21;;;;;:26;;-1:-1:-1;;;;;;44129:26:0;;;;;;44258:12;44298:21;;;44458:9;:31;;;;;44488:1;44471:2;-1:-1:-1;;;;;44471:14:0;;:18;44458:31;44454:356;;;44551:233;44572:38;;44597:12;;-1:-1:-1;;;;;44572:38:0;;;44589:1;;44572:38;;44589:1;;44572:38;44628:61;44659:1;44663:2;44667:14;;;;;;44683:5;44628:22;:61::i;:::-;44623:115;;44711:27;;-1:-1:-1;;;44711:27:0;;;;;;;;;;;44623:115;44774:8;44758:12;:24;;44551:233;;44794:7;;;;;44454:356;44820:103;44839:40;;44864:14;;;;;-1:-1:-1;;;;;44839:40:0;;;44856:1;;44839:40;;44856:1;;44839:40;44913:8;44897:12;:24;;44820:103;;44047:883;;43853:1082;43741:1194;;;;:::o;11221:1632::-;11352:7;;12286:66;12273:79;;12269:163;;;-1:-1:-1;12385:1:0;;-1:-1:-1;12389:30:0;12369:51;;12269:163;12446:1;:7;;12451:2;12446:7;;:18;;;;;12457:1;:7;;12462:2;12457:7;;12446:18;12442:102;;;-1:-1:-1;12497:1:0;;-1:-1:-1;12501:30:0;12481:51;;12442:102;12658:24;;;12641:14;12658:24;;;;;;;;;10568:25:1;;;10641:4;10629:17;;10609:18;;;10602:45;;;;10663:18;;;10656:34;;;10706:18;;;10699:34;;;12658:24:0;;10540:19:1;;12658:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12658:24:0;;-1:-1:-1;;12658:24:0;;;-1:-1:-1;;;;;;;12697:20:0;;12693:103;;12750:1;12754:29;12734:50;;;;;;;12693:103;12816:6;-1:-1:-1;12824:20:0;;-1:-1:-1;11221:1632:0;;;;;;;;:::o;10263:344::-;10377:7;;-1:-1:-1;;;;;10423:80:0;;10377:7;10530:25;10546:3;10531:18;;;10553:2;10530:25;:::i;:::-;10514:42;;10574:25;10585:4;10591:1;10594;10597;10574:10;:25::i;:::-;10567:32;;;;;;10263:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;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:220;1035:5;1088:3;1081:4;1073:6;1069:17;1065:27;1055:55;;1106:1;1103;1096:12;1055:55;1128:79;1203:3;1194:6;1181:20;1174:4;1166:6;1162:17;1128:79;:::i;1218:186::-;1277:6;1330:2;1318:9;1309:7;1305:23;1301:32;1298:52;;;1346:1;1343;1336:12;1298:52;1369:29;1388:9;1369:29;:::i;1409:260::-;1477:6;1485;1538:2;1526:9;1517:7;1513:23;1509:32;1506:52;;;1554:1;1551;1544:12;1506:52;1577:29;1596:9;1577:29;:::i;:::-;1567:39;;1625:38;1659:2;1648:9;1644:18;1625:38;:::i;:::-;1615:48;;1409:260;;;;;:::o;1674:328::-;1751:6;1759;1767;1820:2;1808:9;1799:7;1795:23;1791:32;1788:52;;;1836:1;1833;1826:12;1788:52;1859:29;1878:9;1859:29;:::i;:::-;1849:39;;1907:38;1941:2;1930:9;1926:18;1907:38;:::i;:::-;1897:48;;1992:2;1981:9;1977:18;1964:32;1954:42;;1674:328;;;;;:::o;2007:537::-;2102:6;2110;2118;2126;2179:3;2167:9;2158:7;2154:23;2150:33;2147:53;;;2196:1;2193;2186:12;2147:53;2219:29;2238:9;2219:29;:::i;:::-;2209:39;;2267:38;2301:2;2290:9;2286:18;2267:38;:::i;:::-;2257:48;;2352:2;2341:9;2337:18;2324:32;2314:42;;2407:2;2396:9;2392:18;2379:32;2434:18;2426:6;2423:30;2420:50;;;2466:1;2463;2456:12;2420:50;2489:49;2530:7;2521:6;2510:9;2506:22;2489:49;:::i;:::-;2479:59;;;2007:537;;;;;;;:::o;2549:254::-;2614:6;2622;2675:2;2663:9;2654:7;2650:23;2646:32;2643:52;;;2691:1;2688;2681:12;2643:52;2714:29;2733:9;2714:29;:::i;:::-;2704:39;;2762:35;2793:2;2782:9;2778:18;2762:35;:::i;2808:254::-;2876:6;2884;2937:2;2925:9;2916:7;2912:23;2908:32;2905:52;;;2953:1;2950;2943:12;2905:52;2976:29;2995:9;2976:29;:::i;:::-;2966:39;3052:2;3037:18;;;;3024:32;;-1:-1:-1;;;2808:254:1:o;3067:248::-;3129:6;3137;3190:2;3178:9;3169:7;3165:23;3161:32;3158:52;;;3206:1;3203;3196:12;3158:52;3229:26;3245:9;3229:26;:::i;3320:180::-;3379:6;3432:2;3420:9;3411:7;3407:23;3403:32;3400:52;;;3448:1;3445;3438:12;3400:52;-1:-1:-1;3471:23:1;;3320:180;-1:-1:-1;3320:180:1:o;3505:254::-;3573:6;3581;3634:2;3622:9;3613:7;3609:23;3605:32;3602:52;;;3650:1;3647;3640:12;3602:52;3686:9;3673:23;3663:33;;3715:38;3749:2;3738:9;3734:18;3715:38;:::i;3764:245::-;3822:6;3875:2;3863:9;3854:7;3850:23;3846:32;3843:52;;;3891:1;3888;3881:12;3843:52;3930:9;3917:23;3949:30;3973:5;3949:30;:::i;4014:249::-;4083:6;4136:2;4124:9;4115:7;4111:23;4107:32;4104:52;;;4152:1;4149;4142:12;4104:52;4184:9;4178:16;4203:30;4227:5;4203:30;:::i;4268:450::-;4337:6;4390:2;4378:9;4369:7;4365:23;4361:32;4358:52;;;4406:1;4403;4396:12;4358:52;4446:9;4433:23;4479:18;4471:6;4468:30;4465:50;;;4511:1;4508;4501:12;4465:50;4534:22;;4587:4;4579:13;;4575:27;-1:-1:-1;4565:55:1;;4616:1;4613;4606:12;4565:55;4639:73;4704:7;4699:2;4686:16;4681:2;4677;4673:11;4639:73;:::i;4908:388::-;4985:6;4993;5046:2;5034:9;5025:7;5021:23;5017:32;5014:52;;;5062:1;5059;5052:12;5014:52;5098:9;5085:23;5075:33;;5159:2;5148:9;5144:18;5131:32;5186:18;5178:6;5175:30;5172:50;;;5218:1;5215;5208:12;5172:50;5241:49;5282:7;5273:6;5262:9;5258:22;5241:49;:::i;:::-;5231:59;;;4908:388;;;;;:::o;5301:248::-;5369:6;5377;5430:2;5418:9;5409:7;5405:23;5401:32;5398:52;;;5446:1;5443;5436:12;5398:52;-1:-1:-1;;5469:23:1;;;5539:2;5524:18;;;5511:32;;-1:-1:-1;5301:248:1:o;5554:257::-;5595:3;5633:5;5627:12;5660:6;5655:3;5648:19;5676:63;5732:6;5725:4;5720:3;5716:14;5709:4;5702:5;5698:16;5676:63;:::i;:::-;5793:2;5772:15;-1:-1:-1;;5768:29:1;5759:39;;;;5800:4;5755:50;;5554:257;-1:-1:-1;;5554:257:1:o;5816:185::-;5858:3;5896:5;5890:12;5911:52;5956:6;5951:3;5944:4;5937:5;5933:16;5911:52;:::i;:::-;5979:16;;;;;5816:185;-1:-1:-1;;5816:185:1:o;6124:1301::-;6401:3;6430:1;6463:6;6457:13;6493:3;6515:1;6543:9;6539:2;6535:18;6525:28;;6603:2;6592:9;6588:18;6625;6615:61;;6669:4;6661:6;6657:17;6647:27;;6615:61;6695:2;6743;6735:6;6732:14;6712:18;6709:38;6706:165;;;-1:-1:-1;;;6770:33:1;;6826:4;6823:1;6816:15;6856:4;6777:3;6844:17;6706:165;6887:18;6914:104;;;;7032:1;7027:320;;;;6880:467;;6914:104;-1:-1:-1;;6947:24:1;;6935:37;;6992:16;;;;-1:-1:-1;6914:104:1;;7027:320;14840:1;14833:14;;;14877:4;14864:18;;7122:1;7136:165;7150:6;7147:1;7144:13;7136:165;;;7228:14;;7215:11;;;7208:35;7271:16;;;;7165:10;;7136:165;;;7140:3;;7330:6;7325:3;7321:16;7314:23;;6880:467;;;;;;;7363:56;7388:30;7414:3;7406:6;7388:30;:::i;:::-;-1:-1:-1;;;6066:20:1;;6111:1;6102:11;;6006:113;7363:56;7356:63;6124:1301;-1:-1:-1;;;;;6124:1301:1:o;8196:786::-;8607:25;8602:3;8595:38;8577:3;8662:6;8656:13;8678:62;8733:6;8728:2;8723:3;8719:12;8712:4;8704:6;8700:17;8678:62;:::i;:::-;-1:-1:-1;;;8799:2:1;8759:16;;;8791:11;;;8784:40;8849:13;;8871:63;8849:13;8920:2;8912:11;;8905:4;8893:17;;8871:63;:::i;:::-;8954:17;8973:2;8950:26;;8196:786;-1:-1:-1;;;;8196:786:1:o;9195:488::-;-1:-1:-1;;;;;9464:15:1;;;9446:34;;9516:15;;9511:2;9496:18;;9489:43;9563:2;9548:18;;9541:34;;;9611:3;9606:2;9591:18;;9584:31;;;9389:4;;9632:45;;9657:19;;9649:6;9632:45;:::i;:::-;9624:53;9195:488;-1:-1:-1;;;;;;9195:488:1:o;10744:219::-;10893:2;10882:9;10875:21;10856:4;10913:44;10953:2;10942:9;10938:18;10930:6;10913:44;:::i;13616:355::-;13818:2;13800:21;;;13857:2;13837:18;;;13830:30;13896:33;13891:2;13876:18;;13869:61;13962:2;13947:18;;13616:355::o;14893:128::-;14933:3;14964:1;14960:6;14957:1;14954:13;14951:39;;;14970:18;;:::i;:::-;-1:-1:-1;15006:9:1;;14893:128::o;15026:120::-;15066:1;15092;15082:35;;15097:18;;:::i;:::-;-1:-1:-1;15131:9:1;;15026:120::o;15151:168::-;15191:7;15257:1;15253;15249:6;15245:14;15242:1;15239:21;15234:1;15227:9;15220:17;15216:45;15213:71;;;15264:18;;:::i;:::-;-1:-1:-1;15304:9:1;;15151:168::o;15324:125::-;15364:4;15392:1;15389;15386:8;15383:34;;;15397:18;;:::i;:::-;-1:-1:-1;15434:9:1;;15324:125::o;15454:258::-;15526:1;15536:113;15550:6;15547:1;15544:13;15536:113;;;15626:11;;;15620:18;15607:11;;;15600:39;15572:2;15565:10;15536:113;;;15667:6;15664:1;15661:13;15658:48;;;-1:-1:-1;;15702:1:1;15684:16;;15677:27;15454:258::o;15717:136::-;15756:3;15784:5;15774:39;;15793:18;;:::i;:::-;-1:-1:-1;;;15829:18:1;;15717:136::o;15858:380::-;15937:1;15933:12;;;;15980;;;16001:61;;16055:4;16047:6;16043:17;16033:27;;16001:61;16108:2;16100:6;16097:14;16077:18;16074:38;16071:161;;;16154:10;16149:3;16145:20;16142:1;16135:31;16189:4;16186:1;16179:15;16217:4;16214:1;16207:15;16071:161;;15858:380;;;:::o;16243:135::-;16282:3;-1:-1:-1;;16303:17:1;;16300:43;;;16323:18;;:::i;:::-;-1:-1:-1;16370:1:1;16359:13;;16243:135::o;16383:112::-;16415:1;16441;16431:35;;16446:18;;:::i;:::-;-1:-1:-1;16480:9:1;;16383:112::o;16500:127::-;16561:10;16556:3;16552:20;16549:1;16542:31;16592:4;16589:1;16582:15;16616:4;16613:1;16606:15;16632:127;16693:10;16688:3;16684:20;16681:1;16674:31;16724:4;16721:1;16714:15;16748:4;16745:1;16738:15;16764:127;16825:10;16820:3;16816:20;16813:1;16806:31;16856:4;16853:1;16846:15;16880:4;16877:1;16870:15;16896:127;16957:10;16952:3;16948:20;16945:1;16938:31;16988:4;16985:1;16978:15;17012:4;17009:1;17002:15;17028:127;17089:10;17084:3;17080:20;17077:1;17070:31;17120:4;17117:1;17110:15;17144:4;17141:1;17134:15;17160:131;-1:-1:-1;;;;;;17234:32:1;;17224:43;;17214:71;;17281:1;17278;17271:12

Swarm Source

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