ETH Price: $3,622.52 (-2.36%)

Token

ERC-20: MonsterMania (MM)
 

Overview

Max Total Supply

4,444 MM

Holders

758

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 MM
0x734cD106E18A334fB2ecCCE8Ceb2e53610AaDF29
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:
MonsterMania

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-17
*/

// SPDX-License-Identifier: MIT

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


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
// File: @openzeppelin/contracts/utils/Counters.sol


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

// File: contracts/MonsterMania.sol



pragma solidity >=0.7.0 <0.9.0;


contract MonsterMania is ERC721, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public uriPrefix = ""; // BaseURI
  string public uriSuffix = ".json";
  string public hiddenMetadataUri;
  
  uint32 publicSaleStartTime;

  uint256 public cost = 0.04 ether;
  uint256 public maxSupply = 4444;
  uint256 public maxMintAmountPerTx = 5;

  bool public paused = false; // Only for public sale.
  bool public revealed = false;

  mapping(address => uint256) public userWallets;

  constructor() ERC721("MonsterMania", "MM") {
    setHiddenMetadataUri("ipfs://QmXc9QBz6bnfZ32PGuCZz8pf55Q16GrohSZJHgPSQu7Yw3/hidden.json");
    publicSaleStartTime = 1650228240; // 4/17/22 4:44 PM EST

}

  modifier mintCompliance(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount");
    require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!");
    require(msg.value >= cost * _mintAmount, "Insufficient funds!");
    _;
  } 

  function totalSupply() public view returns (uint256) {
    return supply.current();
  }

  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!paused, "Public minting is paused. Presale is probably going on.");
    require(publicSaleStartTime <= block.timestamp, "Public sale is not active.");

    _mintLoop(msg.sender, _mintAmount);
  }
  
  function mintForAddress(uint256 _mintAmount, address _receiver) public onlyOwner {
    _mintLoop(_receiver, _mintAmount);
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"
    );

    if (revealed == false) {
      return hiddenMetadataUri;
    }

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

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function emergencyOverridePublicSaleStartTime(uint32 startTime_) public onlyOwner {
    publicSaleStartTime = startTime_;
  }

  function withdraw() public onlyOwner {
    (bool hs, ) = payable(0x348284911bbF67734704b565d0442B5Cece2BCFf).call{value: address(this).balance * 10 / 100}("");
    require(hs);

    (bool hsa, ) = payable(0x56BDa1c4e30221cd875C40640fefB5B51Bf37bcA).call{value: address(this).balance * 30 / 100}("");
    require(hsa);

    (bool hsb, ) = payable(0xb631B67859063bf88ECbC31B6C7809064c1D91bd).call{value: address(this).balance * 30 / 100}("");
    require(hsb);

    (bool hsc, ) = payable(0x38cB1C021668e7c72ec0AFD02d218d805361f331).call{value: address(this).balance * 30 / 100}("");
    require(hsc);
  }

  function _mintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      userWallets[msg.sender]++;
      supply.increment();
      _safeMint(_receiver, supply.current());
    }
  }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"startTime_","type":"uint32"}],"name":"emergencyOverridePublicSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userWallets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040819052600060808190526200001b9160089162000206565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200004a9160099162000206565b50668e1bc9bf040000600c5561115c600d556005600e55600f805461ffff191690553480156200007957600080fd5b50604080518082018252600c81526b4d6f6e737465724d616e696160a01b6020808301918252835180850190945260028452614d4d60f01b908401528151919291620000c89160009162000206565b508051620000de90600190602084019062000206565b505050620000fb620000f56200013860201b60201c565b6200013c565b6200011f604051806080016040528060418152602001620027ed604191396200018e565b600b805463ffffffff191663625c7c10179055620002e9565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b03163314620001ed5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b80516200020290600a90602084019062000206565b5050565b8280546200021490620002ac565b90600052602060002090601f01602090048101928262000238576000855562000283565b82601f106200025357805160ff191683800117855562000283565b8280016001018555821562000283579182015b828111156200028357825182559160200191906001019062000266565b506200029192915062000295565b5090565b5b8082111562000291576000815560010162000296565b600181811c90821680620002c157607f821691505b60208210811415620002e357634e487b7160e01b600052602260045260246000fd5b50919050565b6124f480620002f96000396000f3fe6080604052600436106102255760003560e01c80636352211e11610123578063a22cb465116100ab578063d5abeb011161006f578063d5abeb011461062c578063e0a8085314610642578063e985e9c514610662578063efbd73f4146106ab578063f2fde38b146106cb57600080fd5b8063a22cb46514610597578063a45ba8e7146105b7578063b071401b146105cc578063b88d4fde146105ec578063c87b56dd1461060c57600080fd5b80637ec4a659116100f25780637ec4a6591461051b5780638da5cb5b1461053b57806394354fd01461055957806395d89b411461056f578063a0712d681461058457600080fd5b80636352211e1461049957806363e6ffdd146104b957806370a08231146104e6578063715018a61461050657600080fd5b80633ccfd60b116101b15780634fdd43cb116101755780634fdd43cb1461041657806351830227146104365780635503a0e8146104555780635c975abb1461046a57806362b99ad41461048457600080fd5b80633ccfd60b1461037457806342842e0e14610389578063438b6300146103a957806344a0d68a146103d657806345696963146103f657600080fd5b806313faede6116101f857806313faede6146102db57806316ba10e0146102ff57806316c38b3c1461031f57806318160ddd1461033f57806323b872dd1461035457600080fd5b806301ffc9a71461022a57806306fdde031461025f578063081812fc14610281578063095ea7b3146102b9575b600080fd5b34801561023657600080fd5b5061024a610245366004611e16565b6106eb565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061027461073d565b6040516102569190611e8b565b34801561028d57600080fd5b506102a161029c366004611e9e565b6107cf565b6040516001600160a01b039091168152602001610256565b3480156102c557600080fd5b506102d96102d4366004611ed3565b610869565b005b3480156102e757600080fd5b506102f1600c5481565b604051908152602001610256565b34801561030b57600080fd5b506102d961031a366004611f89565b61097f565b34801561032b57600080fd5b506102d961033a366004611fe2565b6109c0565b34801561034b57600080fd5b506102f16109fd565b34801561036057600080fd5b506102d961036f366004611ffd565b610a0d565b34801561038057600080fd5b506102d9610a3e565b34801561039557600080fd5b506102d96103a4366004611ffd565b610c62565b3480156103b557600080fd5b506103c96103c4366004612039565b610c7d565b6040516102569190612054565b3480156103e257600080fd5b506102d96103f1366004611e9e565b610d5e565b34801561040257600080fd5b506102d9610411366004612098565b610d8d565b34801561042257600080fd5b506102d9610431366004611f89565b610dd3565b34801561044257600080fd5b50600f5461024a90610100900460ff1681565b34801561046157600080fd5b50610274610e10565b34801561047657600080fd5b50600f5461024a9060ff1681565b34801561049057600080fd5b50610274610e9e565b3480156104a557600080fd5b506102a16104b4366004611e9e565b610eab565b3480156104c557600080fd5b506102f16104d4366004612039565b60106020526000908152604090205481565b3480156104f257600080fd5b506102f1610501366004612039565b610f22565b34801561051257600080fd5b506102d9610fa9565b34801561052757600080fd5b506102d9610536366004611f89565b610fdf565b34801561054757600080fd5b506006546001600160a01b03166102a1565b34801561056557600080fd5b506102f1600e5481565b34801561057b57600080fd5b5061027461101c565b6102d9610592366004611e9e565b61102b565b3480156105a357600080fd5b506102d96105b23660046120be565b61120c565b3480156105c357600080fd5b50610274611217565b3480156105d857600080fd5b506102d96105e7366004611e9e565b611224565b3480156105f857600080fd5b506102d96106073660046120f1565b611253565b34801561061857600080fd5b50610274610627366004611e9e565b611285565b34801561063857600080fd5b506102f1600d5481565b34801561064e57600080fd5b506102d961065d366004611fe2565b611404565b34801561066e57600080fd5b5061024a61067d36600461216d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106b757600080fd5b506102d96106c6366004612197565b611448565b3480156106d757600080fd5b506102d96106e6366004612039565b61147c565b60006001600160e01b031982166380ac58cd60e01b148061071c57506001600160e01b03198216635b5e139f60e01b145b8061073757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461074c906121ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610778906121ba565b80156107c55780601f1061079a576101008083540402835291602001916107c5565b820191906000526020600020905b8154815290600101906020018083116107a857829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661084d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061087482610eab565b9050806001600160a01b0316836001600160a01b031614156108e25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610844565b336001600160a01b03821614806108fe57506108fe813361067d565b6109705760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610844565b61097a8383611517565b505050565b6006546001600160a01b031633146109a95760405162461bcd60e51b8152600401610844906121f5565b80516109bc906009906020840190611d67565b5050565b6006546001600160a01b031633146109ea5760405162461bcd60e51b8152600401610844906121f5565b600f805460ff1916911515919091179055565b6000610a0860075490565b905090565b610a173382611585565b610a335760405162461bcd60e51b81526004016108449061222a565b61097a83838361167c565b6006546001600160a01b03163314610a685760405162461bcd60e51b8152600401610844906121f5565b600073348284911bbf67734704b565d0442b5cece2bcff6064610a8c47600a612291565b610a9691906122c6565b604051600081818185875af1925050503d8060008114610ad2576040519150601f19603f3d011682016040523d82523d6000602084013e610ad7565b606091505b5050905080610ae557600080fd5b60007356bda1c4e30221cd875c40640fefb5b51bf37bca6064610b0947601e612291565b610b1391906122c6565b604051600081818185875af1925050503d8060008114610b4f576040519150601f19603f3d011682016040523d82523d6000602084013e610b54565b606091505b5050905080610b6257600080fd5b600073b631b67859063bf88ecbc31b6c7809064c1d91bd6064610b8647601e612291565b610b9091906122c6565b604051600081818185875af1925050503d8060008114610bcc576040519150601f19603f3d011682016040523d82523d6000602084013e610bd1565b606091505b5050905080610bdf57600080fd5b60007338cb1c021668e7c72ec0afd02d218d805361f3316064610c0347601e612291565b610c0d91906122c6565b604051600081818185875af1925050503d8060008114610c49576040519150601f19603f3d011682016040523d82523d6000602084013e610c4e565b606091505b5050905080610c5c57600080fd5b50505050565b61097a83838360405180602001604052806000815250611253565b60606000610c8a83610f22565b905060008167ffffffffffffffff811115610ca757610ca7611efd565b604051908082528060200260200182016040528015610cd0578160200160208202803683370190505b509050600160005b8381108015610ce95750600d548211155b15610d54576000610cf983610eab565b9050866001600160a01b0316816001600160a01b03161415610d415782848381518110610d2857610d286122da565b602090810291909101015281610d3d816122f0565b9250505b82610d4b816122f0565b93505050610cd8565b5090949350505050565b6006546001600160a01b03163314610d885760405162461bcd60e51b8152600401610844906121f5565b600c55565b6006546001600160a01b03163314610db75760405162461bcd60e51b8152600401610844906121f5565b600b805463ffffffff191663ffffffff92909216919091179055565b6006546001600160a01b03163314610dfd5760405162461bcd60e51b8152600401610844906121f5565b80516109bc90600a906020840190611d67565b60098054610e1d906121ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610e49906121ba565b8015610e965780601f10610e6b57610100808354040283529160200191610e96565b820191906000526020600020905b815481529060010190602001808311610e7957829003601f168201915b505050505081565b60088054610e1d906121ba565b6000818152600260205260408120546001600160a01b0316806107375760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610844565b60006001600160a01b038216610f8d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610844565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610fd35760405162461bcd60e51b8152600401610844906121f5565b610fdd600061181c565b565b6006546001600160a01b031633146110095760405162461bcd60e51b8152600401610844906121f5565b80516109bc906008906020840190611d67565b60606001805461074c906121ba565b8060008111801561103e5750600e548111155b6110805760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610844565b600d548161108d60075490565b611097919061230b565b11156110dc5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610844565b80600c546110ea9190612291565b34101561112f5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610844565b600f5460ff16156111a85760405162461bcd60e51b815260206004820152603760248201527f5075626c6963206d696e74696e67206973207061757365642e2050726573616c60448201527f652069732070726f6261626c7920676f696e67206f6e2e0000000000000000006064820152608401610844565b600b544263ffffffff90911611156112025760405162461bcd60e51b815260206004820152601a60248201527f5075626c69632073616c65206973206e6f74206163746976652e0000000000006044820152606401610844565b6109bc338361186e565b6109bc3383836118cb565b600a8054610e1d906121ba565b6006546001600160a01b0316331461124e5760405162461bcd60e51b8152600401610844906121f5565b600e55565b61125d3383611585565b6112795760405162461bcd60e51b81526004016108449061222a565b610c5c8484848461199a565b6000818152600260205260409020546060906001600160a01b03166113045760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610844565b600f54610100900460ff166113a557600a8054611320906121ba565b80601f016020809104026020016040519081016040528092919081815260200182805461134c906121ba565b80156113995780601f1061136e57610100808354040283529160200191611399565b820191906000526020600020905b81548152906001019060200180831161137c57829003601f168201915b50505050509050919050565b60006113af6119cd565b905060008151116113cf57604051806020016040528060008152506113fd565b806113d9846119dc565b60096040516020016113ed93929190612323565b6040516020818303038152906040525b9392505050565b6006546001600160a01b0316331461142e5760405162461bcd60e51b8152600401610844906121f5565b600f80549115156101000261ff0019909216919091179055565b6006546001600160a01b031633146114725760405162461bcd60e51b8152600401610844906121f5565b6109bc818361186e565b6006546001600160a01b031633146114a65760405162461bcd60e51b8152600401610844906121f5565b6001600160a01b03811661150b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610844565b6115148161181c565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061154c82610eab565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166115fe5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610844565b600061160983610eab565b9050806001600160a01b0316846001600160a01b031614806116445750836001600160a01b0316611639846107cf565b6001600160a01b0316145b8061167457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661168f82610eab565b6001600160a01b0316146116f75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610844565b6001600160a01b0382166117595760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610844565b611764600082611517565b6001600160a01b038316600090815260036020526040812080546001929061178d9084906123e7565b90915550506001600160a01b03821660009081526003602052604081208054600192906117bb90849061230b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b8181101561097a57336000908152601060205260408120805491611894836122f0565b91905055506118a7600780546001019055565b6118b9836118b460075490565b611ada565b806118c3816122f0565b915050611871565b816001600160a01b0316836001600160a01b0316141561192d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610844565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6119a584848461167c565b6119b184848484611af4565b610c5c5760405162461bcd60e51b8152600401610844906123fe565b60606008805461074c906121ba565b606081611a005750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a2a5780611a14816122f0565b9150611a239050600a836122c6565b9150611a04565b60008167ffffffffffffffff811115611a4557611a45611efd565b6040519080825280601f01601f191660200182016040528015611a6f576020820181803683370190505b5090505b841561167457611a846001836123e7565b9150611a91600a86612450565b611a9c90603061230b565b60f81b818381518110611ab157611ab16122da565b60200101906001600160f81b031916908160001a905350611ad3600a866122c6565b9450611a73565b6109bc828260405180602001604052806000815250611bf2565b60006001600160a01b0384163b15611be757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611b38903390899088908890600401612464565b6020604051808303816000875af1925050508015611b73575060408051601f3d908101601f19168201909252611b70918101906124a1565b60015b611bcd573d808015611ba1576040519150601f19603f3d011682016040523d82523d6000602084013e611ba6565b606091505b508051611bc55760405162461bcd60e51b8152600401610844906123fe565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611674565b506001949350505050565b611bfc8383611c25565b611c096000848484611af4565b61097a5760405162461bcd60e51b8152600401610844906123fe565b6001600160a01b038216611c7b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610844565b6000818152600260205260409020546001600160a01b031615611ce05760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610844565b6001600160a01b0382166000908152600360205260408120805460019290611d0990849061230b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611d73906121ba565b90600052602060002090601f016020900481019282611d955760008555611ddb565b82601f10611dae57805160ff1916838001178555611ddb565b82800160010185558215611ddb579182015b82811115611ddb578251825591602001919060010190611dc0565b50611de7929150611deb565b5090565b5b80821115611de75760008155600101611dec565b6001600160e01b03198116811461151457600080fd5b600060208284031215611e2857600080fd5b81356113fd81611e00565b60005b83811015611e4e578181015183820152602001611e36565b83811115610c5c5750506000910152565b60008151808452611e77816020860160208601611e33565b601f01601f19169290920160200192915050565b6020815260006113fd6020830184611e5f565b600060208284031215611eb057600080fd5b5035919050565b80356001600160a01b0381168114611ece57600080fd5b919050565b60008060408385031215611ee657600080fd5b611eef83611eb7565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611f2e57611f2e611efd565b604051601f8501601f19908116603f01168101908282118183101715611f5657611f56611efd565b81604052809350858152868686011115611f6f57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611f9b57600080fd5b813567ffffffffffffffff811115611fb257600080fd5b8201601f81018413611fc357600080fd5b61167484823560208401611f13565b80358015158114611ece57600080fd5b600060208284031215611ff457600080fd5b6113fd82611fd2565b60008060006060848603121561201257600080fd5b61201b84611eb7565b925061202960208501611eb7565b9150604084013590509250925092565b60006020828403121561204b57600080fd5b6113fd82611eb7565b6020808252825182820181905260009190848201906040850190845b8181101561208c57835183529284019291840191600101612070565b50909695505050505050565b6000602082840312156120aa57600080fd5b813563ffffffff811681146113fd57600080fd5b600080604083850312156120d157600080fd5b6120da83611eb7565b91506120e860208401611fd2565b90509250929050565b6000806000806080858703121561210757600080fd5b61211085611eb7565b935061211e60208601611eb7565b925060408501359150606085013567ffffffffffffffff81111561214157600080fd5b8501601f8101871361215257600080fd5b61216187823560208401611f13565b91505092959194509250565b6000806040838503121561218057600080fd5b61218983611eb7565b91506120e860208401611eb7565b600080604083850312156121aa57600080fd5b823591506120e860208401611eb7565b600181811c908216806121ce57607f821691505b602082108114156121ef57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156122ab576122ab61227b565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826122d5576122d56122b0565b500490565b634e487b7160e01b600052603260045260246000fd5b60006000198214156123045761230461227b565b5060010190565b6000821982111561231e5761231e61227b565b500190565b6000845160206123368285838a01611e33565b8551918401916123498184848a01611e33565b8554920191600090600181811c908083168061236657607f831692505b85831081141561238457634e487b7160e01b85526022600452602485fd5b80801561239857600181146123a9576123d6565b60ff198516885283880195506123d6565b60008b81526020902060005b858110156123ce5781548a8201529084019088016123b5565b505083880195505b50939b9a5050505050505050505050565b6000828210156123f9576123f961227b565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261245f5761245f6122b0565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061249790830184611e5f565b9695505050505050565b6000602082840312156124b357600080fd5b81516113fd81611e0056fea2646970667358221220a23f30311ec12fc80cf8a3899ed9f2d9c2ccbddfd87b2c3da336c27fd666c08364736f6c634300080b0033697066733a2f2f516d58633951427a36626e665a3332504775435a7a387066353551313647726f68535a4a486750535175375977332f68696464656e2e6a736f6e

