ETH Price: $3,438.84 (+4.19%)

Token

NFTCheese (Cheese)
 

Overview

Max Total Supply

128 Cheese

Holders

62

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
omr.eth
0x88c9ada911e01f3a6879a8e6066d2da45ce8bf1b
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NFTCheese

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/Pausable.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/finance/PaymentSplitter.sol


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

pragma solidity ^0.8.0;




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

    uint256 private _totalShares;
    uint256 private _totalReleased;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/AccessControl.sol


// OpenZeppelin Contracts v4.4.1 (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.
     */
    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.
     */
    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`.
     */
    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.
     *
     * [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.
     */
    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.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/extensions/ERC1155Supply.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/extensions/ERC1155Burnable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}

// File: contracts/AbstractERC1155Factory.sol


pragma solidity ^0.8.0;






abstract contract AbstractERC1155Factory is Pausable, ERC1155Supply, ERC1155Burnable, AccessControl, PaymentSplitter {

    string name_;
    string symbol_;   

    function pause() external onlyRole(DEFAULT_ADMIN_ROLE) {
        _pause();
    }

    function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) {
        _unpause();
    }    

    function setURI(string memory baseURI) external onlyRole(DEFAULT_ADMIN_ROLE) {
        _setURI(baseURI);
    }    

    function name() public view returns (string memory) {
        return name_;
    }

    function symbol() public view returns (string memory) {
        return symbol_;
    }          

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override(ERC1155, ERC1155Supply) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC1155, AccessControl)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}
// File: contracts/NFTCheese.sol


pragma solidity ^0.8.0;

/*
* @title ERC1155 token for NFT Cheese
* @author Nazariy Dumanskyy, Lem Canady
*/


contract NFTCheese is AbstractERC1155Factory {

    uint256 public constant ARTWORK = 0;
    uint256 public _maxSupply = 333;
    uint256 public _reserved = 33;

    uint8 maxPerTx = 2;

    uint256 public whitelistWindowOpens = 1644523200;
    uint256 public publicWindowOpens    = 1644609600;

    uint256 public priceInc = 100000000000000000;
    uint256 public incrementNumber= 50;
    uint256 public startingPrice = 50000000000000000;

    mapping(address => bool) private whiteList; 
    mapping(address => uint256) public purchaseTxs;

    constructor(
        address[] memory _payees,
        uint256[] memory _shares,
        string memory _name,
        string memory _symbol,
        string memory _uri
        ) ERC1155(_uri) PaymentSplitter(_payees, _shares) {
        name_ = _name;
        symbol_ = _symbol;
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(DEFAULT_ADMIN_ROLE, 0x5DeD00BE946085E7a523803596706593DbF9959b);
        _mint(0x5DeD00BE946085E7a523803596706593DbF9959b, ARTWORK, 33, "");
    }

    /**
    * @notice retrieve price for multiple NFTs
    *
    * @param amount the amount of NFTs to get price for
    */
    function getPrice(uint256 amount) public  view returns (uint256){
        uint256 supply = totalSupply(ARTWORK) - _reserved;
        uint totalCost = 0;
        for (uint i = 0; i < amount; i++) {
            totalCost += getCurrentPriceAtPosition(supply + i);
        }
        return totalCost;
    }

    /**
    * @notice get price at position of the NFT token by ID
    *
    * @param position positiong to check the price at
    */
    function getCurrentPriceAtPosition(uint256 position) public  view returns (uint256){
        uint256 multiplier  = position/incrementNumber;
        uint256 priceIncrease = multiplier * priceInc;
        return priceIncrease + startingPrice;
    }

    /**
    * @notice purchase NFTs during whitelist mint
    *
    * @param amount the amount of cards to purchase
    */
    function whitelistMint(uint256 amount) external payable whenNotPaused {
        require(block.timestamp >= whitelistWindowOpens, "Early access: window closed");
        require(whiteList[msg.sender], "Sender not on the whitelist");
        require(purchaseTxs[msg.sender] + amount <= maxPerTx, "Wallet mint limit");

        mint(amount);
    }

    /**
    * @notice mint NFTs during public mint
    *
    * @param amount the amount of tokens to mint
    */
    function publicMint(uint256 amount) external payable whenNotPaused {
        require(block.timestamp >= publicWindowOpens, "Purchase: window closed");

        mint(amount);
    }

    /**
    * @notice global mint function used in early access and public sale
    *
    * @param amount the amount of tokens to mint
    */
    function mint(uint256 amount) private {
        require(amount > 0, "Need to request at least 1 NFT");
        require(totalSupply(ARTWORK) + amount <= _maxSupply, "Exceeds maximum supply");
        require(msg.value >= getPrice(amount), "Not enough ETH sent, check price");

        purchaseTxs[msg.sender] += amount;
        _mint(msg.sender, ARTWORK, amount, "");
    }

    /**
    * @notice edit windows
    *
    * @param _publicWindowOpens UNIX timestamp for purchasing public window time
    * @param _whitelistWindowOpens UNIX timestamp for purchasing whitelist window time
    */
    function editWindows(
        uint256 _publicWindowOpens,
        uint256 _whitelistWindowOpens
    ) external onlyRole(DEFAULT_ADMIN_ROLE) {
        require(
            _publicWindowOpens > _whitelistWindowOpens,
            "window combination not allowed"
        );
        publicWindowOpens = _publicWindowOpens;
        whitelistWindowOpens = _whitelistWindowOpens;
    }

    /**
    * @notice edit mint settings
    *
    * @param _priceInc how much the price increments
    * @param _incrementNumber per how many tokens to increase price
    * @param _startingPrice starting price of the token
    */
    function editMintSettings(
        uint256 _priceInc,
        uint256 _incrementNumber,
        uint256 _startingPrice
    ) external onlyRole(DEFAULT_ADMIN_ROLE) {
        priceInc = _priceInc;
        incrementNumber = _incrementNumber;
        startingPrice = _startingPrice;
    }

    /**
    * @notice adds addresses into a whitelist
    *
    * @param addresses an array of addresses to add to whitelist
    */
    function setWhiteList(address[] calldata addresses ) external onlyRole(DEFAULT_ADMIN_ROLE) {
        for (uint256 i = 0; i < addresses.length; i++) {
            whiteList[addresses[i]] = true;
        }
    }

    /**
    * @notice returns true or false depending on 
    */
    function isWhitelisted() external view  returns (bool) {
        return whiteList[msg.sender];
    }

    /**
    * @notice returns the metadata uri for a given id
    *
    * @param _id the NFT id to return metadata for
    */
    function uri(uint256 _id) public view override returns (string memory) {
        require(exists(_id), "URI: nonexistent token");

        return string(abi.encodePacked(super.uri(_id), Strings.toString(_id), ".json"));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"_payees","type":"address[]"},{"internalType":"uint256[]","name":"_shares","type":"uint256[]"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ARTWORK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceInc","type":"uint256"},{"internalType":"uint256","name":"_incrementNumber","type":"uint256"},{"internalType":"uint256","name":"_startingPrice","type":"uint256"}],"name":"editMintSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicWindowOpens","type":"uint256"},{"internalType":"uint256","name":"_whitelistWindowOpens","type":"uint256"}],"name":"editWindows","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"position","type":"uint256"}],"name":"getCurrentPriceAtPosition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"incrementNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceInc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicWindowOpens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"purchaseTxs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"baseURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistWindowOpens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405261014d600f5560216010556011805460ff191660021790556362056ec0601255636206c04060135567016345785d8a0000601455603260155566b1a2bc2ec500006016553480156200005557600080fd5b5060405162004a9738038062004a97833981016040819052620000789162000c7a565b6000805460ff19169055848482620000908162000263565b508051825114620001035760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620001565760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401620000fa565b60005b8251811015620001c257620001ad8382815181106200017c576200017c62000f2c565b602002602001015183838151811062000199576200019962000f2c565b60200260200101516200027c60201b60201c565b80620001b98162000ef8565b91505062000159565b50508351620001da9150600d90602086019062000a47565b508151620001f090600e90602085019062000a47565b50620001fe6000336200046a565b6200021f6000735ded00be946085e7a523803596706593dbf9959b6200046a565b62000258735ded00be946085e7a523803596706593dbf9959b60006021604051806020016040528060008152506200050e60201b60201c565b505050505062001004565b80516200027890600390602084019062000a47565b5050565b6001600160a01b038216620002e95760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b6064820152608401620000fa565b600081116200033b5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207368617265732061726520300000006044820152606401620000fa565b6001600160a01b03821660009081526008602052604090205415620003b75760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b6064820152608401620000fa565b600a8054600181019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b03841690811790915560009081526008602052604090208190556006546200042190829062000e3e565b600655604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b60008281526005602090815260408083206001600160a01b038516845290915290205460ff16620002785760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620004ca3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6001600160a01b038416620005705760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401620000fa565b336200059681600087620005848862000633565b6200058f8862000633565b8762000681565b60008481526001602090815260408083206001600160a01b038916845290915281208054859290620005ca90849062000e3e565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46200062c81600087878787620006a4565b5050505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811062000670576200067062000f2c565b602090810291909101015292915050565b6200069c8686868686866200088a60201b620016031760201c565b505050505050565b620006c3846001600160a01b031662000a3860201b620017861760201c565b156200069c5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190620006ff908990899088908890889060040162000dbc565b602060405180830381600087803b1580156200071a57600080fd5b505af19250505080156200074d575060408051601f3d908101601f191682019092526200074a9181019062000d5b565b60015b6200080e576200075c62000f58565b806308c379a014156200079d57506200077462000f75565b806200078157506200079f565b8060405162461bcd60e51b8152600401620000fa919062000e03565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401620000fa565b6001600160e01b0319811663f23a6e6160e01b14620008815760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b6064820152608401620000fa565b50505050505050565b620008a58686868686866200069c60201b6200177e1760201c565b6001600160a01b038516620009395760005b83518110156200093757828181518110620008d657620008d662000f2c565b602002602001015160046000868481518110620008f757620008f762000f2c565b6020026020010151815260200190815260200160002060008282546200091e919062000e3e565b909155506200092f90508162000ef8565b9050620008b7565b505b6001600160a01b0384166200069c5760005b8351811015620008815760008482815181106200096c576200096c62000f2c565b6020026020010151905060008483815181106200098d576200098d62000f2c565b602002602001015190506000600460008481526020019081526020016000205490508181101562000a125760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401620000fa565b6000928352600460205260409092209103905562000a308162000ef8565b90506200094b565b6001600160a01b03163b151590565b82805462000a559062000e8c565b90600052602060002090601f01602090048101928262000a79576000855562000ac4565b82601f1062000a9457805160ff191683800117855562000ac4565b8280016001018555821562000ac4579182015b8281111562000ac457825182559160200191906001019062000aa7565b5062000ad292915062000ad6565b5090565b5b8082111562000ad2576000815560010162000ad7565b600082601f83011262000aff57600080fd5b8151602062000b0e8262000e18565b60405162000b1d828262000ec9565b8381528281019150858301600585901b8701840188101562000b3e57600080fd5b6000805b8681101562000b755782516001600160a01b038116811462000b62578283fd5b8552938501939185019160010162000b42565b509198975050505050505050565b600082601f83011262000b9557600080fd5b8151602062000ba48262000e18565b60405162000bb3828262000ec9565b8381528281019150858301600585901b8701840188101562000bd457600080fd5b60005b8581101562000bf55781518452928401929084019060010162000bd7565b5090979650505050505050565b600082601f83011262000c1457600080fd5b81516001600160401b0381111562000c305762000c3062000f42565b60405162000c49601f8301601f19166020018262000ec9565b81815284602083860101111562000c5f57600080fd5b62000c7282602083016020870162000e59565b949350505050565b600080600080600060a0868803121562000c9357600080fd5b85516001600160401b038082111562000cab57600080fd5b62000cb989838a0162000aed565b9650602088015191508082111562000cd057600080fd5b62000cde89838a0162000b83565b9550604088015191508082111562000cf557600080fd5b62000d0389838a0162000c02565b9450606088015191508082111562000d1a57600080fd5b62000d2889838a0162000c02565b9350608088015191508082111562000d3f57600080fd5b5062000d4e8882890162000c02565b9150509295509295909350565b60006020828403121562000d6e57600080fd5b81516001600160e01b03198116811462000d8757600080fd5b9392505050565b6000815180845262000da881602086016020860162000e59565b601f01601f19169290920160200192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009062000df89083018462000d8e565b979650505050505050565b60208152600062000d87602083018462000d8e565b60006001600160401b0382111562000e345762000e3462000f42565b5060051b60200190565b6000821982111562000e545762000e5462000f16565b500190565b60005b8381101562000e7657818101518382015260200162000e5c565b8381111562000e86576000848401525b50505050565b600181811c9082168062000ea157607f821691505b6020821081141562000ec357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b038111828210171562000ef15762000ef162000f42565b6040525050565b600060001982141562000f0f5762000f0f62000f16565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d111562000f725760046000803e5060005160e01c5b90565b600060443d101562000f845790565b6040516003193d81016004833e81513d6001600160401b03808311602484018310171562000fb457505050505090565b828501915081518181111562000fcd5750505050505090565b843d870101602082850101111562000fe85750505050505090565b62000ff96020828601018762000ec9565b509095945050505050565b613a8380620010146000396000f3fe6080604052600436106102cc5760003560e01c80637b1a4b0e11610175578063c2868de2116100dc578063e33b7de311610095578063f242432a1161006f578063f242432a1461091e578063f5298aca1461093e578063f86850301461095e578063ff0c58f51461098b57600080fd5b8063e33b7de3146108a0578063e7572230146108b5578063e985e9c5146108d557600080fd5b8063c2868de2146107de578063ce7c2ac2146107fe578063d016c55414610746578063d547741f14610834578063d6fbf20214610854578063d79779b21461086a57600080fd5b80639852595c1161012e5780639852595c14610710578063a217fddf14610746578063a22cb4651461075b578063a6068afa1461077b578063baaefe5b1461079b578063bd85b039146107b157600080fd5b80637b1a4b0e146106655780638456cb591461067b578063868ff4a2146106905780638b83209b146106a357806391d14854146106db57806395d89b41146106fb57600080fd5b806336568abe116102345780634f558e79116101ed578063611b4095116101c7578063611b4095146105ea5780636aaa571d1461060f5780636b20c45414610625578063775b9c131461064557600080fd5b80634f558e791461058d5780635c975abb146105bc5780635cae715e146105d457600080fd5b806336568abe146104b05780633a98ef39146104d05780633f4ba83a146104e5578063406072a9146104fa57806348b75044146105405780634e1273f41461056057600080fd5b806322f4596f1161028657806322f4596f14610401578063248a9ca314610417578063273ea3e3146104475780632db115441461045d5780632eb2c2d6146104705780632f2ff15d1461049057600080fd5b8062fdd58e1461031a57806301ffc9a71461034d57806302fe53051461037d57806306fdde031461039f5780630e89341c146103c157806319165587146103e157600080fd5b36610315577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561032657600080fd5b5061033a610335366004613001565b6109ab565b6040519081526020015b60405180910390f35b34801561035957600080fd5b5061036d610368366004613203565b610a44565b6040519015158152602001610344565b34801561038957600080fd5b5061039d61039836600461323d565b610a55565b005b3480156103ab57600080fd5b506103b4610a6d565b60405161034491906134fc565b3480156103cd57600080fd5b506103b46103dc3660046131c5565b610aff565b3480156103ed57600080fd5b5061039d6103fc366004612df3565b610b8f565b34801561040d57600080fd5b5061033a600f5481565b34801561042357600080fd5b5061033a6104323660046131c5565b60009081526005602052604090206001015490565b34801561045357600080fd5b5061033a60155481565b61039d61046b3660046131c5565b610cbd565b34801561047c57600080fd5b5061039d61048b366004612e49565b610d3e565b34801561049c57600080fd5b5061039d6104ab3660046131de565b610dd5565b3480156104bc57600080fd5b5061039d6104cb3660046131de565b610dff565b3480156104dc57600080fd5b5060065461033a565b3480156104f157600080fd5b5061039d610e79565b34801561050657600080fd5b5061033a610515366004612e10565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b34801561054c57600080fd5b5061039d61055b366004612e10565b610e8c565b34801561056c57600080fd5b5061058061057b3660046130d6565b611074565b60405161034491906134bb565b34801561059957600080fd5b5061036d6105a83660046131c5565b600090815260046020526040902054151590565b3480156105c857600080fd5b5060005460ff1661036d565b3480156105e057600080fd5b5061033a60125481565b3480156105f657600080fd5b503360009081526017602052604090205460ff1661036d565b34801561061b57600080fd5b5061033a60105481565b34801561063157600080fd5b5061039d610640366004612f5e565b61119d565b34801561065157600080fd5b5061039d610660366004613062565b6111e0565b34801561067157600080fd5b5061033a60135481565b34801561068757600080fd5b5061039d611263565b61039d61069e3660046131c5565b611276565b3480156106af57600080fd5b506106c36106be3660046131c5565b6113b0565b6040516001600160a01b039091168152602001610344565b3480156106e757600080fd5b5061036d6106f63660046131de565b6113e0565b34801561070757600080fd5b506103b461140b565b34801561071c57600080fd5b5061033a61072b366004612df3565b6001600160a01b031660009081526009602052604090205490565b34801561075257600080fd5b5061033a600081565b34801561076757600080fd5b5061039d610776366004612fd3565b61141a565b34801561078757600080fd5b5061033a6107963660046131c5565b611425565b3480156107a757600080fd5b5061033a60145481565b3480156107bd57600080fd5b5061033a6107cc3660046131c5565b60009081526004602052604090205490565b3480156107ea57600080fd5b5061039d6107f93660046132c0565b611460565b34801561080a57600080fd5b5061033a610819366004612df3565b6001600160a01b031660009081526008602052604090205490565b34801561084057600080fd5b5061039d61084f3660046131de565b61147a565b34801561086057600080fd5b5061033a60165481565b34801561087657600080fd5b5061033a610885366004612df3565b6001600160a01b03166000908152600b602052604090205490565b3480156108ac57600080fd5b5060075461033a565b3480156108c157600080fd5b5061033a6108d03660046131c5565b61149f565b3480156108e157600080fd5b5061036d6108f0366004612e10565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b34801561092a57600080fd5b5061039d610939366004612ef6565b611515565b34801561094a57600080fd5b5061039d61095936600461302d565b61155a565b34801561096a57600080fd5b5061033a610979366004612df3565b60186020526000908152604090205481565b34801561099757600080fd5b5061039d6109a636600461329e565b61159d565b60006001600160a01b038316610a1c5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b6000610a4f82611795565b92915050565b6000610a60816117ba565b610a69826117c4565b5050565b6060600d8054610a7c90613881565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa890613881565b8015610af55780601f10610aca57610100808354040283529160200191610af5565b820191906000526020600020905b815481529060010190602001808311610ad857829003601f168201915b5050505050905090565b600081815260046020526040902054606090610b565760405162461bcd60e51b81526020600482015260166024820152752aa9249d103737b732bc34b9ba32b73a103a37b5b2b760511b6044820152606401610a13565b610b5f826117d7565b610b688361186b565b604051602001610b7992919061336f565b6040516020818303038152906040529050919050565b6001600160a01b038116600090815260086020526040902054610bc45760405162461bcd60e51b8152600401610a13906135e4565b6000610bcf60075490565b610bd990476137dc565b90506000610c068383610c01866001600160a01b031660009081526009602052604090205490565b611968565b905080610c255760405162461bcd60e51b8152600401610a139061362a565b6001600160a01b03831660009081526009602052604081208054839290610c4d9084906137dc565b925050819055508060076000828254610c6691906137dc565b90915550610c76905083826119b0565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b60005460ff1615610ce05760405162461bcd60e51b8152600401610a1390613675565b601354421015610d325760405162461bcd60e51b815260206004820152601760248201527f50757263686173653a2077696e646f7720636c6f7365640000000000000000006044820152606401610a13565b610d3b81611ac9565b50565b6001600160a01b038516331480610d5a5750610d5a85336108f0565b610dc15760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610a13565b610dce8585858585611c33565b5050505050565b600082815260056020526040902060010154610df0816117ba565b610dfa8383611dd8565b505050565b6001600160a01b0381163314610e6f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610a13565b610a698282611e5e565b6000610e84816117ba565b610d3b611ec5565b6001600160a01b038116600090815260086020526040902054610ec15760405162461bcd60e51b8152600401610a13906135e4565b6001600160a01b0382166000908152600b60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b158015610f1957600080fd5b505afa158015610f2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f519190613285565b610f5b91906137dc565b90506000610f948383610c0187876001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b905080610fb35760405162461bcd60e51b8152600401610a139061362a565b6001600160a01b038085166000908152600c6020908152604080832093871683529290529081208054839290610fea9084906137dc565b90915550506001600160a01b0384166000908152600b6020526040812080548392906110179084906137dc565b909155506110289050848483611f58565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b606081518351146110d95760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610a13565b600083516001600160401b038111156110f4576110f4613959565b60405190808252806020026020018201604052801561111d578160200160208202803683370190505b50905060005b84518110156111955761116885828151811061114157611141613943565b602002602001015185838151811061115b5761115b613943565b60200260200101516109ab565b82828151811061117a5761117a613943565b602090810291909101015261118e816138e8565b9050611123565b509392505050565b6001600160a01b0383163314806111b957506111b983336108f0565b6111d55760405162461bcd60e51b8152600401610a139061359b565b610dfa838383611faa565b60006111eb816117ba565b60005b8281101561125d5760016017600086868581811061120e5761120e613943565b90506020020160208101906112239190612df3565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611255816138e8565b9150506111ee565b50505050565b600061126e816117ba565b610d3b61213b565b60005460ff16156112995760405162461bcd60e51b8152600401610a1390613675565b6012544210156112eb5760405162461bcd60e51b815260206004820152601b60248201527f4561726c79206163636573733a2077696e646f7720636c6f73656400000000006044820152606401610a13565b3360009081526017602052604090205460ff1661134a5760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206e6f74206f6e207468652077686974656c69737400000000006044820152606401610a13565b6011543360009081526018602052604090205460ff9091169061136e9083906137dc565b1115610d325760405162461bcd60e51b815260206004820152601160248201527015d85b1b195d081b5a5b9d081b1a5b5a5d607a1b6044820152606401610a13565b6000600a82815481106113c5576113c5613943565b6000918252602090912001546001600160a01b031692915050565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600e8054610a7c90613881565b610a69338383612193565b6000806015548361143691906137f4565b90506000601454826114489190613808565b90506016548161145891906137dc565b949350505050565b600061146b816117ba565b50601492909255601555601655565b600082815260056020526040902060010154611495816117ba565b610dfa8383611e5e565b601054600080805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec54909182916114dc9190613827565b90506000805b84811015611195576114f761079682856137dc565b61150190836137dc565b91508061150d816138e8565b9150506114e2565b6001600160a01b038516331480611531575061153185336108f0565b61154d5760405162461bcd60e51b8152600401610a139061359b565b610dce8585858585612274565b6001600160a01b038316331480611576575061157683336108f0565b6115925760405162461bcd60e51b8152600401610a139061359b565b610dfa83838361239b565b60006115a8816117ba565b8183116115f75760405162461bcd60e51b815260206004820152601e60248201527f77696e646f7720636f6d62696e6174696f6e206e6f7420616c6c6f77656400006044820152606401610a13565b50601391909155601255565b6001600160a01b03851661168a5760005b83518110156116885782818151811061162f5761162f613943565b60200260200101516004600086848151811061164d5761164d613943565b60200260200101518152602001908152602001600020600082825461167291906137dc565b909155506116819050816138e8565b9050611614565b505b6001600160a01b03841661177e5760005b835181101561177c5760008482815181106116b8576116b8613943565b6020026020010151905060008483815181106116d6576116d6613943565b60200260200101519050600060046000848152602001908152602001600020549050818110156117595760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610a13565b60009283526004602052604090922091039055611775816138e8565b905061169b565b505b505050505050565b6001600160a01b03163b151590565b60006001600160e01b03198216637965db0b60e01b1480610a4f5750610a4f826124a0565b610d3b81336124f0565b8051610a69906003906020840190612c66565b6060600380546117e690613881565b80601f016020809104026020016040519081016040528092919081815260200182805461181290613881565b801561185f5780601f106118345761010080835404028352916020019161185f565b820191906000526020600020905b81548152906001019060200180831161184257829003601f168201915b50505050509050919050565b60608161188f5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118b957806118a3816138e8565b91506118b29050600a836137f4565b9150611893565b6000816001600160401b038111156118d3576118d3613959565b6040519080825280601f01601f1916602001820160405280156118fd576020820181803683370190505b5090505b841561145857611912600183613827565b915061191f600a86613903565b61192a9060306137dc565b60f81b81838151811061193f5761193f613943565b60200101906001600160f81b031916908160001a905350611961600a866137f4565b9450611901565b6006546001600160a01b038416600090815260086020526040812054909183916119929086613808565b61199c91906137f4565b6119a69190613827565b90505b9392505050565b80471015611a005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a13565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611a4d576040519150601f19603f3d011682016040523d82523d6000602084013e611a52565b606091505b5050905080610dfa5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a13565b60008111611b195760405162461bcd60e51b815260206004820152601e60248201527f4e65656420746f2072657175657374206174206c656173742031204e465400006044820152606401610a13565b600f546000805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec54611b529083906137dc565b1115611b995760405162461bcd60e51b815260206004820152601660248201527545786365656473206d6178696d756d20737570706c7960501b6044820152606401610a13565b611ba28161149f565b341015611bf15760405162461bcd60e51b815260206004820181905260248201527f4e6f7420656e6f756768204554482073656e742c20636865636b2070726963656044820152606401610a13565b3360009081526018602052604081208054839290611c109084906137dc565b92505081905550610d3b3360008360405180602001604052806000815250612554565b8151835114611c545760405162461bcd60e51b8152600401610a1390613771565b6001600160a01b038416611c7a5760405162461bcd60e51b8152600401610a139061369f565b33611c89818787878787612657565b60005b8451811015611d72576000858281518110611ca957611ca9613943565b602002602001015190506000858381518110611cc757611cc7613943565b60209081029190910181015160008481526001835260408082206001600160a01b038e168352909352919091205490915081811015611d185760405162461bcd60e51b8152600401610a1390613727565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611d579084906137dc565b9250508190555050505080611d6b906138e8565b9050611c8c565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611dc29291906134ce565b60405180910390a461177e818787878787612665565b611de282826113e0565b610a695760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611e1a3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611e6882826113e0565b15610a695760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60005460ff16611f0e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a13565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610dfa9084906127d0565b6001600160a01b038316611fd05760405162461bcd60e51b8152600401610a13906136e4565b8051825114611ff15760405162461bcd60e51b8152600401610a1390613771565b600033905061201481856000868660405180602001604052806000815250612657565b60005b83518110156120dc57600084828151811061203457612034613943565b60200260200101519050600084838151811061205257612052613943565b60209081029190910181015160008481526001835260408082206001600160a01b038c1683529093529190912054909150818110156120a35760405162461bcd60e51b8152600401610a1390613557565b60009283526001602090815260408085206001600160a01b038b16865290915290922091039055806120d4816138e8565b915050612017565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161212d9291906134ce565b60405180910390a450505050565b60005460ff161561215e5760405162461bcd60e51b8152600401610a1390613675565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f3b3390565b816001600160a01b0316836001600160a01b031614156122075760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610a13565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661229a5760405162461bcd60e51b8152600401610a139061369f565b336122b98187876122aa886128a2565b6122b3886128a2565b87612657565b60008481526001602090815260408083206001600160a01b038a168452909152902054838110156122fc5760405162461bcd60e51b8152600401610a1390613727565b60008581526001602090815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061233b9084906137dc565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461177c8288888888886128ed565b6001600160a01b0383166123c15760405162461bcd60e51b8152600401610a13906136e4565b336123f0818560006123d2876128a2565b6123db876128a2565b60405180602001604052806000815250612657565b60008381526001602090815260408083206001600160a01b0388168452909152902054828110156124335760405162461bcd60e51b8152600401610a1390613557565b60008481526001602090815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b60006001600160e01b03198216636cdb3d1360e11b14806124d157506001600160e01b031982166303a24d0760e21b145b80610a4f57506301ffc9a760e01b6001600160e01b0319831614610a4f565b6124fa82826113e0565b610a6957612512816001600160a01b031660146129b7565b61251d8360206129b7565b60405160200161252e9291906133ae565b60408051601f198184030181529082905262461bcd60e51b8252610a13916004016134fc565b6001600160a01b0384166125b45760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610a13565b336125c5816000876122aa886128a2565b60008481526001602090815260408083206001600160a01b0389168452909152812080548592906125f79084906137dc565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610dce816000878787876128ed565b61177e868686868686611603565b6001600160a01b0384163b1561177e5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906126a99089908990889088908890600401613423565b602060405180830381600087803b1580156126c357600080fd5b505af19250505080156126f3575060408051601f3d908101601f191682019092526126f091810190613220565b60015b6127a0576126ff61396f565b806308c379a01415612739575061271461398b565b8061271f575061273b565b8060405162461bcd60e51b8152600401610a1391906134fc565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610a13565b6001600160e01b0319811663bc197c8160e01b1461177c5760405162461bcd60e51b8152600401610a139061350f565b6000612825826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612b529092919063ffffffff16565b805190915015610dfa578080602001905181019061284391906131a8565b610dfa5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a13565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106128dc576128dc613943565b602090810291909101015292915050565b6001600160a01b0384163b1561177e5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906129319089908990889088908890600401613481565b602060405180830381600087803b15801561294b57600080fd5b505af192505050801561297b575060408051601f3d908101601f1916820190925261297891810190613220565b60015b612987576126ff61396f565b6001600160e01b0319811663f23a6e6160e01b1461177c5760405162461bcd60e51b8152600401610a139061350f565b606060006129c6836002613808565b6129d19060026137dc565b6001600160401b038111156129e8576129e8613959565b6040519080825280601f01601f191660200182016040528015612a12576020820181803683370190505b509050600360fc1b81600081518110612a2d57612a2d613943565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612a5c57612a5c613943565b60200101906001600160f81b031916908160001a9053506000612a80846002613808565b612a8b9060016137dc565b90505b6001811115612b03576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612abf57612abf613943565b1a60f81b828281518110612ad557612ad5613943565b60200101906001600160f81b031916908160001a90535060049490941c93612afc8161386a565b9050612a8e565b5083156119a95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a13565b60606119a68484600085856001600160a01b0385163b612bb45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a13565b600080866001600160a01b03168587604051612bd09190613353565b60006040518083038185875af1925050503d8060008114612c0d576040519150601f19603f3d011682016040523d82523d6000602084013e612c12565b606091505b5091509150612c22828286612c2d565b979650505050505050565b60608315612c3c5750816119a9565b825115612c4c5782518084602001fd5b8160405162461bcd60e51b8152600401610a1391906134fc565b828054612c7290613881565b90600052602060002090601f016020900481019282612c945760008555612cda565b82601f10612cad57805160ff1916838001178555612cda565b82800160010185558215612cda579182015b82811115612cda578251825591602001919060010190612cbf565b50612ce6929150612cea565b5090565b5b80821115612ce65760008155600101612ceb565b60006001600160401b03831115612d1857612d18613959565b604051612d2f601f8501601f1916602001826138bc565b809150838152848484011115612d4457600080fd5b83836020830137600060208583010152509392505050565b600082601f830112612d6d57600080fd5b81356020612d7a826137b9565b604051612d8782826138bc565b8381528281019150858301600585901b87018401881015612da757600080fd5b60005b85811015612dc657813584529284019290840190600101612daa565b5090979650505050505050565b600082601f830112612de457600080fd5b6119a983833560208501612cff565b600060208284031215612e0557600080fd5b81356119a981613a14565b60008060408385031215612e2357600080fd5b8235612e2e81613a14565b91506020830135612e3e81613a14565b809150509250929050565b600080600080600060a08688031215612e6157600080fd5b8535612e6c81613a14565b94506020860135612e7c81613a14565b935060408601356001600160401b0380821115612e9857600080fd5b612ea489838a01612d5c565b94506060880135915080821115612eba57600080fd5b612ec689838a01612d5c565b93506080880135915080821115612edc57600080fd5b50612ee988828901612dd3565b9150509295509295909350565b600080600080600060a08688031215612f0e57600080fd5b8535612f1981613a14565b94506020860135612f2981613a14565b9350604086013592506060860135915060808601356001600160401b03811115612f5257600080fd5b612ee988828901612dd3565b600080600060608486031215612f7357600080fd5b8335612f7e81613a14565b925060208401356001600160401b0380821115612f9a57600080fd5b612fa687838801612d5c565b93506040860135915080821115612fbc57600080fd5b50612fc986828701612d5c565b9150509250925092565b60008060408385031215612fe657600080fd5b8235612ff181613a14565b91506020830135612e3e81613a29565b6000806040838503121561301457600080fd5b823561301f81613a14565b946020939093013593505050565b60008060006060848603121561304257600080fd5b833561304d81613a14565b95602085013595506040909401359392505050565b6000806020838503121561307557600080fd5b82356001600160401b038082111561308c57600080fd5b818501915085601f8301126130a057600080fd5b8135818111156130af57600080fd5b8660208260051b85010111156130c457600080fd5b60209290920196919550909350505050565b600080604083850312156130e957600080fd5b82356001600160401b038082111561310057600080fd5b818501915085601f83011261311457600080fd5b81356020613121826137b9565b60405161312e82826138bc565b8381528281019150858301600585901b870184018b101561314e57600080fd5b600096505b8487101561317a57803561316681613a14565b835260019690960195918301918301613153565b509650508601359250508082111561319157600080fd5b5061319e85828601612d5c565b9150509250929050565b6000602082840312156131ba57600080fd5b81516119a981613a29565b6000602082840312156131d757600080fd5b5035919050565b600080604083850312156131f157600080fd5b823591506020830135612e3e81613a14565b60006020828403121561321557600080fd5b81356119a981613a37565b60006020828403121561323257600080fd5b81516119a981613a37565b60006020828403121561324f57600080fd5b81356001600160401b0381111561326557600080fd5b8201601f8101841361327657600080fd5b61145884823560208401612cff565b60006020828403121561329757600080fd5b5051919050565b600080604083850312156132b157600080fd5b50508035926020909101359150565b6000806000606084860312156132d557600080fd5b505081359360208301359350604090920135919050565b600081518084526020808501945080840160005b8381101561331c57815187529582019590820190600101613300565b509495945050505050565b6000815180845261333f81602086016020860161383e565b601f01601f19169290920160200192915050565b6000825161336581846020870161383e565b9190910192915050565b6000835161338181846020880161383e565b83519083019061339581836020880161383e565b64173539b7b760d91b9101908152600501949350505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516133e681601785016020880161383e565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161341781602884016020880161383e565b01602801949350505050565b6001600160a01b0386811682528516602082015260a06040820181905260009061344f908301866132ec565b828103606084015261346181866132ec565b905082810360808401526134758185613327565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612c2290830184613327565b6020815260006119a960208301846132ec565b6040815260006134e160408301856132ec565b82810360208401526134f381856132ec565b95945050505050565b6020815260006119a96020830184613327565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60006001600160401b038211156137d2576137d2613959565b5060051b60200190565b600082198211156137ef576137ef613917565b500190565b6000826138035761380361392d565b500490565b600081600019048311821515161561382257613822613917565b500290565b60008282101561383957613839613917565b500390565b60005b83811015613859578181015183820152602001613841565b8381111561125d5750506000910152565b60008161387957613879613917565b506000190190565b600181811c9082168061389557607f821691505b602082108114156138b657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b03811182821017156138e1576138e1613959565b6040525050565b60006000198214156138fc576138fc613917565b5060010190565b6000826139125761391261392d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156139885760046000803e5060005160e01c5b90565b600060443d10156139995790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156139c857505050505090565b82850191508151818111156139e05750505050505090565b843d87010160208285010111156139fa5750505050505090565b613a09602082860101876138bc565b509095945050505050565b6001600160a01b0381168114610d3b57600080fd5b8015158114610d3b57600080fd5b6001600160e01b031981168114610d3b57600080fdfea2646970667358221220322cf1e12fc4613d5b6be99d2da7163e6d3d01e08e1af01097d9a4bbfc44238d64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000091b2a8f20e6452c49185596ef24c2c50359d03570000000000000000000000005ded00be946085e7a523803596706593dbf9959b00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000094e46544368656573650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000643686565736500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d57367778723679346e76395675534677726a4d656d756362714c554d4a6345634e6b436844656d69365866472f00000000000000000000

Deployed Bytecode

0x6080604052600436106102cc5760003560e01c80637b1a4b0e11610175578063c2868de2116100dc578063e33b7de311610095578063f242432a1161006f578063f242432a1461091e578063f5298aca1461093e578063f86850301461095e578063ff0c58f51461098b57600080fd5b8063e33b7de3146108a0578063e7572230146108b5578063e985e9c5146108d557600080fd5b8063c2868de2146107de578063ce7c2ac2146107fe578063d016c55414610746578063d547741f14610834578063d6fbf20214610854578063d79779b21461086a57600080fd5b80639852595c1161012e5780639852595c14610710578063a217fddf14610746578063a22cb4651461075b578063a6068afa1461077b578063baaefe5b1461079b578063bd85b039146107b157600080fd5b80637b1a4b0e146106655780638456cb591461067b578063868ff4a2146106905780638b83209b146106a357806391d14854146106db57806395d89b41146106fb57600080fd5b806336568abe116102345780634f558e79116101ed578063611b4095116101c7578063611b4095146105ea5780636aaa571d1461060f5780636b20c45414610625578063775b9c131461064557600080fd5b80634f558e791461058d5780635c975abb146105bc5780635cae715e146105d457600080fd5b806336568abe146104b05780633a98ef39146104d05780633f4ba83a146104e5578063406072a9146104fa57806348b75044146105405780634e1273f41461056057600080fd5b806322f4596f1161028657806322f4596f14610401578063248a9ca314610417578063273ea3e3146104475780632db115441461045d5780632eb2c2d6146104705780632f2ff15d1461049057600080fd5b8062fdd58e1461031a57806301ffc9a71461034d57806302fe53051461037d57806306fdde031461039f5780630e89341c146103c157806319165587146103e157600080fd5b36610315577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561032657600080fd5b5061033a610335366004613001565b6109ab565b6040519081526020015b60405180910390f35b34801561035957600080fd5b5061036d610368366004613203565b610a44565b6040519015158152602001610344565b34801561038957600080fd5b5061039d61039836600461323d565b610a55565b005b3480156103ab57600080fd5b506103b4610a6d565b60405161034491906134fc565b3480156103cd57600080fd5b506103b46103dc3660046131c5565b610aff565b3480156103ed57600080fd5b5061039d6103fc366004612df3565b610b8f565b34801561040d57600080fd5b5061033a600f5481565b34801561042357600080fd5b5061033a6104323660046131c5565b60009081526005602052604090206001015490565b34801561045357600080fd5b5061033a60155481565b61039d61046b3660046131c5565b610cbd565b34801561047c57600080fd5b5061039d61048b366004612e49565b610d3e565b34801561049c57600080fd5b5061039d6104ab3660046131de565b610dd5565b3480156104bc57600080fd5b5061039d6104cb3660046131de565b610dff565b3480156104dc57600080fd5b5060065461033a565b3480156104f157600080fd5b5061039d610e79565b34801561050657600080fd5b5061033a610515366004612e10565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b34801561054c57600080fd5b5061039d61055b366004612e10565b610e8c565b34801561056c57600080fd5b5061058061057b3660046130d6565b611074565b60405161034491906134bb565b34801561059957600080fd5b5061036d6105a83660046131c5565b600090815260046020526040902054151590565b3480156105c857600080fd5b5060005460ff1661036d565b3480156105e057600080fd5b5061033a60125481565b3480156105f657600080fd5b503360009081526017602052604090205460ff1661036d565b34801561061b57600080fd5b5061033a60105481565b34801561063157600080fd5b5061039d610640366004612f5e565b61119d565b34801561065157600080fd5b5061039d610660366004613062565b6111e0565b34801561067157600080fd5b5061033a60135481565b34801561068757600080fd5b5061039d611263565b61039d61069e3660046131c5565b611276565b3480156106af57600080fd5b506106c36106be3660046131c5565b6113b0565b6040516001600160a01b039091168152602001610344565b3480156106e757600080fd5b5061036d6106f63660046131de565b6113e0565b34801561070757600080fd5b506103b461140b565b34801561071c57600080fd5b5061033a61072b366004612df3565b6001600160a01b031660009081526009602052604090205490565b34801561075257600080fd5b5061033a600081565b34801561076757600080fd5b5061039d610776366004612fd3565b61141a565b34801561078757600080fd5b5061033a6107963660046131c5565b611425565b3480156107a757600080fd5b5061033a60145481565b3480156107bd57600080fd5b5061033a6107cc3660046131c5565b60009081526004602052604090205490565b3480156107ea57600080fd5b5061039d6107f93660046132c0565b611460565b34801561080a57600080fd5b5061033a610819366004612df3565b6001600160a01b031660009081526008602052604090205490565b34801561084057600080fd5b5061039d61084f3660046131de565b61147a565b34801561086057600080fd5b5061033a60165481565b34801561087657600080fd5b5061033a610885366004612df3565b6001600160a01b03166000908152600b602052604090205490565b3480156108ac57600080fd5b5060075461033a565b3480156108c157600080fd5b5061033a6108d03660046131c5565b61149f565b3480156108e157600080fd5b5061036d6108f0366004612e10565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b34801561092a57600080fd5b5061039d610939366004612ef6565b611515565b34801561094a57600080fd5b5061039d61095936600461302d565b61155a565b34801561096a57600080fd5b5061033a610979366004612df3565b60186020526000908152604090205481565b34801561099757600080fd5b5061039d6109a636600461329e565b61159d565b60006001600160a01b038316610a1c5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b6000610a4f82611795565b92915050565b6000610a60816117ba565b610a69826117c4565b5050565b6060600d8054610a7c90613881565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa890613881565b8015610af55780601f10610aca57610100808354040283529160200191610af5565b820191906000526020600020905b815481529060010190602001808311610ad857829003601f168201915b5050505050905090565b600081815260046020526040902054606090610b565760405162461bcd60e51b81526020600482015260166024820152752aa9249d103737b732bc34b9ba32b73a103a37b5b2b760511b6044820152606401610a13565b610b5f826117d7565b610b688361186b565b604051602001610b7992919061336f565b6040516020818303038152906040529050919050565b6001600160a01b038116600090815260086020526040902054610bc45760405162461bcd60e51b8152600401610a13906135e4565b6000610bcf60075490565b610bd990476137dc565b90506000610c068383610c01866001600160a01b031660009081526009602052604090205490565b611968565b905080610c255760405162461bcd60e51b8152600401610a139061362a565b6001600160a01b03831660009081526009602052604081208054839290610c4d9084906137dc565b925050819055508060076000828254610c6691906137dc565b90915550610c76905083826119b0565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b60005460ff1615610ce05760405162461bcd60e51b8152600401610a1390613675565b601354421015610d325760405162461bcd60e51b815260206004820152601760248201527f50757263686173653a2077696e646f7720636c6f7365640000000000000000006044820152606401610a13565b610d3b81611ac9565b50565b6001600160a01b038516331480610d5a5750610d5a85336108f0565b610dc15760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610a13565b610dce8585858585611c33565b5050505050565b600082815260056020526040902060010154610df0816117ba565b610dfa8383611dd8565b505050565b6001600160a01b0381163314610e6f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610a13565b610a698282611e5e565b6000610e84816117ba565b610d3b611ec5565b6001600160a01b038116600090815260086020526040902054610ec15760405162461bcd60e51b8152600401610a13906135e4565b6001600160a01b0382166000908152600b60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b158015610f1957600080fd5b505afa158015610f2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f519190613285565b610f5b91906137dc565b90506000610f948383610c0187876001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b905080610fb35760405162461bcd60e51b8152600401610a139061362a565b6001600160a01b038085166000908152600c6020908152604080832093871683529290529081208054839290610fea9084906137dc565b90915550506001600160a01b0384166000908152600b6020526040812080548392906110179084906137dc565b909155506110289050848483611f58565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b606081518351146110d95760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610a13565b600083516001600160401b038111156110f4576110f4613959565b60405190808252806020026020018201604052801561111d578160200160208202803683370190505b50905060005b84518110156111955761116885828151811061114157611141613943565b602002602001015185838151811061115b5761115b613943565b60200260200101516109ab565b82828151811061117a5761117a613943565b602090810291909101015261118e816138e8565b9050611123565b509392505050565b6001600160a01b0383163314806111b957506111b983336108f0565b6111d55760405162461bcd60e51b8152600401610a139061359b565b610dfa838383611faa565b60006111eb816117ba565b60005b8281101561125d5760016017600086868581811061120e5761120e613943565b90506020020160208101906112239190612df3565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611255816138e8565b9150506111ee565b50505050565b600061126e816117ba565b610d3b61213b565b60005460ff16156112995760405162461bcd60e51b8152600401610a1390613675565b6012544210156112eb5760405162461bcd60e51b815260206004820152601b60248201527f4561726c79206163636573733a2077696e646f7720636c6f73656400000000006044820152606401610a13565b3360009081526017602052604090205460ff1661134a5760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206e6f74206f6e207468652077686974656c69737400000000006044820152606401610a13565b6011543360009081526018602052604090205460ff9091169061136e9083906137dc565b1115610d325760405162461bcd60e51b815260206004820152601160248201527015d85b1b195d081b5a5b9d081b1a5b5a5d607a1b6044820152606401610a13565b6000600a82815481106113c5576113c5613943565b6000918252602090912001546001600160a01b031692915050565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600e8054610a7c90613881565b610a69338383612193565b6000806015548361143691906137f4565b90506000601454826114489190613808565b90506016548161145891906137dc565b949350505050565b600061146b816117ba565b50601492909255601555601655565b600082815260056020526040902060010154611495816117ba565b610dfa8383611e5e565b601054600080805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec54909182916114dc9190613827565b90506000805b84811015611195576114f761079682856137dc565b61150190836137dc565b91508061150d816138e8565b9150506114e2565b6001600160a01b038516331480611531575061153185336108f0565b61154d5760405162461bcd60e51b8152600401610a139061359b565b610dce8585858585612274565b6001600160a01b038316331480611576575061157683336108f0565b6115925760405162461bcd60e51b8152600401610a139061359b565b610dfa83838361239b565b60006115a8816117ba565b8183116115f75760405162461bcd60e51b815260206004820152601e60248201527f77696e646f7720636f6d62696e6174696f6e206e6f7420616c6c6f77656400006044820152606401610a13565b50601391909155601255565b6001600160a01b03851661168a5760005b83518110156116885782818151811061162f5761162f613943565b60200260200101516004600086848151811061164d5761164d613943565b60200260200101518152602001908152602001600020600082825461167291906137dc565b909155506116819050816138e8565b9050611614565b505b6001600160a01b03841661177e5760005b835181101561177c5760008482815181106116b8576116b8613943565b6020026020010151905060008483815181106116d6576116d6613943565b60200260200101519050600060046000848152602001908152602001600020549050818110156117595760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610a13565b60009283526004602052604090922091039055611775816138e8565b905061169b565b505b505050505050565b6001600160a01b03163b151590565b60006001600160e01b03198216637965db0b60e01b1480610a4f5750610a4f826124a0565b610d3b81336124f0565b8051610a69906003906020840190612c66565b6060600380546117e690613881565b80601f016020809104026020016040519081016040528092919081815260200182805461181290613881565b801561185f5780601f106118345761010080835404028352916020019161185f565b820191906000526020600020905b81548152906001019060200180831161184257829003601f168201915b50505050509050919050565b60608161188f5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118b957806118a3816138e8565b91506118b29050600a836137f4565b9150611893565b6000816001600160401b038111156118d3576118d3613959565b6040519080825280601f01601f1916602001820160405280156118fd576020820181803683370190505b5090505b841561145857611912600183613827565b915061191f600a86613903565b61192a9060306137dc565b60f81b81838151811061193f5761193f613943565b60200101906001600160f81b031916908160001a905350611961600a866137f4565b9450611901565b6006546001600160a01b038416600090815260086020526040812054909183916119929086613808565b61199c91906137f4565b6119a69190613827565b90505b9392505050565b80471015611a005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a13565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611a4d576040519150601f19603f3d011682016040523d82523d6000602084013e611a52565b606091505b5050905080610dfa5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a13565b60008111611b195760405162461bcd60e51b815260206004820152601e60248201527f4e65656420746f2072657175657374206174206c656173742031204e465400006044820152606401610a13565b600f546000805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec54611b529083906137dc565b1115611b995760405162461bcd60e51b815260206004820152601660248201527545786365656473206d6178696d756d20737570706c7960501b6044820152606401610a13565b611ba28161149f565b341015611bf15760405162461bcd60e51b815260206004820181905260248201527f4e6f7420656e6f756768204554482073656e742c20636865636b2070726963656044820152606401610a13565b3360009081526018602052604081208054839290611c109084906137dc565b92505081905550610d3b3360008360405180602001604052806000815250612554565b8151835114611c545760405162461bcd60e51b8152600401610a1390613771565b6001600160a01b038416611c7a5760405162461bcd60e51b8152600401610a139061369f565b33611c89818787878787612657565b60005b8451811015611d72576000858281518110611ca957611ca9613943565b602002602001015190506000858381518110611cc757611cc7613943565b60209081029190910181015160008481526001835260408082206001600160a01b038e168352909352919091205490915081811015611d185760405162461bcd60e51b8152600401610a1390613727565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611d579084906137dc565b9250508190555050505080611d6b906138e8565b9050611c8c565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611dc29291906134ce565b60405180910390a461177e818787878787612665565b611de282826113e0565b610a695760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611e1a3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611e6882826113e0565b15610a695760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60005460ff16611f0e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a13565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610dfa9084906127d0565b6001600160a01b038316611fd05760405162461bcd60e51b8152600401610a13906136e4565b8051825114611ff15760405162461bcd60e51b8152600401610a1390613771565b600033905061201481856000868660405180602001604052806000815250612657565b60005b83518110156120dc57600084828151811061203457612034613943565b60200260200101519050600084838151811061205257612052613943565b60209081029190910181015160008481526001835260408082206001600160a01b038c1683529093529190912054909150818110156120a35760405162461bcd60e51b8152600401610a1390613557565b60009283526001602090815260408085206001600160a01b038b16865290915290922091039055806120d4816138e8565b915050612017565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161212d9291906134ce565b60405180910390a450505050565b60005460ff161561215e5760405162461bcd60e51b8152600401610a1390613675565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f3b3390565b816001600160a01b0316836001600160a01b031614156122075760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610a13565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661229a5760405162461bcd60e51b8152600401610a139061369f565b336122b98187876122aa886128a2565b6122b3886128a2565b87612657565b60008481526001602090815260408083206001600160a01b038a168452909152902054838110156122fc5760405162461bcd60e51b8152600401610a1390613727565b60008581526001602090815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061233b9084906137dc565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461177c8288888888886128ed565b6001600160a01b0383166123c15760405162461bcd60e51b8152600401610a13906136e4565b336123f0818560006123d2876128a2565b6123db876128a2565b60405180602001604052806000815250612657565b60008381526001602090815260408083206001600160a01b0388168452909152902054828110156124335760405162461bcd60e51b8152600401610a1390613557565b60008481526001602090815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b60006001600160e01b03198216636cdb3d1360e11b14806124d157506001600160e01b031982166303a24d0760e21b145b80610a4f57506301ffc9a760e01b6001600160e01b0319831614610a4f565b6124fa82826113e0565b610a6957612512816001600160a01b031660146129b7565b61251d8360206129b7565b60405160200161252e9291906133ae565b60408051601f198184030181529082905262461bcd60e51b8252610a13916004016134fc565b6001600160a01b0384166125b45760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610a13565b336125c5816000876122aa886128a2565b60008481526001602090815260408083206001600160a01b0389168452909152812080548592906125f79084906137dc565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610dce816000878787876128ed565b61177e868686868686611603565b6001600160a01b0384163b1561177e5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906126a99089908990889088908890600401613423565b602060405180830381600087803b1580156126c357600080fd5b505af19250505080156126f3575060408051601f3d908101601f191682019092526126f091810190613220565b60015b6127a0576126ff61396f565b806308c379a01415612739575061271461398b565b8061271f575061273b565b8060405162461bcd60e51b8152600401610a1391906134fc565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610a13565b6001600160e01b0319811663bc197c8160e01b1461177c5760405162461bcd60e51b8152600401610a139061350f565b6000612825826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612b529092919063ffffffff16565b805190915015610dfa578080602001905181019061284391906131a8565b610dfa5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a13565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106128dc576128dc613943565b602090810291909101015292915050565b6001600160a01b0384163b1561177e5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906129319089908990889088908890600401613481565b602060405180830381600087803b15801561294b57600080fd5b505af192505050801561297b575060408051601f3d908101601f1916820190925261297891810190613220565b60015b612987576126ff61396f565b6001600160e01b0319811663f23a6e6160e01b1461177c5760405162461bcd60e51b8152600401610a139061350f565b606060006129c6836002613808565b6129d19060026137dc565b6001600160401b038111156129e8576129e8613959565b6040519080825280601f01601f191660200182016040528015612a12576020820181803683370190505b509050600360fc1b81600081518110612a2d57612a2d613943565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612a5c57612a5c613943565b60200101906001600160f81b031916908160001a9053506000612a80846002613808565b612a8b9060016137dc565b90505b6001811115612b03576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612abf57612abf613943565b1a60f81b828281518110612ad557612ad5613943565b60200101906001600160f81b031916908160001a90535060049490941c93612afc8161386a565b9050612a8e565b5083156119a95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a13565b60606119a68484600085856001600160a01b0385163b612bb45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a13565b600080866001600160a01b03168587604051612bd09190613353565b60006040518083038185875af1925050503d8060008114612c0d576040519150601f19603f3d011682016040523d82523d6000602084013e612c12565b606091505b5091509150612c22828286612c2d565b979650505050505050565b60608315612c3c5750816119a9565b825115612c4c5782518084602001fd5b8160405162461bcd60e51b8152600401610a1391906134fc565b828054612c7290613881565b90600052602060002090601f016020900481019282612c945760008555612cda565b82601f10612cad57805160ff1916838001178555612cda565b82800160010185558215612cda579182015b82811115612cda578251825591602001919060010190612cbf565b50612ce6929150612cea565b5090565b5b80821115612ce65760008155600101612ceb565b60006001600160401b03831115612d1857612d18613959565b604051612d2f601f8501601f1916602001826138bc565b809150838152848484011115612d4457600080fd5b83836020830137600060208583010152509392505050565b600082601f830112612d6d57600080fd5b81356020612d7a826137b9565b604051612d8782826138bc565b8381528281019150858301600585901b87018401881015612da757600080fd5b60005b85811015612dc657813584529284019290840190600101612daa565b5090979650505050505050565b600082601f830112612de457600080fd5b6119a983833560208501612cff565b600060208284031215612e0557600080fd5b81356119a981613a14565b60008060408385031215612e2357600080fd5b8235612e2e81613a14565b91506020830135612e3e81613a14565b809150509250929050565b600080600080600060a08688031215612e6157600080fd5b8535612e6c81613a14565b94506020860135612e7c81613a14565b935060408601356001600160401b0380821115612e9857600080fd5b612ea489838a01612d5c565b94506060880135915080821115612eba57600080fd5b612ec689838a01612d5c565b93506080880135915080821115612edc57600080fd5b50612ee988828901612dd3565b9150509295509295909350565b600080600080600060a08688031215612f0e57600080fd5b8535612f1981613a14565b94506020860135612f2981613a14565b9350604086013592506060860135915060808601356001600160401b03811115612f5257600080fd5b612ee988828901612dd3565b600080600060608486031215612f7357600080fd5b8335612f7e81613a14565b925060208401356001600160401b0380821115612f9a57600080fd5b612fa687838801612d5c565b93506040860135915080821115612fbc57600080fd5b50612fc986828701612d5c565b9150509250925092565b60008060408385031215612fe657600080fd5b8235612ff181613a14565b91506020830135612e3e81613a29565b6000806040838503121561301457600080fd5b823561301f81613a14565b946020939093013593505050565b60008060006060848603121561304257600080fd5b833561304d81613a14565b95602085013595506040909401359392505050565b6000806020838503121561307557600080fd5b82356001600160401b038082111561308c57600080fd5b818501915085601f8301126130a057600080fd5b8135818111156130af57600080fd5b8660208260051b85010111156130c457600080fd5b60209290920196919550909350505050565b600080604083850312156130e957600080fd5b82356001600160401b038082111561310057600080fd5b818501915085601f83011261311457600080fd5b81356020613121826137b9565b60405161312e82826138bc565b8381528281019150858301600585901b870184018b101561314e57600080fd5b600096505b8487101561317a57803561316681613a14565b835260019690960195918301918301613153565b509650508601359250508082111561319157600080fd5b5061319e85828601612d5c565b9150509250929050565b6000602082840312156131ba57600080fd5b81516119a981613a29565b6000602082840312156131d757600080fd5b5035919050565b600080604083850312156131f157600080fd5b823591506020830135612e3e81613a14565b60006020828403121561321557600080fd5b81356119a981613a37565b60006020828403121561323257600080fd5b81516119a981613a37565b60006020828403121561324f57600080fd5b81356001600160401b0381111561326557600080fd5b8201601f8101841361327657600080fd5b61145884823560208401612cff565b60006020828403121561329757600080fd5b5051919050565b600080604083850312156132b157600080fd5b50508035926020909101359150565b6000806000606084860312156132d557600080fd5b505081359360208301359350604090920135919050565b600081518084526020808501945080840160005b8381101561331c57815187529582019590820190600101613300565b509495945050505050565b6000815180845261333f81602086016020860161383e565b601f01601f19169290920160200192915050565b6000825161336581846020870161383e565b9190910192915050565b6000835161338181846020880161383e565b83519083019061339581836020880161383e565b64173539b7b760d91b9101908152600501949350505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516133e681601785016020880161383e565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161341781602884016020880161383e565b01602801949350505050565b6001600160a01b0386811682528516602082015260a06040820181905260009061344f908301866132ec565b828103606084015261346181866132ec565b905082810360808401526134758185613327565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612c2290830184613327565b6020815260006119a960208301846132ec565b6040815260006134e160408301856132ec565b82810360208401526134f381856132ec565b95945050505050565b6020815260006119a96020830184613327565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60006001600160401b038211156137d2576137d2613959565b5060051b60200190565b600082198211156137ef576137ef613917565b500190565b6000826138035761380361392d565b500490565b600081600019048311821515161561382257613822613917565b500290565b60008282101561383957613839613917565b500390565b60005b83811015613859578181015183820152602001613841565b8381111561125d5750506000910152565b60008161387957613879613917565b506000190190565b600181811c9082168061389557607f821691505b602082108114156138b657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b03811182821017156138e1576138e1613959565b6040525050565b60006000198214156138fc576138fc613917565b5060010190565b6000826139125761391261392d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156139885760046000803e5060005160e01c5b90565b600060443d10156139995790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156139c857505050505090565b82850191508151818111156139e05750505050505090565b843d87010160208285010111156139fa5750505050505090565b613a09602082860101876138bc565b509095945050505050565b6001600160a01b0381168114610d3b57600080fd5b8015158114610d3b57600080fd5b6001600160e01b031981168114610d3b57600080fdfea2646970667358221220322cf1e12fc4613d5b6be99d2da7163e6d3d01e08e1af01097d9a4bbfc44238d64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000091b2a8f20e6452c49185596ef24c2c50359d03570000000000000000000000005ded00be946085e7a523803596706593dbf9959b00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000094e46544368656573650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000643686565736500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d57367778723679346e76395675534677726a4d656d756362714c554d4a6345634e6b436844656d69365866472f00000000000000000000

-----Decoded View---------------
Arg [0] : _payees (address[]): 0x91b2a8f20e6452C49185596Ef24c2c50359d0357,0x5DeD00BE946085E7a523803596706593DbF9959b
Arg [1] : _shares (uint256[]): 5,95
Arg [2] : _name (string): NFTCheese
Arg [3] : _symbol (string): Cheese
Arg [4] : _uri (string): ipfs://QmW6wxr6y4nv9VuSFwrjMemucbqLUMJcEcNkChDemi6XfG/

-----Encoded View---------------
18 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 00000000000000000000000091b2a8f20e6452c49185596ef24c2c50359d0357
Arg [7] : 0000000000000000000000005ded00be946085e7a523803596706593dbf9959b
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [10] : 000000000000000000000000000000000000000000000000000000000000005f
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [12] : 4e46544368656573650000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [14] : 4368656573650000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [16] : 697066733a2f2f516d57367778723679346e76395675534677726a4d656d7563
Arg [17] : 62714c554d4a6345634e6b436844656d69365866472f00000000000000000000


Deployed Bytecode Sourcemap

69795:5307:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27389:40;9000:10;27389:40;;;-1:-1:-1;;;;;14280:32:1;;;14262:51;;27419:9:0;14344:2:1;14329:18;;14322:34;14235:18;27389:40:0;;;;;;;69795:5307;;;;;51511:231;;;;;;;;;;-1:-1:-1;51511:231:0;;;;;:::i;:::-;;:::i;:::-;;;17116:25:1;;;17104:2;17089:18;51511:231:0;;;;;;;;69423:210;;;;;;;;;;-1:-1:-1;69423:210:0;;;;;:::i;:::-;;:::i;:::-;;;16943:14:1;;16936:22;16918:41;;16906:2;16891:18;69423:210:0;16778:187:1;68758:112:0;;;;;;;;;;-1:-1:-1;68758:112:0;;;;;:::i;:::-;;:::i;:::-;;68882:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;74871:228::-;;;;;;;;;;-1:-1:-1;74871:228:0;;;;;:::i;:::-;;:::i;29175:566::-;;;;;;;;;;-1:-1:-1;29175:566:0;;;;;:::i;:::-;;:::i;69891:31::-;;;;;;;;;;;;;;;;38251:131;;;;;;;;;;-1:-1:-1;38251:131:0;;;;;:::i;:::-;38325:7;38352:12;;;:6;:12;;;;;:22;;;;38251:131;70157:34;;;;;;;;;;;;;;;;72323:183;;;;;;:::i;:::-;;:::i;53450:442::-;;;;;;;;;;-1:-1:-1;53450:442:0;;;;;:::i;:::-;;:::i;38644:147::-;;;;;;;;;;-1:-1:-1;38644:147:0;;;;;:::i;:::-;;:::i;39692:218::-;;;;;;;;;;-1:-1:-1;39692:218:0;;;;;:::i;:::-;;:::i;27520:91::-;;;;;;;;;;-1:-1:-1;27591:12:0;;27520:91;;68660:86;;;;;;;;;;;;;:::i;28649:135::-;;;;;;;;;;-1:-1:-1;28649:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;28746:21:0;;;28719:7;28746:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;28649:135;30009:641;;;;;;;;;;-1:-1:-1;30009:641:0;;;;;:::i;:::-;;:::i;51908:524::-;;;;;;;;;;-1:-1:-1;51908:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66003:122::-;;;;;;;;;;-1:-1:-1;66003:122:0;;;;;:::i;:::-;66060:4;65881:16;;;:12;:16;;;;;;-1:-1:-1;;;66003:122:0;10319:86;;;;;;;;;;-1:-1:-1;10366:4:0;10390:7;;;10319:86;;69994:48;;;;;;;;;;;;;;;;74630:102;;;;;;;;;;-1:-1:-1;74713:10:0;74679:4;74703:21;;;:9;:21;;;;;;;;74630:102;;69929:29;;;;;;;;;;;;;;;;67951:353;;;;;;;;;;-1:-1:-1;67951:353:0;;;;;:::i;:::-;;:::i;74341:213::-;;;;;;;;;;-1:-1:-1;74341:213:0;;;;;:::i;:::-;;:::i;70049:48::-;;;;;;;;;;;;;;;;68570:82;;;;;;;;;;;;;:::i;71847:350::-;;;;;;:::i;:::-;;:::i;28875:100::-;;;;;;;;;;-1:-1:-1;28875:100:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;14036:32:1;;;14018:51;;14006:2;13991:18;28875:100:0;13872:203:1;36711:147:0;;;;;;;;;;-1:-1:-1;36711:147:0;;;;;:::i;:::-;;:::i;68973:87::-;;;;;;;;;;;;;:::i;28371:109::-;;;;;;;;;;-1:-1:-1;28371:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;28454:18:0;28427:7;28454:18;;;:9;:18;;;;;;;28371:109;35816:49;;;;;;;;;;-1:-1:-1;35816:49:0;35861:4;35816:49;;52505:155;;;;;;;;;;-1:-1:-1;52505:155:0;;;;;:::i;:::-;;:::i;71460:251::-;;;;;;;;;;-1:-1:-1;71460:251:0;;;;;:::i;:::-;;:::i;70106:44::-;;;;;;;;;;;;;;;;65792:113;;;;;;;;;;-1:-1:-1;65792:113:0;;;;;:::i;:::-;65854:7;65881:16;;;:12;:16;;;;;;;65792:113;73904:292;;;;;;;;;;-1:-1:-1;73904:292:0;;;;;:::i;:::-;;:::i;28167:105::-;;;;;;;;;;-1:-1:-1;28167:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;28248:16:0;28221:7;28248:16;;;:7;:16;;;;;;;28167:105;39036:149;;;;;;;;;;-1:-1:-1;39036:149:0;;;;;:::i;:::-;;:::i;70198:48::-;;;;;;;;;;;;;;;;27957:119;;;;;;;;;;-1:-1:-1;27957:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;28042:26:0;28015:7;28042:26;;;:19;:26;;;;;;;27957:119;27705:95;;;;;;;;;;-1:-1:-1;27778:14:0;;27705:95;;71004:309;;;;;;;;;;-1:-1:-1;71004:309:0;;;;;:::i;:::-;;:::i;52732:168::-;;;;;;;;;;-1:-1:-1;52732:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;52855:27:0;;;52831:4;52855:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;52732:168;52972:401;;;;;;;;;;-1:-1:-1;52972:401:0;;;;;:::i;:::-;;:::i;67622:321::-;;;;;;;;;;-1:-1:-1;67622:321:0;;;;;:::i;:::-;;:::i;70305:46::-;;;;;;;;;;-1:-1:-1;70305:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;73270:388;;;;;;;;;;-1:-1:-1;73270:388:0;;;;;:::i;:::-;;:::i;51511:231::-;51597:7;-1:-1:-1;;;;;51625:21:0;;51617:77;;;;-1:-1:-1;;;51617:77:0;;19118:2:1;51617:77:0;;;19100:21:1;19157:2;19137:18;;;19130:30;19196:34;19176:18;;;19169:62;-1:-1:-1;;;19247:18:1;;;19240:41;19298:19;;51617:77:0;;;;;;;;;-1:-1:-1;51712:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;51712:22:0;;;;;;;;;;;;51511:231::o;69423:210::-;69560:4;69589:36;69613:11;69589:23;:36::i;:::-;69582:43;69423:210;-1:-1:-1;;69423:210:0:o;68758:112::-;35861:4;36307:16;35861:4;36307:10;:16::i;:::-;68846::::1;68854:7;68846;:16::i;:::-;68758:112:::0;;:::o;68882:83::-;68919:13;68952:5;68945:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68882:83;:::o;74871:228::-;66060:4;65881:16;;;:12;:16;;;;;;74927:13;;74953:46;;;;-1:-1:-1;;;74953:46:0;;26155:2:1;74953:46:0;;;26137:21:1;26194:2;26174:18;;;26167:30;-1:-1:-1;;;26213:18:1;;;26206:52;26275:18;;74953:46:0;25953:346:1;74953:46:0;75043:14;75053:3;75043:9;:14::i;:::-;75059:21;75076:3;75059:16;:21::i;:::-;75026:64;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75012:79;;74871:228;;;:::o;29175:566::-;-1:-1:-1;;;;;29251:16:0;;29270:1;29251:16;;;:7;:16;;;;;;29243:71;;;;-1:-1:-1;;;29243:71:0;;;;;;;:::i;:::-;29327:21;29375:15;27778:14;;;27705:95;29375:15;29351:39;;:21;:39;:::i;:::-;29327:63;;29401:15;29419:58;29435:7;29444:13;29459:17;29468:7;-1:-1:-1;;;;;28454:18:0;28427:7;28454:18;;;:9;:18;;;;;;;28371:109;29459:17;29419:15;:58::i;:::-;29401:76;-1:-1:-1;29498:12:0;29490:68;;;;-1:-1:-1;;;29490:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29571:18:0;;;;;;:9;:18;;;;;:29;;29593:7;;29571:18;:29;;29593:7;;29571:29;:::i;:::-;;;;;;;;29629:7;29611:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;29649:35:0;;-1:-1:-1;29667:7:0;29676;29649:17;:35::i;:::-;29700:33;;;-1:-1:-1;;;;;14280:32:1;;14262:51;;14344:2;14329:18;;14322:34;;;29700:33:0;;14235:18:1;29700:33:0;;;;;;;29232:509;;29175:566;:::o;72323:183::-;10366:4;10390:7;;;10644:9;10636:38;;;;-1:-1:-1;;;10636:38:0;;;;;;;:::i;:::-;72428:17:::1;;72409:15;:36;;72401:72;;;::::0;-1:-1:-1;;;72401:72:0;;22702:2:1;72401:72:0::1;::::0;::::1;22684:21:1::0;22741:2;22721:18;;;22714:30;22780:25;22760:18;;;22753:53;22823:18;;72401:72:0::1;22500:347:1::0;72401:72:0::1;72486:12;72491:6;72486:4;:12::i;:::-;72323:183:::0;:::o;53450:442::-;-1:-1:-1;;;;;53683:20:0;;9000:10;53683:20;;:60;;-1:-1:-1;53707:36:0;53724:4;9000:10;52732:168;:::i;53707:36::-;53661:160;;;;-1:-1:-1;;;53661:160:0;;23805:2:1;53661:160:0;;;23787:21:1;23844:2;23824:18;;;23817:30;23883:34;23863:18;;;23856:62;-1:-1:-1;;;23934:18:1;;;23927:48;23992:19;;53661:160:0;23603:414:1;53661:160:0;53832:52;53855:4;53861:2;53865:3;53870:7;53879:4;53832:22;:52::i;:::-;53450:442;;;;;:::o;38644:147::-;38325:7;38352:12;;;:6;:12;;;;;:22;;;36307:16;36318:4;36307:10;:16::i;:::-;38758:25:::1;38769:4;38775:7;38758:10;:25::i;:::-;38644:147:::0;;;:::o;39692:218::-;-1:-1:-1;;;;;39788:23:0;;9000:10;39788:23;39780:83;;;;-1:-1:-1;;;39780:83:0;;30341:2:1;39780:83:0;;;30323:21:1;30380:2;30360:18;;;30353:30;30419:34;30399:18;;;30392:62;-1:-1:-1;;;30470:18:1;;;30463:45;30525:19;;39780:83:0;30139:411:1;39780:83:0;39876:26;39888:4;39894:7;39876:11;:26::i;68660:86::-;35861:4;36307:16;35861:4;36307:10;:16::i;:::-;68728:10:::1;:8;:10::i;30009:641::-:0;-1:-1:-1;;;;;30091:16:0;;30110:1;30091:16;;;:7;:16;;;;;;30083:71;;;;-1:-1:-1;;;30083:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28042:26:0;;30167:21;28042:26;;;:19;:26;;;;;;30191:30;;-1:-1:-1;;;30191:30:0;;30215:4;30191:30;;;14018:51:1;-1:-1:-1;;;;;30191:15:0;;;;;13991:18:1;;30191:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;30167:77;;30255:15;30273:65;30289:7;30298:13;30313:24;30322:5;30329:7;-1:-1:-1;;;;;28746:21:0;;;28719:7;28746:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;28649:135;30273:65;30255:83;-1:-1:-1;30359:12:0;30351:68;;;;-1:-1:-1;;;30351:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30432:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;30466:7;;30432:21;:41;;30466:7;;30432:41;:::i;:::-;;;;-1:-1:-1;;;;;;;30484:26:0;;;;;;:19;:26;;;;;:37;;30514:7;;30484:26;:37;;30514:7;;30484:37;:::i;:::-;;;;-1:-1:-1;30534:47:0;;-1:-1:-1;30557:5:0;30564:7;30573;30534:22;:47::i;:::-;30597:45;;;-1:-1:-1;;;;;14280:32:1;;;14262:51;;14344:2;14329:18;;14322:34;;;30597:45:0;;;;;14235:18:1;30597:45:0;;;;;;;30072:578;;30009:641;;:::o;51908:524::-;52064:16;52125:3;:10;52106:8;:15;:29;52098:83;;;;-1:-1:-1;;;52098:83:0;;28400:2:1;52098:83:0;;;28382:21:1;28439:2;28419:18;;;28412:30;28478:34;28458:18;;;28451:62;-1:-1:-1;;;28529:18:1;;;28522:39;28578:19;;52098:83:0;28198:405:1;52098:83:0;52194:30;52241:8;:15;-1:-1:-1;;;;;52227:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52227:30:0;;52194:63;;52275:9;52270:122;52294:8;:15;52290:1;:19;52270:122;;;52350:30;52360:8;52369:1;52360:11;;;;;;;;:::i;:::-;;;;;;;52373:3;52377:1;52373:6;;;;;;;;:::i;:::-;;;;;;;52350:9;:30::i;:::-;52331:13;52345:1;52331:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;52311:3;;;:::i;:::-;;;52270:122;;;-1:-1:-1;52411:13:0;51908:524;-1:-1:-1;;;51908:524:0:o;67951:353::-;-1:-1:-1;;;;;68116:23:0;;9000:10;68116:23;;:66;;-1:-1:-1;68143:39:0;68160:7;9000:10;52732:168;:::i;68143:39::-;68094:157;;;;-1:-1:-1;;;68094:157:0;;;;;;;:::i;:::-;68264:32;68275:7;68284:3;68289:6;68264:10;:32::i;74341:213::-;35861:4;36307:16;35861:4;36307:10;:16::i;:::-;74448:9:::1;74443:104;74463:20:::0;;::::1;74443:104;;;74531:4;74505:9;:23;74515:9;;74525:1;74515:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;74505:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;74505:23:0;:30;;-1:-1:-1;;74505:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;74485:3;::::1;::::0;::::1;:::i;:::-;;;;74443:104;;;;74341:213:::0;;;:::o;68570:82::-;35861:4;36307:16;35861:4;36307:10;:16::i;:::-;68636:8:::1;:6;:8::i;71847:350::-:0;10366:4;10390:7;;;10644:9;10636:38;;;;-1:-1:-1;;;10636:38:0;;;;;;;:::i;:::-;71955:20:::1;;71936:15;:39;;71928:79;;;::::0;-1:-1:-1;;;71928:79:0;;26865:2:1;71928:79:0::1;::::0;::::1;26847:21:1::0;26904:2;26884:18;;;26877:30;26943:29;26923:18;;;26916:57;26990:18;;71928:79:0::1;26663:351:1::0;71928:79:0::1;72036:10;72026:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;72018:61;;;::::0;-1:-1:-1;;;72018:61:0;;25039:2:1;72018:61:0::1;::::0;::::1;25021:21:1::0;25078:2;25058:18;;;25051:30;25117:29;25097:18;;;25090:57;25164:18;;72018:61:0::1;24837:351:1::0;72018:61:0::1;72134:8;::::0;72110:10:::1;72134:8;72098:23:::0;;;:11:::1;:23;::::0;;;;;72134:8:::1;::::0;;::::1;::::0;72098:32:::1;::::0;72124:6;;72098:32:::1;:::i;:::-;:44;;72090:74;;;::::0;-1:-1:-1;;;72090:74:0;;21179:2:1;72090:74:0::1;::::0;::::1;21161:21:1::0;21218:2;21198:18;;;21191:30;-1:-1:-1;;;21237:18:1;;;21230:47;21294:18;;72090:74:0::1;20977:341:1::0;28875:100:0;28926:7;28953;28961:5;28953:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28953:14:0;;28875:100;-1:-1:-1;;28875:100:0:o;36711:147::-;36797:4;36821:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;36821:29:0;;;;;;;;;;;;;;;36711:147::o;68973:87::-;69012:13;69045:7;69038:14;;;;;:::i;52505:155::-;52600:52;9000:10;52633:8;52643;52600:18;:52::i;71460:251::-;71535:7;71554:18;71585:15;;71576:8;:24;;;;:::i;:::-;71554:46;;71611:21;71648:8;;71635:10;:21;;;;:::i;:::-;71611:45;;71690:13;;71674;:29;;;;:::i;:::-;71667:36;71460:251;-1:-1:-1;;;;71460:251:0:o;73904:292::-;35861:4;36307:16;35861:4;36307:10;:16::i;:::-;-1:-1:-1;74082:8:0::1;:20:::0;;;;74113:15:::1;:34:::0;74158:13:::1;:30:::0;73904:292::o;39036:149::-;38325:7;38352:12;;;:6;:12;;;;;:22;;;36307:16;36318:4;36307:10;:16::i;:::-;39151:26:::1;39163:4;39169:7;39151:11;:26::i;71004:309::-:0;71119:9;;71060:7;65881:16;;;:12;:16;;;;71060:7;;;;71096:32;;;;:::i;:::-;71079:49;;71139:14;71173:6;71168:111;71189:6;71185:1;:10;71168:111;;;71230:37;71256:10;71265:1;71256:6;:10;:::i;71230:37::-;71217:50;;;;:::i;:::-;;-1:-1:-1;71197:3:0;;;;:::i;:::-;;;;71168:111;;52972:401;-1:-1:-1;;;;;53180:20:0;;9000:10;53180:20;;:60;;-1:-1:-1;53204:36:0;53221:4;9000:10;52732:168;:::i;53204:36::-;53158:151;;;;-1:-1:-1;;;53158:151:0;;;;;;;:::i;:::-;53320:45;53338:4;53344:2;53348;53352:6;53360:4;53320:17;:45::i;67622:321::-;-1:-1:-1;;;;;67762:23:0;;9000:10;67762:23;;:66;;-1:-1:-1;67789:39:0;67806:7;9000:10;52732:168;:::i;67789:39::-;67740:157;;;;-1:-1:-1;;;67740:157:0;;;;;;;:::i;:::-;67910:25;67916:7;67925:2;67929:5;67910;:25::i;73270:388::-;35861:4;36307:16;35861:4;36307:10;:16::i;:::-;73467:21:::1;73446:18;:42;73424:122;;;::::0;-1:-1:-1;;;73424:122:0;;29982:2:1;73424:122:0::1;::::0;::::1;29964:21:1::0;30021:2;30001:18;;;29994:30;30060:32;30040:18;;;30033:60;30110:18;;73424:122:0::1;29780:354:1::0;73424:122:0::1;-1:-1:-1::0;73557:17:0::1;:38:::0;;;;73606:20:::1;:44:::0;73270:388::o;66200:931::-;-1:-1:-1;;;;;66522:18:0;;66518:160;;66562:9;66557:110;66581:3;:10;66577:1;:14;66557:110;;;66641:7;66649:1;66641:10;;;;;;;;:::i;:::-;;;;;;;66617:12;:20;66630:3;66634:1;66630:6;;;;;;;;:::i;:::-;;;;;;;66617:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;66593:3:0;;-1:-1:-1;66593:3:0;;:::i;:::-;;;66557:110;;;;66518:160;-1:-1:-1;;;;;66694:16:0;;66690:434;;66732:9;66727:386;66751:3;:10;66747:1;:14;66727:386;;;66787:10;66800:3;66804:1;66800:6;;;;;;;;:::i;:::-;;;;;;;66787:19;;66825:14;66842:7;66850:1;66842:10;;;;;;;;:::i;:::-;;;;;;;66825:27;;66871:14;66888:12;:16;66901:2;66888:16;;;;;;;;;;;;66871:33;;66941:6;66931;:16;;66923:69;;;;-1:-1:-1;;;66923:69:0;;25395:2:1;66923:69:0;;;25377:21:1;25434:2;25414:18;;;25407:30;25473:34;25453:18;;;25446:62;-1:-1:-1;;;25524:18:1;;;25517:38;25572:19;;66923:69:0;25193:404:1;66923:69:0;67044:16;;;;:12;:16;;;;;;67063:15;;67044:34;;66763:3;;;:::i;:::-;;;66727:386;;;;66690:434;66200:931;;;;;;:::o;12776:326::-;-1:-1:-1;;;;;13071:19:0;;:23;;;12776:326::o;36415:204::-;36500:4;-1:-1:-1;;;;;;36524:47:0;;-1:-1:-1;;;36524:47:0;;:87;;;36575:36;36599:11;36575:23;:36::i;37162:105::-;37229:30;37240:4;9000:10;37229;:30::i;57452:88::-;57519:13;;;;:4;;:13;;;;;:::i;51255:105::-;51315:13;51348:4;51341:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51255:105;;;:::o;3335:723::-;3391:13;3612:10;3608:53;;-1:-1:-1;;3639:10:0;;;;;;;;;;;;-1:-1:-1;;;3639:10:0;;;;;3335:723::o;3608:53::-;3686:5;3671:12;3727:78;3734:9;;3727:78;;3760:8;;;;:::i;:::-;;-1:-1:-1;3783:10:0;;-1:-1:-1;3791:2:0;3783:10;;:::i;:::-;;;3727:78;;;3815:19;3847:6;-1:-1:-1;;;;;3837:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3837:17:0;;3815:39;;3865:154;3872:10;;3865:154;;3899:11;3909:1;3899:11;;:::i;:::-;;-1:-1:-1;3968:10:0;3976:2;3968:5;:10;:::i;:::-;3955:24;;:2;:24;:::i;:::-;3942:39;;3925:6;3932;3925:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3925:56:0;;;;;;;;-1:-1:-1;3996:11:0;4005:2;3996:11;;:::i;:::-;;;3865:154;;30828:248;31038:12;;-1:-1:-1;;;;;31018:16:0;;30974:7;31018:16;;;:7;:16;;;;;;30974:7;;31053:15;;31002:32;;:13;:32;:::i;:::-;31001:49;;;;:::i;:::-;:67;;;;:::i;:::-;30994:74;;30828:248;;;;;;:::o;14037:317::-;14152:6;14127:21;:31;;14119:73;;;;-1:-1:-1;;;14119:73:0;;21525:2:1;14119:73:0;;;21507:21:1;21564:2;21544:18;;;21537:30;21603:31;21583:18;;;21576:59;21652:18;;14119:73:0;21323:353:1;14119:73:0;14206:12;14224:9;-1:-1:-1;;;;;14224:14:0;14246:6;14224:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14205:52;;;14276:7;14268:78;;;;-1:-1:-1;;;14268:78:0;;20752:2:1;14268:78:0;;;20734:21:1;20791:2;20771:18;;;20764:30;20830:34;20810:18;;;20803:62;20901:28;20881:18;;;20874:56;20947:19;;14268:78:0;20550:422:1;72661:379:0;72727:1;72718:6;:10;72710:53;;;;-1:-1:-1;;;72710:53:0;;26506:2:1;72710:53:0;;;26488:21:1;26545:2;26525:18;;;26518:30;26584:32;26564:18;;;26557:60;26634:18;;72710:53:0;26304:354:1;72710:53:0;72815:10;;69883:1;65881:16;;:12;:16;;;;72782:29;;72805:6;;72782:29;:::i;:::-;:43;;72774:78;;;;-1:-1:-1;;;72774:78:0;;25804:2:1;72774:78:0;;;25786:21:1;25843:2;25823:18;;;25816:30;-1:-1:-1;;;25862:18:1;;;25855:52;25924:18;;72774:78:0;25602:346:1;72774:78:0;72884:16;72893:6;72884:8;:16::i;:::-;72871:9;:29;;72863:74;;;;-1:-1:-1;;;72863:74:0;;28810:2:1;72863:74:0;;;28792:21:1;;;28829:18;;;28822:30;28888:34;28868:18;;;28861:62;28940:18;;72863:74:0;28608:356:1;72863:74:0;72962:10;72950:23;;;;:11;:23;;;;;:33;;72977:6;;72950:23;:33;;72977:6;;72950:33;:::i;:::-;;;;;;;;72994:38;73000:10;69883:1;73021:6;72994:38;;;;;;;;;;;;:5;:38::i;55534:1074::-;55761:7;:14;55747:3;:10;:28;55739:81;;;;-1:-1:-1;;;55739:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55839:16:0;;55831:66;;;;-1:-1:-1;;;55831:66:0;;;;;;;:::i;:::-;9000:10;55954:60;9000:10;55985:4;55991:2;55995:3;56000:7;56009:4;55954:20;:60::i;:::-;56032:9;56027:421;56051:3;:10;56047:1;:14;56027:421;;;56083:10;56096:3;56100:1;56096:6;;;;;;;;:::i;:::-;;;;;;;56083:19;;56117:14;56134:7;56142:1;56134:10;;;;;;;;:::i;:::-;;;;;;;;;;;;56161:19;56183:13;;;:9;:13;;;;;;-1:-1:-1;;;;;56183:19:0;;;;;;;;;;;;56134:10;;-1:-1:-1;56225:21:0;;;;56217:76;;;;-1:-1:-1;;;56217:76:0;;;;;;;:::i;:::-;56337:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;56337:19:0;;;;;;;;;;56359:20;;;56337:42;;56409:17;;;;;;;:27;;56359:20;;56337:13;56409:27;;56359:20;;56409:27;:::i;:::-;;;;;;;;56068:380;;;56063:3;;;;:::i;:::-;;;56027:421;;;;56495:2;-1:-1:-1;;;;;56465:47:0;56489:4;-1:-1:-1;;;;;56465:47:0;56479:8;-1:-1:-1;;;;;56465:47:0;;56499:3;56504:7;56465:47;;;;;;;:::i;:::-;;;;;;;;56525:75;56561:8;56571:4;56577:2;56581:3;56586:7;56595:4;56525:35;:75::i;41193:238::-;41277:22;41285:4;41291:7;41277;:22::i;:::-;41272:152;;41316:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;41316:29:0;;;;;;;;;:36;;-1:-1:-1;;41316:36:0;41348:4;41316:36;;;41399:12;9000:10;;8920:98;41399:12;-1:-1:-1;;;;;41372:40:0;41390:7;-1:-1:-1;;;;;41372:40:0;41384:4;41372:40;;;;;;;;;;41193:238;;:::o;41563:239::-;41647:22;41655:4;41661:7;41647;:22::i;:::-;41643:152;;;41718:5;41686:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;41686:29:0;;;;;;;;;;:37;;-1:-1:-1;;41686:37:0;;;41743:40;9000:10;;41686:12;;41743:40;;41718:5;41743:40;41563:239;;:::o;11378:120::-;10366:4;10390:7;;;10914:41;;;;-1:-1:-1;;;10914:41:0;;18769:2:1;10914:41:0;;;18751:21:1;18808:2;18788:18;;;18781:30;-1:-1:-1;;;18827:18:1;;;18820:50;18887:18;;10914:41:0;18567:344:1;10914:41:0;11447:5:::1;11437:15:::0;;-1:-1:-1;;11437:15:0::1;::::0;;11468:22:::1;9000:10:::0;11477:12:::1;11468:22;::::0;-1:-1:-1;;;;;14036:32:1;;;14018:51;;14006:2;13991:18;11468:22:0::1;;;;;;;11378:120::o:0;20796:211::-;20940:58;;;-1:-1:-1;;;;;14280:32:1;;20940:58:0;;;14262:51:1;14329:18;;;;14322:34;;;20940:58:0;;;;;;;;;;14235:18:1;;;;20940:58:0;;;;;;;;-1:-1:-1;;;;;20940:58:0;-1:-1:-1;;;20940:58:0;;;20913:86;;20933:5;;20913:19;:86::i;60687:891::-;-1:-1:-1;;;;;60839:18:0;;60831:66;;;;-1:-1:-1;;;60831:66:0;;;;;;;:::i;:::-;60930:7;:14;60916:3;:10;:28;60908:81;;;;-1:-1:-1;;;60908:81:0;;;;;;;:::i;:::-;61002:16;9000:10;61002:31;;61046:66;61067:8;61077:4;61091:1;61095:3;61100:7;61046:66;;;;;;;;;;;;:20;:66::i;:::-;61130:9;61125:373;61149:3;:10;61145:1;:14;61125:373;;;61181:10;61194:3;61198:1;61194:6;;;;;;;;:::i;:::-;;;;;;;61181:19;;61215:14;61232:7;61240:1;61232:10;;;;;;;;:::i;:::-;;;;;;;;;;;;61259:19;61281:13;;;:9;:13;;;;;;-1:-1:-1;;;;;61281:19:0;;;;;;;;;;;;61232:10;;-1:-1:-1;61323:21:0;;;;61315:70;;;;-1:-1:-1;;;61315:70:0;;;;;;;:::i;:::-;61429:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;61429:19:0;;;;;;;;;;61451:20;;61429:42;;61161:3;;;;:::i;:::-;;;;61125:373;;;;61553:1;-1:-1:-1;;;;;61515:55:0;61539:4;-1:-1:-1;;;;;61515:55:0;61529:8;-1:-1:-1;;;;;61515:55:0;;61557:3;61562:7;61515:55;;;;;;;:::i;:::-;;;;;;;;60820:758;60687:891;;;:::o;11119:118::-;10366:4;10390:7;;;10644:9;10636:38;;;;-1:-1:-1;;;10636:38:0;;;;;;;:::i;:::-;11179:7:::1;:14:::0;;-1:-1:-1;;11179:14:0::1;11189:4;11179:14;::::0;;11209:20:::1;11216:12;9000:10:::0;;8920:98;61720:331;61875:8;-1:-1:-1;;;;;61866:17:0;:5;-1:-1:-1;;;;;61866:17:0;;;61858:71;;;;-1:-1:-1;;;61858:71:0;;27579:2:1;61858:71:0;;;27561:21:1;27618:2;27598:18;;;27591:30;27657:34;27637:18;;;27630:62;-1:-1:-1;;;27708:18:1;;;27701:39;27757:19;;61858:71:0;27377:405:1;61858:71:0;-1:-1:-1;;;;;61940:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;61940:46:0;;;;;;;;;;62002:41;;16918::1;;;62002::0;;16891:18:1;62002:41:0;;;;;;;61720:331;;;:::o;54356:820::-;-1:-1:-1;;;;;54544:16:0;;54536:66;;;;-1:-1:-1;;;54536:66:0;;;;;;;:::i;:::-;9000:10;54659:96;9000:10;54690:4;54696:2;54700:21;54718:2;54700:17;:21::i;:::-;54723:25;54741:6;54723:17;:25::i;:::-;54750:4;54659:20;:96::i;:::-;54768:19;54790:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;54790:19:0;;;;;;;;;;54828:21;;;;54820:76;;;;-1:-1:-1;;;54820:76:0;;;;;;;:::i;:::-;54932:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;54932:19:0;;;;;;;;;;54954:20;;;54932:42;;54996:17;;;;;;;:27;;54954:20;;54932:13;54996:27;;54954:20;;54996:27;:::i;:::-;;;;-1:-1:-1;;55041:46:0;;;30911:25:1;;;30967:2;30952:18;;30945:34;;;-1:-1:-1;;;;;55041:46:0;;;;;;;;;;;;;;30884:18:1;55041:46:0;;;;;;;55100:68;55131:8;55141:4;55147:2;55151;55155:6;55163:4;55100:30;:68::i;59836:648::-;-1:-1:-1;;;;;59963:18:0;;59955:66;;;;-1:-1:-1;;;59955:66:0;;;;;;;:::i;:::-;9000:10;60078:102;9000:10;60109:4;60034:16;60127:21;60145:2;60127:17;:21::i;:::-;60150:25;60168:6;60150:17;:25::i;:::-;60078:102;;;;;;;;;;;;:20;:102::i;:::-;60193:19;60215:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;60215:19:0;;;;;;;;;;60253:21;;;;60245:70;;;;-1:-1:-1;;;60245:70:0;;;;;;;:::i;:::-;60351:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;60351:19:0;;;;;;;;;;;;60373:20;;;60351:42;;60422:54;;30911:25:1;;;30952:18;;;30945:34;;;60351:19:0;;60422:54;;;;;;30884:18:1;60422:54:0;;;;;;;59944:540;;59836:648;;;:::o;50534:310::-;50636:4;-1:-1:-1;;;;;;50673:41:0;;-1:-1:-1;;;50673:41:0;;:110;;-1:-1:-1;;;;;;;50731:52:0;;-1:-1:-1;;;50731:52:0;50673:110;:163;;;-1:-1:-1;;;;;;;;;;33745:40:0;;;50800:36;33636:157;37557:505;37646:22;37654:4;37660:7;37646;:22::i;:::-;37641:414;;37834:41;37862:7;-1:-1:-1;;;;;37834:41:0;37872:2;37834:19;:41::i;:::-;37948:38;37976:4;37983:2;37948:19;:38::i;:::-;37739:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;37739:270:0;;;;;;;;;;-1:-1:-1;;;37685:358:0;;;;;;;:::i;57926:569::-;-1:-1:-1;;;;;58079:16:0;;58071:62;;;;-1:-1:-1;;;58071:62:0;;29580:2:1;58071:62:0;;;29562:21:1;29619:2;29599:18;;;29592:30;29658:34;29638:18;;;29631:62;-1:-1:-1;;;29709:18:1;;;29702:31;29750:19;;58071:62:0;29378:397:1;58071:62:0;9000:10;58190:102;9000:10;58146:16;58233:2;58237:21;58255:2;58237:17;:21::i;58190:102::-;58305:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;58305:17:0;;;;;;;;;:27;;58326:6;;58305:13;:27;;58326:6;;58305:27;:::i;:::-;;;;-1:-1:-1;;58348:52:0;;;30911:25:1;;;30967:2;30952:18;;30945:34;;;-1:-1:-1;;;;;58348:52:0;;;;58381:1;;58348:52;;;;;;30884:18:1;58348:52:0;;;;;;;58413:74;58444:8;58462:1;58466:2;58470;58474:6;58482:4;58413:30;:74::i;69078:337::-;69341:66;69368:8;69378:4;69384:2;69388:3;69393:7;69402:4;69341:26;:66::i;63988:813::-;-1:-1:-1;;;;;64228:13:0;;13071:19;:23;64224:570;;64264:79;;-1:-1:-1;;;64264:79:0;;-1:-1:-1;;;;;64264:43:0;;;;;:79;;64308:8;;64318:4;;64324:3;;64329:7;;64338:4;;64264:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64264:79:0;;;;;;;;-1:-1:-1;;64264:79:0;;;;;;;;;;;;:::i;:::-;;;64260:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;64656:6;64649:14;;-1:-1:-1;;;64649:14:0;;;;;;;;:::i;64260:523::-;;;64705:62;;-1:-1:-1;;;64705:62:0;;17578:2:1;64705:62:0;;;17560:21:1;17617:2;17597:18;;;17590:30;17656:34;17636:18;;;17629:62;-1:-1:-1;;;17707:18:1;;;17700:50;17767:19;;64705:62:0;17376:416:1;64260:523:0;-1:-1:-1;;;;;;64425:60:0;;-1:-1:-1;;;64425:60:0;64421:159;;64510:50;;-1:-1:-1;;;64510:50:0;;;;;;;:::i;23369:716::-;23793:23;23819:69;23847:4;23819:69;;;;;;;;;;;;;;;;;23827:5;-1:-1:-1;;;;;23819:27:0;;;:69;;;;;:::i;:::-;23903:17;;23793:95;;-1:-1:-1;23903:21:0;23899:179;;24000:10;23989:30;;;;;;;;;;;;:::i;:::-;23981:85;;;;-1:-1:-1;;;23981:85:0;;27989:2:1;23981:85:0;;;27971:21:1;28028:2;28008:18;;;28001:30;28067:34;28047:18;;;28040:62;-1:-1:-1;;;28118:18:1;;;28111:40;28168:19;;23981:85:0;27787:406:1;64809:198:0;64929:16;;;64943:1;64929:16;;;;;;;;;64875;;64904:22;;64929:16;;;;;;;;;;;;-1:-1:-1;64929:16:0;64904:41;;64967:7;64956:5;64962:1;64956:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;64994:5;64809:198;-1:-1:-1;;64809:198:0:o;63236:744::-;-1:-1:-1;;;;;63451:13:0;;13071:19;:23;63447:526;;63487:72;;-1:-1:-1;;;63487:72:0;;-1:-1:-1;;;;;63487:38:0;;;;;:72;;63526:8;;63536:4;;63542:2;;63546:6;;63554:4;;63487:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63487:72:0;;;;;;;;-1:-1:-1;;63487:72:0;;;;;;;;;;;;:::i;:::-;;;63483:479;;;;:::i;:::-;-1:-1:-1;;;;;;63609:55:0;;-1:-1:-1;;;63609:55:0;63605:154;;63689:50;;-1:-1:-1;;;63689:50:0;;;;;;;:::i;4636:451::-;4711:13;4737:19;4769:10;4773:6;4769:1;:10;:::i;:::-;:14;;4782:1;4769:14;:::i;:::-;-1:-1:-1;;;;;4759:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4759:25:0;;4737:47;;-1:-1:-1;;;4795:6:0;4802:1;4795:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4795:15:0;;;;;;;;;-1:-1:-1;;;4821:6:0;4828:1;4821:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4821:15:0;;;;;;;;-1:-1:-1;4852:9:0;4864:10;4868:6;4864:1;:10;:::i;:::-;:14;;4877:1;4864:14;:::i;:::-;4852:26;;4847:135;4884:1;4880;:5;4847:135;;;-1:-1:-1;;;4932:5:0;4940:3;4932:11;4919:25;;;;;;;:::i;:::-;;;;4907:6;4914:1;4907:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;4907:37:0;;;;;;;;-1:-1:-1;4969:1:0;4959:11;;;;;4887:3;;;:::i;:::-;;;4847:135;;;-1:-1:-1;5000:10:0;;4992:55;;;;-1:-1:-1;;;4992:55:0;;17999:2:1;4992:55:0;;;17981:21:1;;;18018:18;;;18011:30;18077:34;18057:18;;;18050:62;18129:18;;4992:55:0;17797:356:1;15521:229:0;15658:12;15690:52;15712:6;15720:4;15726:1;15729:12;15658;-1:-1:-1;;;;;13071:19:0;;;16928:60;;;;-1:-1:-1;;;16928:60:0;;27221:2:1;16928:60:0;;;27203:21:1;27260:2;27240:18;;;27233:30;27299:31;27279:18;;;27272:59;27348:18;;16928:60:0;27019:353:1;16928:60:0;17002:12;17016:23;17043:6;-1:-1:-1;;;;;17043:11:0;17062:5;17069:4;17043:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17001:73;;;;17092:51;17109:7;17118:10;17130:12;17092:16;:51::i;:::-;17085:58;16641:510;-1:-1:-1;;;;;;;16641:510:0:o;19327:712::-;19477:12;19506:7;19502:530;;;-1:-1:-1;19537:10:0;19530:17;;19502:530;19651:17;;:21;19647:374;;19849:10;19843:17;19910:15;19897:10;19893:2;19889:19;19882:44;19647:374;19992:12;19985:20;;-1:-1:-1;;;19985:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:1;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:45;;;369:1;366;359:12;328:45;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;14:468;;;;;:::o;487:735::-;541:5;594:3;587:4;579:6;575:17;571:27;561:55;;612:1;609;602:12;561:55;648:6;635:20;674:4;697:43;737:2;697:43;:::i;:::-;769:2;763:9;781:31;809:2;801:6;781:31;:::i;:::-;847:18;;;881:15;;;;-1:-1:-1;916:15:1;;;966:1;962:10;;;950:23;;946:32;;943:41;-1:-1:-1;940:61:1;;;997:1;994;987:12;940:61;1019:1;1029:163;1043:2;1040:1;1037:9;1029:163;;;1100:17;;1088:30;;1138:12;;;;1170;;;;1061:1;1054:9;1029:163;;;-1:-1:-1;1210:6:1;;487:735;-1:-1:-1;;;;;;;487:735:1:o;1227:220::-;1269:5;1322:3;1315:4;1307:6;1303:17;1299:27;1289:55;;1340:1;1337;1330:12;1289:55;1362:79;1437:3;1428:6;1415:20;1408:4;1400:6;1396:17;1362:79;:::i;1452:247::-;1511:6;1564:2;1552:9;1543:7;1539:23;1535:32;1532:52;;;1580:1;1577;1570:12;1532:52;1619:9;1606:23;1638:31;1663:5;1638:31;:::i;1964:388::-;2032:6;2040;2093:2;2081:9;2072:7;2068:23;2064:32;2061:52;;;2109:1;2106;2099:12;2061:52;2148:9;2135:23;2167:31;2192:5;2167:31;:::i;:::-;2217:5;-1:-1:-1;2274:2:1;2259:18;;2246:32;2287:33;2246:32;2287:33;:::i;:::-;2339:7;2329:17;;;1964:388;;;;;:::o;2357:1071::-;2511:6;2519;2527;2535;2543;2596:3;2584:9;2575:7;2571:23;2567:33;2564:53;;;2613:1;2610;2603:12;2564:53;2652:9;2639:23;2671:31;2696:5;2671:31;:::i;:::-;2721:5;-1:-1:-1;2778:2:1;2763:18;;2750:32;2791:33;2750:32;2791:33;:::i;:::-;2843:7;-1:-1:-1;2901:2:1;2886:18;;2873:32;-1:-1:-1;;;;;2954:14:1;;;2951:34;;;2981:1;2978;2971:12;2951:34;3004:61;3057:7;3048:6;3037:9;3033:22;3004:61;:::i;:::-;2994:71;;3118:2;3107:9;3103:18;3090:32;3074:48;;3147:2;3137:8;3134:16;3131:36;;;3163:1;3160;3153:12;3131:36;3186:63;3241:7;3230:8;3219:9;3215:24;3186:63;:::i;:::-;3176:73;;3302:3;3291:9;3287:19;3274:33;3258:49;;3332:2;3322:8;3319:16;3316:36;;;3348:1;3345;3338:12;3316:36;;3371:51;3414:7;3403:8;3392:9;3388:24;3371:51;:::i;:::-;3361:61;;;2357:1071;;;;;;;;:::o;3433:734::-;3537:6;3545;3553;3561;3569;3622:3;3610:9;3601:7;3597:23;3593:33;3590:53;;;3639:1;3636;3629:12;3590:53;3678:9;3665:23;3697:31;3722:5;3697:31;:::i;:::-;3747:5;-1:-1:-1;3804:2:1;3789:18;;3776:32;3817:33;3776:32;3817:33;:::i;:::-;3869:7;-1:-1:-1;3923:2:1;3908:18;;3895:32;;-1:-1:-1;3974:2:1;3959:18;;3946:32;;-1:-1:-1;4029:3:1;4014:19;;4001:33;-1:-1:-1;;;;;4046:30:1;;4043:50;;;4089:1;4086;4079:12;4043:50;4112:49;4153:7;4144:6;4133:9;4129:22;4112:49;:::i;4172:730::-;4299:6;4307;4315;4368:2;4356:9;4347:7;4343:23;4339:32;4336:52;;;4384:1;4381;4374:12;4336:52;4423:9;4410:23;4442:31;4467:5;4442:31;:::i;:::-;4492:5;-1:-1:-1;4548:2:1;4533:18;;4520:32;-1:-1:-1;;;;;4601:14:1;;;4598:34;;;4628:1;4625;4618:12;4598:34;4651:61;4704:7;4695:6;4684:9;4680:22;4651:61;:::i;:::-;4641:71;;4765:2;4754:9;4750:18;4737:32;4721:48;;4794:2;4784:8;4781:16;4778:36;;;4810:1;4807;4800:12;4778:36;;4833:63;4888:7;4877:8;4866:9;4862:24;4833:63;:::i;:::-;4823:73;;;4172:730;;;;;:::o;4907:382::-;4972:6;4980;5033:2;5021:9;5012:7;5008:23;5004:32;5001:52;;;5049:1;5046;5039:12;5001:52;5088:9;5075:23;5107:31;5132:5;5107:31;:::i;:::-;5157:5;-1:-1:-1;5214:2:1;5199:18;;5186:32;5227:30;5186:32;5227:30;:::i;5294:315::-;5362:6;5370;5423:2;5411:9;5402:7;5398:23;5394:32;5391:52;;;5439:1;5436;5429:12;5391:52;5478:9;5465:23;5497:31;5522:5;5497:31;:::i;:::-;5547:5;5599:2;5584:18;;;;5571:32;;-1:-1:-1;;;5294:315:1:o;5614:383::-;5691:6;5699;5707;5760:2;5748:9;5739:7;5735:23;5731:32;5728:52;;;5776:1;5773;5766:12;5728:52;5815:9;5802:23;5834:31;5859:5;5834:31;:::i;:::-;5884:5;5936:2;5921:18;;5908:32;;-1:-1:-1;5987:2:1;5972:18;;;5959:32;;5614:383;-1:-1:-1;;;5614:383:1:o;6002:615::-;6088:6;6096;6149:2;6137:9;6128:7;6124:23;6120:32;6117:52;;;6165:1;6162;6155:12;6117:52;6205:9;6192:23;-1:-1:-1;;;;;6275:2:1;6267:6;6264:14;6261:34;;;6291:1;6288;6281:12;6261:34;6329:6;6318:9;6314:22;6304:32;;6374:7;6367:4;6363:2;6359:13;6355:27;6345:55;;6396:1;6393;6386:12;6345:55;6436:2;6423:16;6462:2;6454:6;6451:14;6448:34;;;6478:1;6475;6468:12;6448:34;6531:7;6526:2;6516:6;6513:1;6509:14;6505:2;6501:23;6497:32;6494:45;6491:65;;;6552:1;6549;6542:12;6491:65;6583:2;6575:11;;;;;6605:6;;-1:-1:-1;6002:615:1;;-1:-1:-1;;;;6002:615:1:o;6622:1288::-;6740:6;6748;6801:2;6789:9;6780:7;6776:23;6772:32;6769:52;;;6817:1;6814;6807:12;6769:52;6857:9;6844:23;-1:-1:-1;;;;;6927:2:1;6919:6;6916:14;6913:34;;;6943:1;6940;6933:12;6913:34;6981:6;6970:9;6966:22;6956:32;;7026:7;7019:4;7015:2;7011:13;7007:27;6997:55;;7048:1;7045;7038:12;6997:55;7084:2;7071:16;7106:4;7129:43;7169:2;7129:43;:::i;:::-;7201:2;7195:9;7213:31;7241:2;7233:6;7213:31;:::i;:::-;7279:18;;;7313:15;;;;-1:-1:-1;7348:11:1;;;7390:1;7386:10;;;7378:19;;7374:28;;7371:41;-1:-1:-1;7368:61:1;;;7425:1;7422;7415:12;7368:61;7447:1;7438:10;;7457:238;7471:2;7468:1;7465:9;7457:238;;;7542:3;7529:17;7559:31;7584:5;7559:31;:::i;:::-;7603:18;;7489:1;7482:9;;;;;7641:12;;;;7673;;7457:238;;;-1:-1:-1;7714:6:1;-1:-1:-1;;7758:18:1;;7745:32;;-1:-1:-1;;7789:16:1;;;7786:36;;;7818:1;7815;7808:12;7786:36;;7841:63;7896:7;7885:8;7874:9;7870:24;7841:63;:::i;:::-;7831:73;;;6622:1288;;;;;:::o;7915:245::-;7982:6;8035:2;8023:9;8014:7;8010:23;8006:32;8003:52;;;8051:1;8048;8041:12;8003:52;8083:9;8077:16;8102:28;8124:5;8102:28;:::i;8165:180::-;8224:6;8277:2;8265:9;8256:7;8252:23;8248:32;8245:52;;;8293:1;8290;8283:12;8245:52;-1:-1:-1;8316:23:1;;8165:180;-1:-1:-1;8165:180:1:o;8350:315::-;8418:6;8426;8479:2;8467:9;8458:7;8454:23;8450:32;8447:52;;;8495:1;8492;8485:12;8447:52;8531:9;8518:23;8508:33;;8591:2;8580:9;8576:18;8563:32;8604:31;8629:5;8604:31;:::i;8670:245::-;8728:6;8781:2;8769:9;8760:7;8756:23;8752:32;8749:52;;;8797:1;8794;8787:12;8749:52;8836:9;8823:23;8855:30;8879:5;8855:30;:::i;8920:249::-;8989:6;9042:2;9030:9;9021:7;9017:23;9013:32;9010:52;;;9058:1;9055;9048:12;9010:52;9090:9;9084:16;9109:30;9133:5;9109:30;:::i;9845:450::-;9914:6;9967:2;9955:9;9946:7;9942:23;9938:32;9935:52;;;9983:1;9980;9973:12;9935:52;10023:9;10010:23;-1:-1:-1;;;;;10048:6:1;10045:30;10042:50;;;10088:1;10085;10078:12;10042:50;10111:22;;10164:4;10156:13;;10152:27;-1:-1:-1;10142:55:1;;10193:1;10190;10183:12;10142:55;10216:73;10281:7;10276:2;10263:16;10258:2;10254;10250:11;10216:73;:::i;10485:184::-;10555:6;10608:2;10596:9;10587:7;10583:23;10579:32;10576:52;;;10624:1;10621;10614:12;10576:52;-1:-1:-1;10647:16:1;;10485:184;-1:-1:-1;10485:184:1:o;10674:248::-;10742:6;10750;10803:2;10791:9;10782:7;10778:23;10774:32;10771:52;;;10819:1;10816;10809:12;10771:52;-1:-1:-1;;10842:23:1;;;10912:2;10897:18;;;10884:32;;-1:-1:-1;10674:248:1:o;10927:316::-;11004:6;11012;11020;11073:2;11061:9;11052:7;11048:23;11044:32;11041:52;;;11089:1;11086;11079:12;11041:52;-1:-1:-1;;11112:23:1;;;11182:2;11167:18;;11154:32;;-1:-1:-1;11233:2:1;11218:18;;;11205:32;;10927:316;-1:-1:-1;10927:316:1:o;11248:435::-;11301:3;11339:5;11333:12;11366:6;11361:3;11354:19;11392:4;11421:2;11416:3;11412:12;11405:19;;11458:2;11451:5;11447:14;11479:1;11489:169;11503:6;11500:1;11497:13;11489:169;;;11564:13;;11552:26;;11598:12;;;;11633:15;;;;11525:1;11518:9;11489:169;;;-1:-1:-1;11674:3:1;;11248:435;-1:-1:-1;;;;;11248:435:1:o;11688:257::-;11729:3;11767:5;11761:12;11794:6;11789:3;11782:19;11810:63;11866:6;11859:4;11854:3;11850:14;11843:4;11836:5;11832:16;11810:63;:::i;:::-;11927:2;11906:15;-1:-1:-1;;11902:29:1;11893:39;;;;11934:4;11889:50;;11688:257;-1:-1:-1;;11688:257:1:o;11950:274::-;12079:3;12117:6;12111:13;12133:53;12179:6;12174:3;12167:4;12159:6;12155:17;12133:53;:::i;:::-;12202:16;;;;;11950:274;-1:-1:-1;;11950:274:1:o;12229:637::-;12509:3;12547:6;12541:13;12563:53;12609:6;12604:3;12597:4;12589:6;12585:17;12563:53;:::i;:::-;12679:13;;12638:16;;;;12701:57;12679:13;12638:16;12735:4;12723:17;;12701:57;:::i;:::-;-1:-1:-1;;;12780:20:1;;12809:22;;;12858:1;12847:13;;12229:637;-1:-1:-1;;;;12229:637:1:o;13081:786::-;13492:25;13487:3;13480:38;13462:3;13547:6;13541:13;13563:62;13618:6;13613:2;13608:3;13604:12;13597:4;13589:6;13585:17;13563:62;:::i;:::-;-1:-1:-1;;;13684:2:1;13644:16;;;13676:11;;;13669:40;13734:13;;13756:63;13734:13;13805:2;13797:11;;13790:4;13778:17;;13756:63;:::i;:::-;13839:17;13858:2;13835:26;;13081:786;-1:-1:-1;;;;13081:786:1:o;14367:826::-;-1:-1:-1;;;;;14764:15:1;;;14746:34;;14816:15;;14811:2;14796:18;;14789:43;14726:3;14863:2;14848:18;;14841:31;;;14689:4;;14895:57;;14932:19;;14924:6;14895:57;:::i;:::-;15000:9;14992:6;14988:22;14983:2;14972:9;14968:18;14961:50;15034:44;15071:6;15063;15034:44;:::i;:::-;15020:58;;15127:9;15119:6;15115:22;15109:3;15098:9;15094:19;15087:51;15155:32;15180:6;15172;15155:32;:::i;:::-;15147:40;14367:826;-1:-1:-1;;;;;;;;14367:826:1:o;15198:560::-;-1:-1:-1;;;;;15495:15:1;;;15477:34;;15547:15;;15542:2;15527:18;;15520:43;15594:2;15579:18;;15572:34;;;15637:2;15622:18;;15615:34;;;15457:3;15680;15665:19;;15658:32;;;15420:4;;15707:45;;15732:19;;15724:6;15707:45;:::i;16042:261::-;16221:2;16210:9;16203:21;16184:4;16241:56;16293:2;16282:9;16278:18;16270:6;16241:56;:::i;16308:465::-;16565:2;16554:9;16547:21;16528:4;16591:56;16643:2;16632:9;16628:18;16620:6;16591:56;:::i;:::-;16695:9;16687:6;16683:22;16678:2;16667:9;16663:18;16656:50;16723:44;16760:6;16752;16723:44;:::i;:::-;16715:52;16308:465;-1:-1:-1;;;;;16308:465:1:o;17152:219::-;17301:2;17290:9;17283:21;17264:4;17321:44;17361:2;17350:9;17346:18;17338:6;17321:44;:::i;18158:404::-;18360:2;18342:21;;;18399:2;18379:18;;;18372:30;18438:34;18433:2;18418:18;;18411:62;-1:-1:-1;;;18504:2:1;18489:18;;18482:38;18552:3;18537:19;;18158:404::o;19328:400::-;19530:2;19512:21;;;19569:2;19549:18;;;19542:30;19608:34;19603:2;19588:18;;19581:62;-1:-1:-1;;;19674:2:1;19659:18;;19652:34;19718:3;19703:19;;19328:400::o;19733:405::-;19935:2;19917:21;;;19974:2;19954:18;;;19947:30;20013:34;20008:2;19993:18;;19986:62;-1:-1:-1;;;20079:2:1;20064:18;;20057:39;20128:3;20113:19;;19733:405::o;20143:402::-;20345:2;20327:21;;;20384:2;20364:18;;;20357:30;20423:34;20418:2;20403:18;;20396:62;-1:-1:-1;;;20489:2:1;20474:18;;20467:36;20535:3;20520:19;;20143:402::o;22088:407::-;22290:2;22272:21;;;22329:2;22309:18;;;22302:30;22368:34;22363:2;22348:18;;22341:62;-1:-1:-1;;;22434:2:1;22419:18;;22412:41;22485:3;22470:19;;22088:407::o;22852:340::-;23054:2;23036:21;;;23093:2;23073:18;;;23066:30;-1:-1:-1;;;23127:2:1;23112:18;;23105:46;23183:2;23168:18;;22852:340::o;23197:401::-;23399:2;23381:21;;;23438:2;23418:18;;;23411:30;23477:34;23472:2;23457:18;;23450:62;-1:-1:-1;;;23543:2:1;23528:18;;23521:35;23588:3;23573:19;;23197:401::o;24022:399::-;24224:2;24206:21;;;24263:2;24243:18;;;24236:30;24302:34;24297:2;24282:18;;24275:62;-1:-1:-1;;;24368:2:1;24353:18;;24346:33;24411:3;24396:19;;24022:399::o;24426:406::-;24628:2;24610:21;;;24667:2;24647:18;;;24640:30;24706:34;24701:2;24686:18;;24679:62;-1:-1:-1;;;24772:2:1;24757:18;;24750:40;24822:3;24807:19;;24426:406::o;28969:404::-;29171:2;29153:21;;;29210:2;29190:18;;;29183:30;29249:34;29244:2;29229:18;;29222:62;-1:-1:-1;;;29315:2:1;29300:18;;29293:38;29363:3;29348:19;;28969:404::o;30990:183::-;31050:4;-1:-1:-1;;;;;31075:6:1;31072:30;31069:56;;;31105:18;;:::i;:::-;-1:-1:-1;31150:1:1;31146:14;31162:4;31142:25;;30990:183::o;31178:128::-;31218:3;31249:1;31245:6;31242:1;31239:13;31236:39;;;31255:18;;:::i;:::-;-1:-1:-1;31291:9:1;;31178:128::o;31311:120::-;31351:1;31377;31367:35;;31382:18;;:::i;:::-;-1:-1:-1;31416:9:1;;31311:120::o;31436:168::-;31476:7;31542:1;31538;31534:6;31530:14;31527:1;31524:21;31519:1;31512:9;31505:17;31501:45;31498:71;;;31549:18;;:::i;:::-;-1:-1:-1;31589:9:1;;31436:168::o;31609:125::-;31649:4;31677:1;31674;31671:8;31668:34;;;31682:18;;:::i;:::-;-1:-1:-1;31719:9:1;;31609:125::o;31739:258::-;31811:1;31821:113;31835:6;31832:1;31829:13;31821:113;;;31911:11;;;31905:18;31892:11;;;31885:39;31857:2;31850:10;31821:113;;;31952:6;31949:1;31946:13;31943:48;;;-1:-1:-1;;31987:1:1;31969:16;;31962:27;31739:258::o;32002:136::-;32041:3;32069:5;32059:39;;32078:18;;:::i;:::-;-1:-1:-1;;;32114:18:1;;32002:136::o;32143:380::-;32222:1;32218:12;;;;32265;;;32286:61;;32340:4;32332:6;32328:17;32318:27;;32286:61;32393:2;32385:6;32382:14;32362:18;32359:38;32356:161;;;32439:10;32434:3;32430:20;32427:1;32420:31;32474:4;32471:1;32464:15;32502:4;32499:1;32492:15;32356:161;;32143:380;;;:::o;32528:249::-;32638:2;32619:13;;-1:-1:-1;;32615:27:1;32603:40;;-1:-1:-1;;;;;32658:34:1;;32694:22;;;32655:62;32652:88;;;32720:18;;:::i;:::-;32756:2;32749:22;-1:-1:-1;;32528:249:1:o;32782:135::-;32821:3;-1:-1:-1;;32842:17:1;;32839:43;;;32862:18;;:::i;:::-;-1:-1:-1;32909:1:1;32898:13;;32782:135::o;32922:112::-;32954:1;32980;32970:35;;32985:18;;:::i;:::-;-1:-1:-1;33019:9:1;;32922:112::o;33039:127::-;33100:10;33095:3;33091:20;33088:1;33081:31;33131:4;33128:1;33121:15;33155:4;33152:1;33145:15;33171:127;33232:10;33227:3;33223:20;33220:1;33213:31;33263:4;33260:1;33253:15;33287:4;33284:1;33277:15;33303:127;33364:10;33359:3;33355:20;33352:1;33345:31;33395:4;33392:1;33385:15;33419:4;33416:1;33409:15;33435:127;33496:10;33491:3;33487:20;33484:1;33477:31;33527:4;33524:1;33517:15;33551:4;33548:1;33541:15;33567:179;33602:3;33644:1;33626:16;33623:23;33620:120;;;33690:1;33687;33684;33669:23;-1:-1:-1;33727:1:1;33721:8;33716:3;33712:18;33620:120;33567:179;:::o;33751:671::-;33790:3;33832:4;33814:16;33811:26;33808:39;;;33751:671;:::o;33808:39::-;33874:2;33868:9;-1:-1:-1;;33939:16:1;33935:25;;33932:1;33868:9;33911:50;33990:4;33984:11;34014:16;-1:-1:-1;;;;;34120:2:1;34113:4;34105:6;34101:17;34098:25;34093:2;34085:6;34082:14;34079:45;34076:58;;;34127:5;;;;;33751:671;:::o;34076:58::-;34164:6;34158:4;34154:17;34143:28;;34200:3;34194:10;34227:2;34219:6;34216:14;34213:27;;;34233:5;;;;;;33751:671;:::o;34213:27::-;34317:2;34298:16;34292:4;34288:27;34284:36;34277:4;34268:6;34263:3;34259:16;34255:27;34252:69;34249:82;;;34324:5;;;;;;33751:671;:::o;34249:82::-;34340:57;34391:4;34382:6;34374;34370:19;34366:30;34360:4;34340:57;:::i;:::-;-1:-1:-1;34413:3:1;;33751:671;-1:-1:-1;;;;;33751:671:1:o;34427:131::-;-1:-1:-1;;;;;34502:31:1;;34492:42;;34482:70;;34548:1;34545;34538:12;34563:118;34649:5;34642:13;34635:21;34628:5;34625:32;34615:60;;34671:1;34668;34661:12;34686:131;-1:-1:-1;;;;;;34760:32:1;;34750:43;;34740:71;;34807:1;34804;34797:12

Swarm Source

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