Deployed Bytecode

0x6080604052600436106102255760003560e01c80636352211e11610123578063a22cb465116100ab578063d5abeb011161006f578063d5abeb011461062c578063e0a8085314610642578063e985e9c514610662578063efbd73f4146106ab578063f2fde38b146106cb57600080fd5b8063a22cb46514610597578063a45ba8e7146105b7578063b071401b146105cc578063b88d4fde146105ec578063c87b56dd1461060c57600080fd5b80637ec4a659116100f25780637ec4a6591461051b5780638da5cb5b1461053b57806394354fd01461055957806395d89b411461056f578063a0712d681461058457600080fd5b80636352211e1461049957806363e6ffdd146104b957806370a08231146104e6578063715018a61461050657600080fd5b80633ccfd60b116101b15780634fdd43cb116101755780634fdd43cb1461041657806351830227146104365780635503a0e8146104555780635c975abb1461046a57806362b99ad41461048457600080fd5b80633ccfd60b1461037457806342842e0e14610389578063438b6300146103a957806344a0d68a146103d657806345696963146103f657600080fd5b806313faede6116101f857806313faede6146102db57806316ba10e0146102ff57806316c38b3c1461031f57806318160ddd1461033f57806323b872dd1461035457600080fd5b806301ffc9a71461022a57806306fdde031461025f578063081812fc14610281578063095ea7b3146102b9575b600080fd5b34801561023657600080fd5b5061024a610245366004611e16565b6106eb565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061027461073d565b6040516102569190611e8b565b34801561028d57600080fd5b506102a161029c366004611e9e565b6107cf565b6040516001600160a01b039091168152602001610256565b3480156102c557600080fd5b506102d96102d4366004611ed3565b610869565b005b3480156102e757600080fd5b506102f1600c5481565b604051908152602001610256565b34801561030b57600080fd5b506102d961031a366004611f89565b61097f565b34801561032b57600080fd5b506102d961033a366004611fe2565b6109c0565b34801561034b57600080fd5b506102f16109fd565b34801561036057600080fd5b506102d961036f366004611ffd565b610a0d565b34801561038057600080fd5b506102d9610a3e565b34801561039557600080fd5b506102d96103a4366004611ffd565b610c62565b3480156103b557600080fd5b506103c96103c4366004612039565b610c7d565b6040516102569190612054565b3480156103e257600080fd5b506102d96103f1366004611e9e565b610d5e565b34801561040257600080fd5b506102d9610411366004612098565b610d8d565b34801561042257600080fd5b506102d9610431366004611f89565b610dd3565b34801561044257600080fd5b50600f5461024a90610100900460ff1681565b34801561046157600080fd5b50610274610e10565b34801561047657600080fd5b50600f5461024a9060ff1681565b34801561049057600080fd5b50610274610e9e565b3480156104a557600080fd5b506102a16104b4366004611e9e565b610eab565b3480156104c557600080fd5b506102f16104d4366004612039565b60106020526000908152604090205481565b3480156104f257600080fd5b506102f1610501366004612039565b610f22565b34801561051257600080fd5b506102d9610fa9565b34801561052757600080fd5b506102d9610536366004611f89565b610fdf565b34801561054757600080fd5b506006546001600160a01b03166102a1565b34801561056557600080fd5b506102f1600e5481565b34801561057b57600080fd5b5061027461101c565b6102d9610592366004611e9e565b61102b565b3480156105a357600080fd5b506102d96105b23660046120be565b61120c565b3480156105c357600080fd5b50610274611217565b3480156105d857600080fd5b506102d96105e7366004611e9e565b611224565b3480156105f857600080fd5b506102d96106073660046120f1565b611253565b34801561061857600080fd5b50610274610627366004611e9e565b611285565b34801561063857600080fd5b506102f1600d5481565b34801561064e57600080fd5b506102d961065d366004611fe2565b611404565b34801561066e57600080fd5b5061024a61067d36600461216d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106b757600080fd5b506102d96106c6366004612197565b611448565b3480156106d757600080fd5b506102d96106e6366004612039565b61147c565b60006001600160e01b031982166380ac58cd60e01b148061071c57506001600160e01b03198216635b5e139f60e01b145b8061073757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461074c906121ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610778906121ba565b80156107c55780601f1061079a576101008083540402835291602001916107c5565b820191906000526020600020905b8154815290600101906020018083116107a857829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661084d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061087482610eab565b9050806001600160a01b0316836001600160a01b031614156108e25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610844565b336001600160a01b03821614806108fe57506108fe813361067d565b6109705760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610844565b61097a8383611517565b505050565b6006546001600160a01b031633146109a95760405162461bcd60e51b8152600401610844906121f5565b80516109bc906009906020840190611d67565b5050565b6006546001600160a01b031633146109ea5760405162461bcd60e51b8152600401610844906121f5565b600f805460ff1916911515919091179055565b6000610a0860075490565b905090565b610a173382611585565b610a335760405162461bcd60e51b81526004016108449061222a565b61097a83838361167c565b6006546001600160a01b03163314610a685760405162461bcd60e51b8152600401610844906121f5565b600073348284911bbf67734704b565d0442b5cece2bcff6064610a8c47600a612291565b610a9691906122c6565b604051600081818185875af1925050503d8060008114610ad2576040519150601f19603f3d011682016040523d82523d6000602084013e610ad7565b606091505b5050905080610ae557600080fd5b60007356bda1c4e30221cd875c40640fefb5b51bf37bca6064610b0947601e612291565b610b1391906122c6565b604051600081818185875af1925050503d8060008114610b4f576040519150601f19603f3d011682016040523d82523d6000602084013e610b54565b606091505b5050905080610b6257600080fd5b600073b631b67859063bf88ecbc31b6c7809064c1d91bd6064610b8647601e612291565b610b9091906122c6565b604051600081818185875af1925050503d8060008114610bcc576040519150601f19603f3d011682016040523d82523d6000602084013e610bd1565b606091505b5050905080610bdf57600080fd5b60007338cb1c021668e7c72ec0afd02d218d805361f3316064610c0347601e612291565b610c0d91906122c6565b604051600081818185875af1925050503d8060008114610c49576040519150601f19603f3d011682016040523d82523d6000602084013e610c4e565b606091505b5050905080610c5c57600080fd5b50505050565b61097a83838360405180602001604052806000815250611253565b60606000610c8a83610f22565b905060008167ffffffffffffffff811115610ca757610ca7611efd565b604051908082528060200260200182016040528015610cd0578160200160208202803683370190505b509050600160005b8381108015610ce95750600d548211155b15610d54576000610cf983610eab565b9050866001600160a01b0316816001600160a01b03161415610d415782848381518110610d2857610d286122da565b602090810291909101015281610d3d816122f0565b9250505b82610d4b816122f0565b93505050610cd8565b5090949350505050565b6006546001600160a01b03163314610d885760405162461bcd60e51b8152600401610844906121f5565b600c55565b6006546001600160a01b03163314610db75760405162461bcd60e51b8152600401610844906121f5565b600b805463ffffffff191663ffffffff92909216919091179055565b6006546001600160a01b03163314610dfd5760405162461bcd60e51b8152600401610844906121f5565b80516109bc90600a906020840190611d67565b60098054610e1d906121ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610e49906121ba565b8015610e965780601f10610e6b57610100808354040283529160200191610e96565b820191906000526020600020905b815481529060010190602001808311610e7957829003601f168201915b505050505081565b60088054610e1d906121ba565b6000818152600260205260408120546001600160a01b0316806107375760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610844565b60006001600160a01b038216610f8d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610844565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610fd35760405162461bcd60e51b8152600401610844906121f5565b610fdd600061181c565b565b6006546001600160a01b031633146110095760405162461bcd60e51b8152600401610844906121f5565b80516109bc906008906020840190611d67565b60606001805461074c906121ba565b8060008111801561103e5750600e548111155b6110805760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610844565b600d548161108d60075490565b611097919061230b565b11156110dc5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610844565b80600c546110ea9190612291565b34101561112f5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610844565b600f5460ff16156111a85760405162461bcd60e51b815260206004820152603760248201527f5075626c6963206d696e74696e67206973207061757365642e2050726573616c60448201527f652069732070726f6261626c7920676f696e67206f6e2e0000000000000000006064820152608401610844565b600b544263ffffffff90911611156112025760405162461bcd60e51b815260206004820152601a60248201527f5075626c69632073616c65206973206e6f74206163746976652e0000000000006044820152606401610844565b6109bc338361186e565b6109bc3383836118cb565b600a8054610e1d906121ba565b6006546001600160a01b0316331461124e5760405162461bcd60e51b8152600401610844906121f5565b600e55565b61125d3383611585565b6112795760405162461bcd60e51b81526004016108449061222a565b610c5c8484848461199a565b6000818152600260205260409020546060906001600160a01b03166113045760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610844565b600f54610100900460ff166113a557600a8054611320906121ba565b80601f016020809104026020016040519081016040528092919081815260200182805461134c906121ba565b80156113995780601f1061136e57610100808354040283529160200191611399565b820191906000526020600020905b81548152906001019060200180831161137c57829003601f168201915b50505050509050919050565b60006113af6119cd565b905060008151116113cf57604051806020016040528060008152506113fd565b806113d9846119dc565b60096040516020016113ed93929190612323565b6040516020818303038152906040525b9392505050565b6006546001600160a01b0316331461142e5760405162461bcd60e51b8152600401610844906121f5565b600f80549115156101000261ff0019909216919091179055565b6006546001600160a01b031633146114725760405162461bcd60e51b8152600401610844906121f5565b6109bc818361186e565b6006546001600160a01b031633146114a65760405162461bcd60e51b8152600401610844906121f5565b6001600160a01b03811661150b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610844565b6115148161181c565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061154c82610eab565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166115fe5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610844565b600061160983610eab565b9050806001600160a01b0316846001600160a01b031614806116445750836001600160a01b0316611639846107cf565b6001600160a01b0316145b8061167457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661168f82610eab565b6001600160a01b0316146116f75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610844565b6001600160a01b0382166117595760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610844565b611764600082611517565b6001600160a01b038316600090815260036020526040812080546001929061178d9084906123e7565b90915550506001600160a01b03821660009081526003602052604081208054600192906117bb90849061230b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005b8181101561097a57336000908152601060205260408120805491611894836122f0565b91905055506118a7600780546001019055565b6118b9836118b460075490565b611ada565b806118c3816122f0565b915050611871565b816001600160a01b0316836001600160a01b0316141561192d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610844565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6119a584848461167c565b6119b184848484611af4565b610c5c5760405162461bcd60e51b8152600401610844906123fe565b60606008805461074c906121ba565b606081611a005750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a2a5780611a14816122f0565b9150611a239050600a836122c6565b9150611a04565b60008167ffffffffffffffff811115611a4557611a45611efd565b6040519080825280601f01601f191660200182016040528015611a6f576020820181803683370190505b5090505b841561167457611a846001836123e7565b9150611a91600a86612450565b611a9c90603061230b565b60f81b818381518110611ab157611ab16122da565b60200101906001600160f81b031916908160001a905350611ad3600a866122c6565b9450611a73565b6109bc828260405180602001604052806000815250611bf2565b60006001600160a01b0384163b15611be757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611b38903390899088908890600401612464565b6020604051808303816000875af1925050508015611b73575060408051601f3d908101601f19168201909252611b70918101906124a1565b60015b611bcd573d808015611ba1576040519150601f19603f3d011682016040523d82523d6000602084013e611ba6565b606091505b508051611bc55760405162461bcd60e51b8152600401610844906123fe565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611674565b506001949350505050565b611bfc8383611c25565b611c096000848484611af4565b61097a5760405162461bcd60e51b8152600401610844906123fe565b6001600160a01b038216611c7b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610844565b6000818152600260205260409020546001600160a01b031615611ce05760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610844565b6001600160a01b0382166000908152600360205260408120805460019290611d0990849061230b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611d73906121ba565b90600052602060002090601f016020900481019282611d955760008555611ddb565b82601f10611dae57805160ff1916838001178555611ddb565b82800160010185558215611ddb579182015b82811115611ddb578251825591602001919060010190611dc0565b50611de7929150611deb565b5090565b5b80821115611de75760008155600101611dec565b6001600160e01b03198116811461151457600080fd5b600060208284031215611e2857600080fd5b81356113fd81611e00565b60005b83811015611e4e578181015183820152602001611e36565b83811115610c5c5750506000910152565b60008151808452611e77816020860160208601611e33565b601f01601f19169290920160200192915050565b6020815260006113fd6020830184611e5f565b600060208284031215611eb057600080fd5b5035919050565b80356001600160a01b0381168114611ece57600080fd5b919050565b60008060408385031215611ee657600080fd5b611eef83611eb7565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611f2e57611f2e611efd565b604051601f8501601f19908116603f01168101908282118183101715611f5657611f56611efd565b81604052809350858152868686011115611f6f57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611f9b57600080fd5b813567ffffffffffffffff811115611fb257600080fd5b8201601f81018413611fc357600080fd5b61167484823560208401611f13565b80358015158114611ece57600080fd5b600060208284031215611ff457600080fd5b6113fd82611fd2565b60008060006060848603121561201257600080fd5b61201b84611eb7565b925061202960208501611eb7565b9150604084013590509250925092565b60006020828403121561204b57600080fd5b6113fd82611eb7565b6020808252825182820181905260009190848201906040850190845b8181101561208c57835183529284019291840191600101612070565b50909695505050505050565b6000602082840312156120aa57600080fd5b813563ffffffff811681146113fd57600080fd5b600080604083850312156120d157600080fd5b6120da83611eb7565b91506120e860208401611fd2565b90509250929050565b6000806000806080858703121561210757600080fd5b61211085611eb7565b935061211e60208601611eb7565b925060408501359150606085013567ffffffffffffffff81111561214157600080fd5b8501601f8101871361215257600080fd5b61216187823560208401611f13565b91505092959194509250565b6000806040838503121561218057600080fd5b61218983611eb7565b91506120e860208401611eb7565b600080604083850312156121aa57600080fd5b823591506120e860208401611eb7565b600181811c908216806121ce57607f821691505b602082108114156121ef57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156122ab576122ab61227b565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826122d5576122d56122b0565b500490565b634e487b7160e01b600052603260045260246000fd5b60006000198214156123045761230461227b565b5060010190565b6000821982111561231e5761231e61227b565b500190565b6000845160206123368285838a01611e33565b8551918401916123498184848a01611e33565b8554920191600090600181811c908083168061236657607f831692505b85831081141561238457634e487b7160e01b85526022600452602485fd5b80801561239857600181146123a9576123d6565b60ff198516885283880195506123d6565b60008b81526020902060005b858110156123ce5781548a8201529084019088016123b5565b505083880195505b50939b9a5050505050505050505050565b6000828210156123f9576123f961227b565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261245f5761245f6122b0565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061249790830184611e5f565b9695505050505050565b6000602082840312156124b357600080fd5b81516113fd81611e0056fea2646970667358221220a23f30311ec12fc80cf8a3899ed9f2d9c2ccbddfd87b2c3da336c27fd666c08364736f6c634300080b0033

Deployed Bytecode Sourcemap

38659:4592:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26139:305;;;;;;;;;;-1:-1:-1;26139:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;26139:305:0;;;;;;;;27084:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28643:221::-;;;;;;;;;;-1:-1:-1;28643:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;28643:221:0;1528:203:1;28166:411:0;;;;;;;;;;-1:-1:-1;28166:411:0;;;;;:::i;:::-;;:::i;:::-;;38970:32;;;;;;;;;;;;;;;;;;;2319:25:1;;;2307:2;2292:18;38970:32:0;2173:177:1;41957:100:0;;;;;;;;;;-1:-1:-1;41957:100:0;;;;;:::i;:::-;;:::i;42063:77::-;;;;;;;;;;-1:-1:-1;42063:77:0;;;;;:::i;:::-;;:::i;39754:89::-;;;;;;;;;;;;;:::i;29393:339::-;;;;;;;;;;-1:-1:-1;29393:339:0;;;;;:::i;:::-;;:::i;42279:615::-;;;;;;;;;;;;;:::i;29803:185::-;;;;;;;;;;-1:-1:-1;29803:185:0;;;;;:::i;:::-;;:::i;40283:635::-;;;;;;;;;;-1:-1:-1;40283:635:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41497:74::-;;;;;;;;;;-1:-1:-1;41497:74:0;;;;;:::i;:::-;;:::i;42146:127::-;;;;;;;;;;-1:-1:-1;42146:127:0;;;;;:::i;:::-;;:::i;41713:132::-;;;;;;;;;;-1:-1:-1;41713:132:0;;;;;:::i;:::-;;:::i;39143:28::-;;;;;;;;;;-1:-1:-1;39143:28:0;;;;;;;;;;;38859:33;;;;;;;;;;;;;:::i;39087:26::-;;;;;;;;;;-1:-1:-1;39087:26:0;;;;;;;;38815:28;;;;;;;;;;;;;:::i;26778:239::-;;;;;;;;;;-1:-1:-1;26778:239:0;;;;;:::i;:::-;;:::i;39178:46::-;;;;;;;;;;-1:-1:-1;39178:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;26508:208;;;;;;;;;;-1:-1:-1;26508:208:0;;;;;:::i;:::-;;:::i;7127:103::-;;;;;;;;;;;;;:::i;41851:100::-;;;;;;;;;;-1:-1:-1;41851:100:0;;;;;:::i;:::-;;:::i;6476:87::-;;;;;;;;;;-1:-1:-1;6549:6:0;;-1:-1:-1;;;;;6549:6:0;6476:87;;39043:37;;;;;;;;;;;;;;;;27253:104;;;;;;;;;;;;;:::i;39849:293::-;;;;;;:::i;:::-;;:::i;28936:155::-;;;;;;;;;;-1:-1:-1;28936:155:0;;;;;:::i;:::-;;:::i;38897:31::-;;;;;;;;;;;;;:::i;41577:130::-;;;;;;;;;;-1:-1:-1;41577:130:0;;;;;:::i;:::-;;:::i;30059:328::-;;;;;;;;;;-1:-1:-1;30059:328:0;;;;;:::i;:::-;;:::i;40924:480::-;;;;;;;;;;-1:-1:-1;40924:480:0;;;;;:::i;:::-;;:::i;39007:31::-;;;;;;;;;;;;;;;;41410:81;;;;;;;;;;-1:-1:-1;41410:81:0;;;;;:::i;:::-;;:::i;29162:164::-;;;;;;;;;;-1:-1:-1;29162:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;29283:25:0;;;29259:4;29283:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29162:164;40150:127;;;;;;;;;;-1:-1:-1;40150:127:0;;;;;:::i;:::-;;:::i;7385:201::-;;;;;;;;;;-1:-1:-1;7385:201:0;;;;;:::i;:::-;;:::i;26139:305::-;26241:4;-1:-1:-1;;;;;;26278:40:0;;-1:-1:-1;;;26278:40:0;;:105;;-1:-1:-1;;;;;;;26335:48:0;;-1:-1:-1;;;26335:48:0;26278:105;:158;;;-1:-1:-1;;;;;;;;;;19017:40:0;;;26400:36;26258:178;26139:305;-1:-1:-1;;26139:305:0:o;27084:100::-;27138:13;27171:5;27164:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27084:100;:::o;28643:221::-;28719:7;31986:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31986:16:0;28739:73;;;;-1:-1:-1;;;28739:73:0;;7414:2:1;28739:73:0;;;7396:21:1;7453:2;7433:18;;;7426:30;7492:34;7472:18;;;7465:62;-1:-1:-1;;;7543:18:1;;;7536:42;7595:19;;28739:73:0;;;;;;;;;-1:-1:-1;28832:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28832:24:0;;28643:221::o;28166:411::-;28247:13;28263:23;28278:7;28263:14;:23::i;:::-;28247:39;;28311:5;-1:-1:-1;;;;;28305:11:0;:2;-1:-1:-1;;;;;28305:11:0;;;28297:57;;;;-1:-1:-1;;;28297:57:0;;7827:2:1;28297:57:0;;;7809:21:1;7866:2;7846:18;;;7839:30;7905:34;7885:18;;;7878:62;-1:-1:-1;;;7956:18:1;;;7949:31;7997:19;;28297:57:0;7625:397:1;28297:57:0;5280:10;-1:-1:-1;;;;;28389:21:0;;;;:62;;-1:-1:-1;28414:37:0;28431:5;5280:10;29162:164;:::i;28414:37::-;28367:168;;;;-1:-1:-1;;;28367:168:0;;8229:2:1;28367:168:0;;;8211:21:1;8268:2;8248:18;;;8241:30;8307:34;8287:18;;;8280:62;8378:26;8358:18;;;8351:54;8422:19;;28367:168:0;8027:420:1;28367:168:0;28548:21;28557:2;28561:7;28548:8;:21::i;:::-;28236:341;28166:411;;:::o;41957:100::-;6549:6;;-1:-1:-1;;;;;6549:6:0;5280:10;6696:23;6688:68;;;;-1:-1:-1;;;6688:68:0;;;;;;;:::i;:::-;42029:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;41957:100:::0;:::o;42063:77::-;6549:6;;-1:-1:-1;;;;;6549:6:0;5280:10;6696:23;6688:68;;;;-1:-1:-1;;;6688:68:0;;;;;;;:::i;:::-;42119:6:::1;:15:::0;;-1:-1:-1;;42119:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42063:77::o;39754:89::-;39798:7;39821:16;:6;1896:14;;1804:114;39821:16;39814:23;;39754:89;:::o;29393:339::-;29588:41;5280:10;29621:7;29588:18;:41::i;:::-;29580:103;;;;-1:-1:-1;;;29580:103:0;;;;;;;:::i;:::-;29696:28;29706:4;29712:2;29716:7;29696:9;:28::i;42279:615::-;6549:6;;-1:-1:-1;;;;;6549:6:0;5280:10;6696:23;6688:68;;;;-1:-1:-1;;;6688:68:0;;;;;;;:::i;:::-;42324:7:::1;42345:42;42430:3;42401:26;:21;42425:2;42401:26;:::i;:::-;:32;;;;:::i;:::-;42337:101;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42323:115;;;42453:2;42445:11;;;::::0;::::1;;42466:8;42488:42;42573:3;42544:26;:21;42568:2;42544:26;:::i;:::-;:32;;;;:::i;:::-;42480:101;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42465:116;;;42596:3;42588:12;;;::::0;::::1;;42610:8;42632:42;42717:3;42688:26;:21;42712:2;42688:26;:::i;:::-;:32;;;;:::i;:::-;42624:101;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42609:116;;;42740:3;42732:12;;;::::0;::::1;;42754:8;42776:42;42861:3;42832:26;:21;42856:2;42832:26;:::i;:::-;:32;;;;:::i;:::-;42768:101;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42753:116;;;42884:3;42876:12;;;::::0;::::1;;42316:578;;;;42279:615::o:0;29803:185::-;29941:39;29958:4;29964:2;29968:7;29941:39;;;;;;;;;;;;:16;:39::i;40283:635::-;40358:16;40386:23;40412:17;40422:6;40412:9;:17::i;:::-;40386:43;;40436:30;40483:15;40469:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40469:30:0;-1:-1:-1;40436:63:0;-1:-1:-1;40531:1:0;40506:22;40575:309;40600:15;40582;:33;:64;;;;;40637:9;;40619:14;:27;;40582:64;40575:309;;;40657:25;40685:23;40693:14;40685:7;:23::i;:::-;40657:51;;40744:6;-1:-1:-1;;;;;40723:27:0;:17;-1:-1:-1;;;;;40723:27:0;;40719:131;;;40796:14;40763:13;40777:15;40763:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;40823:17;;;;:::i;:::-;;;;40719:131;40860:16;;;;:::i;:::-;;;;40648:236;40575:309;;;-1:-1:-1;40899:13:0;;40283:635;-1:-1:-1;;;;40283:635:0:o;41497:74::-;6549:6;;-1:-1:-1;;;;;6549:6:0;5280:10;6696:23;6688:68;;;;-1:-1:-1;;;6688:68:0;;;;;;;:::i;:::-;41553:4:::1;:12:::0;41497:74::o;42146:127::-;6549:6;;-1:-1:-1;;;;;6549:6:0;5280:10;6696:23;6688:68;;;;-1:-1:-1;;;6688:68:0;;;;;;;:::i;:::-;42235:19:::1;:32:::0;;-1:-1:-1;;42235:32:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;42146:127::o;41713:132::-;6549:6;;-1:-1:-1;;;;;6549:6:0;5280:10;6696:23;6688:68;;;;-1:-1:-1;;;6688:68:0;;;;;;;:::i;:::-;41801:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;38859:33::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38815:28::-;;;;;;;:::i;26778:239::-;26850:7;26886:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26886:16:0;26921:19;26913:73;;;;-1:-1:-1;;;26913:73:0;;10477:2:1;26913:73:0;;;10459:21:1;10516:2;10496:18;;;10489:30;10555:34;10535:18;;;10528:62;-1:-1:-1;;;10606:18:1;;;10599:39;10655:19;;26913:73:0;10275:405:1;26508:208:0;26580:7;-1:-1:-1;;;;;26608:19:0;;26600:74;;;;-1:-1:-1;;;26600:74:0;;10887:2:1;26600:74:0;;;10869:21:1;10926:2;10906:18;;;10899:30;10965:34;10945:18;;;10938:62;-1:-1:-1;;;11016:18:1;;;11009:40;11066:19;;26600:74:0;10685:406:1;26600:74:0;-1:-1:-1;;;;;;26692:16:0;;;;;:9;:16;;;;;;;26508:208::o;7127:103::-;6549:6;;-1:-1:-1;;;;;6549:6:0;5280:10;6696:23;6688:68;;;;-1:-1:-1;;;6688:68:0;;;;;;;:::i;:::-;7192:30:::1;7219:1;7192:18;:30::i;:::-;7127:103::o:0;41851:100::-;6549:6;;-1:-1:-1;;;;;6549:6:0;5280:10;6696:23;6688:68;;;;-1:-1:-1;;;6688:68:0;;;;;;;:::i;:::-;41923:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;27253:104::-:0;27309:13;27342:7;27335:14;;;;;:::i;39849:293::-;39914:11;39518:1;39504:11;:15;:52;;;;;39538:18;;39523:11;:33;;39504:52;39496:84;;;;-1:-1:-1;;;39496:84:0;;11298:2:1;39496:84:0;;;11280:21:1;11337:2;11317:18;;;11310:30;-1:-1:-1;;;11356:18:1;;;11349:49;11415:18;;39496:84:0;11096:343:1;39496:84:0;39629:9;;39614:11;39595:16;:6;1896:14;;1804:114;39595:16;:30;;;;:::i;:::-;:43;;39587:76;;;;-1:-1:-1;;;39587:76:0;;11779:2:1;39587:76:0;;;11761:21:1;11818:2;11798:18;;;11791:30;-1:-1:-1;;;11837:18:1;;;11830:50;11897:18;;39587:76:0;11577:344:1;39587:76:0;39698:11;39691:4;;:18;;;;:::i;:::-;39678:9;:31;;39670:63;;;;-1:-1:-1;;;39670:63:0;;12128:2:1;39670:63:0;;;12110:21:1;12167:2;12147:18;;;12140:30;-1:-1:-1;;;12186:18:1;;;12179:49;12245:18;;39670:63:0;11926:343:1;39670:63:0;39943:6:::1;::::0;::::1;;39942:7;39934:75;;;::::0;-1:-1:-1;;;39934:75:0;;12476:2:1;39934:75:0::1;::::0;::::1;12458:21:1::0;12515:2;12495:18;;;12488:30;12554:34;12534:18;;;12527:62;12625:25;12605:18;;;12598:53;12668:19;;39934:75:0::1;12274:419:1::0;39934:75:0::1;40024:19;::::0;40047:15:::1;40024:19;::::0;;::::1;:38;;40016:77;;;::::0;-1:-1:-1;;;40016:77:0;;12900:2:1;40016:77:0::1;::::0;::::1;12882:21:1::0;12939:2;12919:18;;;12912:30;12978:28;12958:18;;;12951:56;13024:18;;40016:77:0::1;12698:350:1::0;40016:77:0::1;40102:34;40112:10;40124:11;40102:9;:34::i;28936:155::-:0;29031:52;5280:10;29064:8;29074;29031:18;:52::i;38897:31::-;;;;;;;:::i;41577:130::-;6549:6;;-1:-1:-1;;;;;6549:6:0;5280:10;6696:23;6688:68;;;;-1:-1:-1;;;6688:68:0;;;;;;;:::i;:::-;41661:18:::1;:40:::0;41577:130::o;30059:328::-;30234:41;5280:10;30267:7;30234:18;:41::i;:::-;30226:103;;;;-1:-1:-1;;;30226:103:0;;;;;;;:::i;:::-;30340:39;30354:4;30360:2;30364:7;30373:5;30340:13;:39::i;40924:480::-;31962:4;31986:16;;;:7;:16;;;;;;41023:13;;-1:-1:-1;;;;;31986:16:0;41048:84;;;;-1:-1:-1;;;41048:84:0;;13255:2:1;41048:84:0;;;13237:21:1;13294:2;13274:18;;;13267:30;13333:34;13313:18;;;13306:62;-1:-1:-1;;;13384:18:1;;;13377:45;13439:19;;41048:84:0;13053:411:1;41048:84:0;41145:8;;;;;;;41141:64;;41180:17;41173:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40924:480;;;:::o;41141:64::-;41213:28;41244:10;:8;:10::i;:::-;41213:41;;41299:1;41274:14;41268:28;:32;:130;;;;;;;;;;;;;;;;;41336:14;41352:19;:8;:17;:19::i;:::-;41373:9;41319:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41268:130;41261:137;40924:480;-1:-1:-1;;;40924:480:0:o;41410:81::-;6549:6;;-1:-1:-1;;;;;6549:6:0;5280:10;6696:23;6688:68;;;;-1:-1:-1;;;6688:68:0;;;;;;;:::i;:::-;41468:8:::1;:17:::0;;;::::1;;;;-1:-1:-1::0;;41468:17:0;;::::1;::::0;;;::::1;::::0;;41410:81::o;40150:127::-;6549:6;;-1:-1:-1;;;;;6549:6:0;5280:10;6696:23;6688:68;;;;-1:-1:-1;;;6688:68:0;;;;;;;:::i;:::-;40238:33:::1;40248:9;40259:11;40238:9;:33::i;7385:201::-:0;6549:6;;-1:-1:-1;;;;;6549:6:0;5280:10;6696:23;6688:68;;;;-1:-1:-1;;;6688:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7474:22:0;::::1;7466:73;;;::::0;-1:-1:-1;;;7466:73:0;;15329:2:1;7466:73:0::1;::::0;::::1;15311:21:1::0;15368:2;15348:18;;;15341:30;15407:34;15387:18;;;15380:62;-1:-1:-1;;;15458:18:1;;;15451:36;15504:19;;7466:73:0::1;15127:402:1::0;7466:73:0::1;7550:28;7569:8;7550:18;:28::i;:::-;7385:201:::0;:::o;35879:174::-;35954:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;35954:29:0;-1:-1:-1;;;;;35954:29:0;;;;;;;;:24;;36008:23;35954:24;36008:14;:23::i;:::-;-1:-1:-1;;;;;35999:46:0;;;;;;;;;;;35879:174;;:::o;32191:348::-;32284:4;31986:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31986:16:0;32301:73;;;;-1:-1:-1;;;32301:73:0;;15736:2:1;32301:73:0;;;15718:21:1;15775:2;15755:18;;;15748:30;15814:34;15794:18;;;15787:62;-1:-1:-1;;;15865:18:1;;;15858:42;15917:19;;32301:73:0;15534:408:1;32301:73:0;32385:13;32401:23;32416:7;32401:14;:23::i;:::-;32385:39;;32454:5;-1:-1:-1;;;;;32443:16:0;:7;-1:-1:-1;;;;;32443:16:0;;:51;;;;32487:7;-1:-1:-1;;;;;32463:31:0;:20;32475:7;32463:11;:20::i;:::-;-1:-1:-1;;;;;32463:31:0;;32443:51;:87;;;-1:-1:-1;;;;;;29283:25:0;;;29259:4;29283:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32498:32;32435:96;32191:348;-1:-1:-1;;;;32191:348:0:o;35183:578::-;35342:4;-1:-1:-1;;;;;35315:31:0;:23;35330:7;35315:14;:23::i;:::-;-1:-1:-1;;;;;35315:31:0;;35307:85;;;;-1:-1:-1;;;35307:85:0;;16149:2:1;35307:85:0;;;16131:21:1;16188:2;16168:18;;;16161:30;16227:34;16207:18;;;16200:62;-1:-1:-1;;;16278:18:1;;;16271:39;16327:19;;35307:85:0;15947:405:1;35307:85:0;-1:-1:-1;;;;;35411:16:0;;35403:65;;;;-1:-1:-1;;;35403:65:0;;16559:2:1;35403:65:0;;;16541:21:1;16598:2;16578:18;;;16571:30;16637:34;16617:18;;;16610:62;-1:-1:-1;;;16688:18:1;;;16681:34;16732:19;;35403:65:0;16357:400:1;35403:65:0;35585:29;35602:1;35606:7;35585:8;:29::i;:::-;-1:-1:-1;;;;;35627:15:0;;;;;;:9;:15;;;;;:20;;35646:1;;35627:15;:20;;35646:1;;35627:20;:::i;:::-;;;;-1:-1:-1;;;;;;;35658:13:0;;;;;;:9;:13;;;;;:18;;35675:1;;35658:13;:18;;35675:1;;35658:18;:::i;:::-;;;;-1:-1:-1;;35687:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35687:21:0;-1:-1:-1;;;;;35687:21:0;;;;;;;;;35726:27;;35687:16;;35726:27;;;;;;;35183:578;;;:::o;7746:191::-;7839:6;;;-1:-1:-1;;;;;7856:17:0;;;-1:-1:-1;;;;;;7856:17:0;;;;;;;7889:40;;7839:6;;;7856:17;7839:6;;7889:40;;7820:16;;7889:40;7809:128;7746:191;:::o;42900:238::-;42980:9;42975:158;42999:11;42995:1;:15;42975:158;;;43038:10;43026:23;;;;:11;:23;;;;;:25;;;;;;:::i;:::-;;;;;;43060:18;:6;2015:19;;2033:1;2015:19;;;1926:127;43060:18;43087:38;43097:9;43108:16;:6;1896:14;;1804:114;43108:16;43087:9;:38::i;:::-;43012:3;;;;:::i;:::-;;;;42975:158;;36195:315;36350:8;-1:-1:-1;;;;;36341:17:0;:5;-1:-1:-1;;;;;36341:17:0;;;36333:55;;;;-1:-1:-1;;;36333:55:0;;17094:2:1;36333:55:0;;;17076:21:1;17133:2;17113:18;;;17106:30;17172:27;17152:18;;;17145:55;17217:18;;36333:55:0;16892:349:1;36333:55:0;-1:-1:-1;;;;;36399:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;36399:46:0;;;;;;;;;;36461:41;;540::1;;;36461::0;;513:18:1;36461:41:0;;;;;;;36195:315;;;:::o;31269:::-;31426:28;31436:4;31442:2;31446:7;31426:9;:28::i;:::-;31473:48;31496:4;31502:2;31506:7;31515:5;31473:22;:48::i;:::-;31465:111;;;;-1:-1:-1;;;31465:111:0;;;;;;;:::i;43144:104::-;43204:13;43233:9;43226:16;;;;;:::i;2762:723::-;2818:13;3039:10;3035:53;;-1:-1:-1;;3066:10:0;;;;;;;;;;;;-1:-1:-1;;;3066:10:0;;;;;2762:723::o;3035:53::-;3113:5;3098:12;3154:78;3161:9;;3154:78;;3187:8;;;;:::i;:::-;;-1:-1:-1;3210:10:0;;-1:-1:-1;3218:2:0;3210:10;;:::i;:::-;;;3154:78;;;3242:19;3274:6;3264:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3264:17:0;;3242:39;;3292:154;3299:10;;3292:154;;3326:11;3336:1;3326:11;;:::i;:::-;;-1:-1:-1;3395:10:0;3403:2;3395:5;:10;:::i;:::-;3382:24;;:2;:24;:::i;:::-;3369:39;;3352:6;3359;3352:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3352:56:0;;;;;;;;-1:-1:-1;3423:11:0;3432:2;3423:11;;:::i;:::-;;;3292:154;;32881:110;32957:26;32967:2;32971:7;32957:26;;;;;;;;;;;;:9;:26::i;37075:799::-;37230:4;-1:-1:-1;;;;;37251:13:0;;9087:20;9135:8;37247:620;;37287:72;;-1:-1:-1;;;37287:72:0;;-1:-1:-1;;;;;37287:36:0;;;;;:72;;5280:10;;37338:4;;37344:7;;37353:5;;37287:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37287:72:0;;;;;;;;-1:-1:-1;;37287:72:0;;;;;;;;;;;;:::i;:::-;;;37283:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37529:13:0;;37525:272;;37572:60;;-1:-1:-1;;;37572:60:0;;;;;;;:::i;37525:272::-;37747:6;37741:13;37732:6;37728:2;37724:15;37717:38;37283:529;-1:-1:-1;;;;;;37410:51:0;-1:-1:-1;;;37410:51:0;;-1:-1:-1;37403:58:0;;37247:620;-1:-1:-1;37851:4:0;37075:799;;;;;;:::o;33218:321::-;33348:18;33354:2;33358:7;33348:5;:18::i;:::-;33399:54;33430:1;33434:2;33438:7;33447:5;33399:22;:54::i;:::-;33377:154;;;;-1:-1:-1;;;33377:154:0;;;;;;;:::i;33875:382::-;-1:-1:-1;;;;;33955:16:0;;33947:61;;;;-1:-1:-1;;;33947:61:0;;18732:2:1;33947:61:0;;;18714:21:1;;;18751:18;;;18744:30;18810:34;18790:18;;;18783:62;18862:18;;33947:61:0;18530:356:1;33947:61:0;31962:4;31986:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31986:16:0;:30;34019:58;;;;-1:-1:-1;;;34019:58:0;;19093:2:1;34019:58:0;;;19075:21:1;19132:2;19112:18;;;19105:30;19171;19151:18;;;19144:58;19219:18;;34019:58:0;18891:352:1;34019:58:0;-1:-1:-1;;;;;34148:13:0;;;;;;:9;:13;;;;;:18;;34165:1;;34148:13;:18;;34165:1;;34148:18;:::i;:::-;;;;-1:-1:-1;;34177:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34177:21:0;-1:-1:-1;;;;;34177:21:0;;;;;;;;34216:33;;34177:16;;;34216:33;;34177:16;;34216:33;33875:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:127::-;2416:10;2411:3;2407:20;2404:1;2397:31;2447:4;2444:1;2437:15;2471:4;2468:1;2461:15;2487:632;2552:5;2582:18;2623:2;2615:6;2612:14;2609:40;;;2629:18;;:::i;:::-;2704:2;2698:9;2672:2;2758:15;;-1:-1:-1;;2754:24:1;;;2780:2;2750:33;2746:42;2734:55;;;2804:18;;;2824:22;;;2801:46;2798:72;;;2850:18;;:::i;:::-;2890:10;2886:2;2879:22;2919:6;2910:15;;2949:6;2941;2934:22;2989:3;2980:6;2975:3;2971:16;2968:25;2965:45;;;3006:1;3003;2996:12;2965:45;3056:6;3051:3;3044:4;3036:6;3032:17;3019:44;3111:1;3104:4;3095:6;3087;3083:19;3079:30;3072:41;;;;2487:632;;;;;:::o;3124:451::-;3193:6;3246:2;3234:9;3225:7;3221:23;3217:32;3214:52;;;3262:1;3259;3252:12;3214:52;3302:9;3289:23;3335:18;3327:6;3324:30;3321:50;;;3367:1;3364;3357:12;3321:50;3390:22;;3443:4;3435:13;;3431:27;-1:-1:-1;3421:55:1;;3472:1;3469;3462:12;3421:55;3495:74;3561:7;3556:2;3543:16;3538:2;3534;3530:11;3495:74;:::i;3580:160::-;3645:20;;3701:13;;3694:21;3684:32;;3674:60;;3730:1;3727;3720:12;3745:180;3801:6;3854:2;3842:9;3833:7;3829:23;3825:32;3822:52;;;3870:1;3867;3860:12;3822:52;3893:26;3909:9;3893:26;:::i;3930:328::-;4007:6;4015;4023;4076:2;4064:9;4055:7;4051:23;4047:32;4044:52;;;4092:1;4089;4082:12;4044:52;4115:29;4134:9;4115:29;:::i;:::-;4105:39;;4163:38;4197:2;4186:9;4182:18;4163:38;:::i;:::-;4153:48;;4248:2;4237:9;4233:18;4220:32;4210:42;;3930:328;;;;;:::o;4263:186::-;4322:6;4375:2;4363:9;4354:7;4350:23;4346:32;4343:52;;;4391:1;4388;4381:12;4343:52;4414:29;4433:9;4414:29;:::i;4454:632::-;4625:2;4677:21;;;4747:13;;4650:18;;;4769:22;;;4596:4;;4625:2;4848:15;;;;4822:2;4807:18;;;4596:4;4891:169;4905:6;4902:1;4899:13;4891:169;;;4966:13;;4954:26;;5035:15;;;;5000:12;;;;4927:1;4920:9;4891:169;;;-1:-1:-1;5077:3:1;;4454:632;-1:-1:-1;;;;;;4454:632:1:o;5091:276::-;5149:6;5202:2;5190:9;5181:7;5177:23;5173:32;5170:52;;;5218:1;5215;5208:12;5170:52;5257:9;5244:23;5307:10;5300:5;5296:22;5289:5;5286:33;5276:61;;5333:1;5330;5323:12;5372:254;5437:6;5445;5498:2;5486:9;5477:7;5473:23;5469:32;5466:52;;;5514:1;5511;5504:12;5466:52;5537:29;5556:9;5537:29;:::i;:::-;5527:39;;5585:35;5616:2;5605:9;5601:18;5585:35;:::i;:::-;5575:45;;5372:254;;;;;:::o;5631:667::-;5726:6;5734;5742;5750;5803:3;5791:9;5782:7;5778:23;5774:33;5771:53;;;5820:1;5817;5810:12;5771:53;5843:29;5862:9;5843:29;:::i;:::-;5833:39;;5891:38;5925:2;5914:9;5910:18;5891:38;:::i;:::-;5881:48;;5976:2;5965:9;5961:18;5948:32;5938:42;;6031:2;6020:9;6016:18;6003:32;6058:18;6050:6;6047:30;6044:50;;;6090:1;6087;6080:12;6044:50;6113:22;;6166:4;6158:13;;6154:27;-1:-1:-1;6144:55:1;;6195:1;6192;6185:12;6144:55;6218:74;6284:7;6279:2;6266:16;6261:2;6257;6253:11;6218:74;:::i;:::-;6208:84;;;5631:667;;;;;;;:::o;6303:260::-;6371:6;6379;6432:2;6420:9;6411:7;6407:23;6403:32;6400:52;;;6448:1;6445;6438:12;6400:52;6471:29;6490:9;6471:29;:::i;:::-;6461:39;;6519:38;6553:2;6542:9;6538:18;6519:38;:::i;6568:254::-;6636:6;6644;6697:2;6685:9;6676:7;6672:23;6668:32;6665:52;;;6713:1;6710;6703:12;6665:52;6749:9;6736:23;6726:33;;6778:38;6812:2;6801:9;6797:18;6778:38;:::i;6827:380::-;6906:1;6902:12;;;;6949;;;6970:61;;7024:4;7016:6;7012:17;7002:27;;6970:61;7077:2;7069:6;7066:14;7046:18;7043:38;7040:161;;;7123:10;7118:3;7114:20;7111:1;7104:31;7158:4;7155:1;7148:15;7186:4;7183:1;7176:15;7040:161;;6827:380;;;:::o;8452:356::-;8654:2;8636:21;;;8673:18;;;8666:30;8732:34;8727:2;8712:18;;8705:62;8799:2;8784:18;;8452:356::o;8813:413::-;9015:2;8997:21;;;9054:2;9034:18;;;9027:30;9093:34;9088:2;9073:18;;9066:62;-1:-1:-1;;;9159:2:1;9144:18;;9137:47;9216:3;9201:19;;8813:413::o;9231:127::-;9292:10;9287:3;9283:20;9280:1;9273:31;9323:4;9320:1;9313:15;9347:4;9344:1;9337:15;9363:168;9403:7;9469:1;9465;9461:6;9457:14;9454:1;9451:21;9446:1;9439:9;9432:17;9428:45;9425:71;;;9476:18;;:::i;:::-;-1:-1:-1;9516:9:1;;9363:168::o;9536:127::-;9597:10;9592:3;9588:20;9585:1;9578:31;9628:4;9625:1;9618:15;9652:4;9649:1;9642:15;9668:120;9708:1;9734;9724:35;;9739:18;;:::i;:::-;-1:-1:-1;9773:9:1;;9668:120::o;10003:127::-;10064:10;10059:3;10055:20;10052:1;10045:31;10095:4;10092:1;10085:15;10119:4;10116:1;10109:15;10135:135;10174:3;-1:-1:-1;;10195:17:1;;10192:43;;;10215:18;;:::i;:::-;-1:-1:-1;10262:1:1;10251:13;;10135:135::o;11444:128::-;11484:3;11515:1;11511:6;11508:1;11505:13;11502:39;;;11521:18;;:::i;:::-;-1:-1:-1;11557:9:1;;11444:128::o;13595:1527::-;13819:3;13857:6;13851:13;13883:4;13896:51;13940:6;13935:3;13930:2;13922:6;13918:15;13896:51;:::i;:::-;14010:13;;13969:16;;;;14032:55;14010:13;13969:16;14054:15;;;14032:55;:::i;:::-;14176:13;;14109:20;;;14149:1;;14236;14258:18;;;;14311;;;;14338:93;;14416:4;14406:8;14402:19;14390:31;;14338:93;14479:2;14469:8;14466:16;14446:18;14443:40;14440:167;;;-1:-1:-1;;;14506:33:1;;14562:4;14559:1;14552:15;14592:4;14513:3;14580:17;14440:167;14623:18;14650:110;;;;14774:1;14769:328;;;;14616:481;;14650:110;-1:-1:-1;;14685:24:1;;14671:39;;14730:20;;;;-1:-1:-1;14650:110:1;;14769:328;13542:1;13535:14;;;13579:4;13566:18;;14864:1;14878:169;14892:8;14889:1;14886:15;14878:169;;;14974:14;;14959:13;;;14952:37;15017:16;;;;14909:10;;14878:169;;;14882:3;;15078:8;15071:5;15067:20;15060:27;;14616:481;-1:-1:-1;15113:3:1;;13595:1527;-1:-1:-1;;;;;;;;;;;13595:1527:1:o;16762:125::-;16802:4;16830:1;16827;16824:8;16821:34;;;16835:18;;:::i;:::-;-1:-1:-1;16872:9:1;;16762:125::o;17246:414::-;17448:2;17430:21;;;17487:2;17467:18;;;17460:30;17526:34;17521:2;17506:18;;17499:62;-1:-1:-1;;;17592:2:1;17577:18;;17570:48;17650:3;17635:19;;17246:414::o;17665:112::-;17697:1;17723;17713:35;;17728:18;;:::i;:::-;-1:-1:-1;17762:9:1;;17665:112::o;17782:489::-;-1:-1:-1;;;;;18051:15:1;;;18033:34;;18103:15;;18098:2;18083:18;;18076:43;18150:2;18135:18;;18128:34;;;18198:3;18193:2;18178:18;;18171:31;;;17976:4;;18219:46;;18245:19;;18237:6;18219:46;:::i;:::-;18211:54;17782:489;-1:-1:-1;;;;;;17782:489:1:o;18276:249::-;18345:6;18398:2;18386:9;18377:7;18373:23;18369:32;18366:52;;;18414:1;18411;18404:12;18366:52;18446:9;18440:16;18465:30;18489:5;18465:30;:::i

Swarm Source

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