ETH Price: $2,606.97 (+0.99%)

Token

The Mysterious World (The Mysterious World)
 

Overview

Max Total Supply

6,666 The Mysterious World

Holders

2,380

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 The Mysterious World
0x81755424bf7370b655e6744af626abee1681dc9b
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:
MysteriousWorld

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// # MysteriousWorld
// Read more at https://www.themysterious.world/utility

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);
}


/**
 * @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;
}


/**
 * @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);
}


/**
 * @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);
}


/**
 * @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);
            }
        }
    }
}


/**
 * @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;
    }
}


/**
 * @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);
    }
}


/**
 * @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;
    }
}


/**
 * @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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

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


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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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


/**
 * @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;
    }
}

// The Creature World and Superlative Secret Society is used so we check who holds a nft
// for the free mint claim system
interface Creature {
    function ownerOf(uint256 token) external view returns(address);
    function tokenOfOwnerByIndex(address inhabitant, uint256 index) external view returns(uint256);
    function balanceOf(address inhabitant) external view returns(uint256);
}

interface Superlative {
    function ownerOf(uint256 token) external view returns(address);
    function tokenOfOwnerByIndex(address inhabitant, uint256 index) external view returns(uint256);
    function balanceOf(address inhabitant) external view returns(uint256);
}

// The runes contract is used to burn for sacrifices and update balances on transfers
interface IRunes {
    function burn(address inhabitant, uint256 cost) external;
    function updateRunes(address from, address to) external;
}

// Allows us to mint with $LOOKS instead of ETH
interface Looks {
    function transferFrom(address from, address to, uint256 amount) external;
    function balanceOf(address owner) external view returns(uint256);
}

/*
 * o               .        ___---___                    .                   
 *        .              .--\        --.     .     .         .
 *                     ./.;_.\     __/~ \.     
 *                    /;  / `-'  __\    . \                            
 *  .        .       / ,--'     / .   .;   \        |
 *                  | .|       /       __   |      -O-       .
 *                 |__/    __ |  . ;   \ | . |      |
 *                 |      /  \\_    . ;| \___|    
 *    .    o       |      \  .~\\___,--'     |           .
 *                  |     | . ; ~~~~\_    __|
 *     |             \    \   .  .  ; \  /_/   .
 *    -O-        .    \   /         . |  ~/                  .
 *     |    .          ~\ \   .      /  /~          o
 *   .                   ~--___ ; ___--~       
 *                  .          ---         .   MYSTERIOUS WORLD
 */
contract MysteriousWorld is ERC721, Ownable {
    using Address  for address;
    using Counters for Counters.Counter;

    Counters.Counter private Population;
    Counters.Counter private sacrificed; // tracks the amount of rituals performed
    Counters.Counter private sacred; // tracks the 1/1s created from rituals

    Creature public creature;
    Superlative public superlative;
    IRunes public runes;
    Looks public looks;

    string private baseURI;

    uint256 constant public maxInhabitants  = 6666;
    uint256 constant public maxRituals      = 3333; // max amount of rituals that can be performed
    uint256 constant public teamInhabitants = 66; // the amount of inhabitants that will be reserved to the teams wallet
    uint256 constant public maxWInhabitants = 900; // the amount of free inhabitants given to the community
    uint256 constant public maxFInhabitants = 100; // the amount of free inhabitants given to holders of superlative & creatureworld - fcfs basis
    uint256 constant public maxPerTxn       = 6;

    uint256 public whitelistInhabitantsClaimed; // tracks the amount of mints claimed from giveaway winners
    uint256 public freeInhabitantsClaimed; // tracks the amount of free mints claimed from superlative & creatureworld holders
    uint256 public teamInhabitantsClaimed; // tracks the amount reserved for the team wallet
    uint256 public saleActive = 0; // the period for when public mint starts
    uint256 public claimActive = 0; // the period for free mint claiming - once the claimActive timestamp is reached, remaing supply goes to public fcfs

    uint256 public mintPrice   = 0.06 ether;
    uint256 public ritualPrice = 100 ether; // base price for rituals is 100 $RUNES
    uint256 public ritualRate  = 0.5 ether; // the rate increases the ritualPrice by the amount of rituals performed
    address public ritualWallet; // where the ritualized tokens go when u perform a ritual on them
    uint256 public looksPrice = 37 ether; // will be updated once contract is deployed if price difference is to high
    address public looksWallet;

    bool public templeAvailable = false; // once revealed, the temple will be available for rituals to be performed

    mapping(uint256 => bool)    public ritualizedInhabitants; // tracks the tokens that survived the ritual process
    mapping(uint256 => bool)    public uniqueInhabitants; // tracks the tokens that became gods
    mapping(address => uint256) public claimedW; // tracks to see what wallets claimed their whitelisted free mints
    mapping(address => uint256) public claimedF; // tracks to see what wallets claimed the free mints for the superlative & creatureworld

    event performRitualEvent(address caller, uint256 vessel, uint256 sacrifice);
    event performSacredRitualEvent(address caller, uint256 vessel, uint256 sacrifice);

    /*
     * # isTempleOpen
     * only allows you to perform a ritual if its enabled - this will be set after reveal
     */
    modifier isTempleOpen() {
        require(templeAvailable, "The temple is not ready yet");
        _;
    }

    /*
     * # inhabitantOwner
     * checks if you own the tokens your sacrificing
     */
    modifier inhabitantOwner(uint256 inhabitant) {
        require(ownerOf(inhabitant) == msg.sender, "You can't use another persons inhabitants");
        _;
    }

    /*
     * # ascendedOwner
     * checks if the inhabitant passed is ascended
     */
    modifier ascendedOwner(uint256 inhabitant) {
        require(ritualizedInhabitants[inhabitant], "This inhabitant needs to sacrifice another inhabitant to ascend");
        _;
    }

    /*
     * # isSaleActive
     * allows inhabitants to be sold...
     */
    modifier isSaleActive() {
        require(block.timestamp > saleActive, "Inhabitants aren't born yet");
        _;
    }

    /*
     * # isClaimActive
     * allows inhabitants to be taken for free... use this for the greater good
     */
    modifier isClaimActive() {
        require(block.timestamp < claimActive, "All inhabitants are gone");
        _;
    }

    constructor(address burner, address rare) ERC721("The Mysterious World", "The Mysterious World") {
        ritualWallet = burner;
        looksWallet = rare;
    }

    /*
     * # getAmountOfCreaturesHeld
     * returns the total amount of creature world nfts a wallet holds
     */
    function getAmountOfCreaturesHeld(address holder) public view returns(uint256) {
        return creature.balanceOf(holder);
    }

    /*
     * # getAmountOfSuperlativesHeld
     * returns the total amount of superlatives nfts a wallet holds
     */
    function getAmountOfSuperlativesHeld(address holder) public view returns(uint256) {
        return superlative.balanceOf(holder);
    }

    /*
     * # checkIfClaimedW
     * checks if the giveaway winners minted their tokens
     */
    function checkIfClaimedW(address holder) public view returns(uint256) {
        return claimedW[holder];
    }

    /*
     * # checkIfClaimedF
     * checks if the superlative and creature holders minted their free tokens
     */
    function checkIfClaimedF(address holder) public view returns(uint256) {
        return claimedF[holder];
    }

    /*
     * # addWhitelistWallets
     * adds the addresses to claimedW while setting the amount each address can claim
     */
    function addWhitelistWallets(address[] calldata winners) external payable onlyOwner {
        for (uint256 wallet;wallet < winners.length;wallet++) {
            claimedW[winners[wallet]] = 1;
        }
    }
    
    /*
     * # mint
     * mints a inhabitant - godspeed
     */
    function mint(uint256 amount) public payable isSaleActive {
        require(tx.origin == msg.sender, "Can't mint from other contracts!");
        require(amount > 0 && amount <= maxPerTxn, "Your amount must be between 1 and 6");

        if (block.timestamp <= claimActive) {
            require(Population.current() + amount <= (maxInhabitants - (maxWInhabitants + maxFInhabitants)), "Not enough inhabitants for that");
        } else {
            require(Population.current() + amount <= maxInhabitants, "Not enough inhabitants for that");
        }

        require(mintPrice * amount == msg.value, "Mint Price is not correct");
        
        for (uint256 i = 0;i < amount;i++) {
            _safeMint(msg.sender, Population.current());
            Population.increment();
        }
    }

    /*
     * # mintWhitelist
     * mints a free inhabitant from the whitelist wallets
     */
    function mintWhitelist() public payable isSaleActive isClaimActive {
        uint256 currentInhabitants = Population.current();

        require(tx.origin == msg.sender, "Can't mint from other contracts!");
        require(currentInhabitants + 1 <= maxInhabitants, "No inhabitants left");
        require(whitelistInhabitantsClaimed + 1 <= maxWInhabitants, "No inhabitants left");
        require(claimedW[msg.sender] == 1, "You don't have permission to be here outsider");

        _safeMint(msg.sender, currentInhabitants);
        
        Population.increment();
        claimedW[msg.sender] = 0;
        whitelistInhabitantsClaimed++;

        delete currentInhabitants;
    }

    /*
     * # mintFList
     * mints a free inhabitant if your holding a creature world or superlative token - can only be claimed once fcfs
     */
    function mintFList() public payable isSaleActive isClaimActive {
        uint256 currentInhabitants = Population.current();

        require(tx.origin == msg.sender, "Can't mint from other contracts!");
        require(currentInhabitants + 1 <= maxInhabitants, "No inhabitants left");
        require(freeInhabitantsClaimed + 1 <= maxFInhabitants, "No inhabitants left");
        require(getAmountOfCreaturesHeld(msg.sender) >= 1 || getAmountOfSuperlativesHeld(msg.sender) >= 1, "You don't have permission to be here outsider");
        require(claimedF[msg.sender] < 1, "You already took a inhabitant");

        _safeMint(msg.sender, currentInhabitants);

        Population.increment();
        claimedF[msg.sender] = 1;
        freeInhabitantsClaimed++;

        delete currentInhabitants;
    }

    /*
     * # mintWithLooks
     * allows you to mint with $LOOKS token - still need to pay gas :(
     */
    function mintWithLooks(uint256 amount) public payable isSaleActive {
        uint256 currentInhabitants = Population.current();

        require(tx.origin == msg.sender, "Can't mint from other contracts!");
        require(amount > 0 && amount <= maxPerTxn, "Your amount must be between 1 and 6");

        if (block.timestamp <= claimActive) {
            require(currentInhabitants + amount <= (maxInhabitants - (maxWInhabitants + maxFInhabitants)), "Not enough inhabitants for that");
        } else {
            require(currentInhabitants + amount <= maxInhabitants, "Not enough inhabitants for that");
        }

        require(looks.balanceOf(msg.sender) >= looksPrice * amount, "Not enough $LOOKS to buy a inhabitant");
        
        looks.transferFrom(msg.sender, looksWallet, looksPrice * amount);

        for (uint256 i = 0;i < amount;i++) {
            _safeMint(msg.sender, currentInhabitants + i);

            Population.increment();
        }

        delete currentInhabitants;
    }

    /*
     * # reserveInhabitants
     * mints the amount provided for the team wallet - the amount is capped by teamInhabitants
     */
    function reserveInhabitants(uint256 amount) public payable onlyOwner {
        uint256 currentInhabitants = Population.current();

        require(teamInhabitantsClaimed + amount < teamInhabitants, "We've run out of inhabitants for the team");

        for (uint256 i = 0;i < amount;i++) {
            _safeMint(msg.sender, currentInhabitants + i);

            Population.increment();
            teamInhabitantsClaimed++;
        }

        delete currentInhabitants;
    }

    /*
     * # performRitual
     * performing the ritual will burn one of the tokens passed and upgrade the first token passed. upgrading will
     * change the metadata of the image and add to the sacrifice goals for the project.
     */
    function performRitual(uint256 vessel, uint256 sacrifice) public payable inhabitantOwner(vessel) inhabitantOwner(sacrifice) isTempleOpen {
        require(vessel != sacrifice, "You can't sacrifice the same inhabitants");
        require(!ritualizedInhabitants[vessel] && !ritualizedInhabitants[sacrifice], "You can't sacrifice ascended inhabitants with those of the lower class");

        // burn the $RUNES and transfer the sacrificed token to the burn wallet
        runes.burn(msg.sender, ritualPrice + (ritualRate * sacrificed.current()));
        safeTransferFrom(msg.sender, ritualWallet, sacrifice, "");

        // track the tokens that ascended & add to the global goal
        sacrificed.increment();
        ritualizedInhabitants[vessel] = true;

        emit performRitualEvent(msg.sender, vessel, sacrifice);
    }

    /*
     * # performSacredRight
     * this is performed during the 10% sacrifical goals for the 1/1s. check the utility page for more info
     */
    function performSacredRitual(uint256 vessel, uint256 sacrifice) public payable inhabitantOwner(vessel) inhabitantOwner(sacrifice) ascendedOwner(vessel) ascendedOwner(sacrifice) isTempleOpen {
        uint256 currentGoal = 333 * sacred.current(); // 10% of maxRituals 

        require(vessel != sacrifice, "You can't sacrifice the same inhabitants");
        require(sacrificed.current() >= currentGoal, "Not enough sacrifices to discover a God!");

         // burn the $RUNES and transfer the sacrificed token to the burn wallet
        runes.burn(msg.sender, ritualPrice + (ritualRate * sacrificed.current()));
        safeTransferFrom(msg.sender, ritualWallet, sacrifice, "");

        ritualizedInhabitants[vessel] = false;
        uniqueInhabitants[vessel] = true;
        sacrificed.increment();
        sacred.increment();

        emit performSacredRitualEvent(msg.sender, vessel, sacrifice);
    }

    /*
     * # getCaptives
     * returns all the tokens a wallet holds
     */
    function getCaptives(address inhabitant) public view returns(uint256[] memory) {
        uint256 population = Population.current();
        uint256 amount     = balanceOf(inhabitant);
        uint256 selector   = 0;

        uint256[] memory inhabitants = new uint256[](amount);

        for (uint256 i = 0;i < population;i++) {
            if (ownerOf(i) == inhabitant) {
                inhabitants[selector] = i;
                selector++;
            }
        }

        return inhabitants;
    }

    /*
     * # totalSupply
     */
    function totalSupply() external view returns(uint256) {
        return Population.current();
    }

    /*
     * # getSacrificed
     */
    function getSacrificed() external view returns(uint256) {
        return sacrificed.current();
    }

    /*
     * # getSacred
     */
    function getSacred() external view returns(uint256) {
        return sacred.current();
    }

    /*
     * # _baseURI
     */
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    /*
     * # setBaseURI
     */
    function setBaseURI(string memory metadataUrl) public payable onlyOwner {
        baseURI = metadataUrl;
    }

    /*
     * # withdraw
     * withdraws the funds from the smart contract to the owner
     */
    function withdraw() public payable onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);

        delete balance;
    }

    /*
     * # setSaleSettings
     * sets the drop time and the claimimg time
     */
    function setSaleSettings(uint256 saleTime, uint256 claimTime) public payable onlyOwner {
        saleActive  = saleTime;
        claimActive = claimTime;
    }

    /*
     * # setMintPrice
     * sets the mint price for the sale incase we need to change it
     */
    function setMintPrice(uint256 price) public payable onlyOwner {
        mintPrice = price;
    }

    /*
     * # setLooksPrice
     * sets the price of $LOOKS to mint with incase we need to set it multiple times
     */
    function setLooksPrice(uint256 price) public payable onlyOwner {
        looksPrice = price;
    }

    /*
     * # setRitualSettings
     * allows us to change the ritual price, rate, and whether ritual is enabled or not
     */
    function setRitualSettings(uint256 price, uint256 rate, bool available) public payable onlyOwner {
        ritualPrice     = price;
        ritualRate      = rate;
        templeAvailable = available;
    }

    /*
     * # setCollectionInterfaces
     * sets the interfaces for creatureworld, superlative, and runes
     */
    function setCollectionInterfaces(address creatureContract, address superlativeContract, address runesContract, address looksContract) public payable onlyOwner {
        creature    = Creature(creatureContract);
        superlative = Superlative(superlativeContract);
        runes       = IRunes(runesContract);
        looks       = Looks(looksContract);
    }

    /*
     * # transferFrom
     */
    function transferFrom(address from, address to, uint256 inhabitant) public override {
        runes.updateRunes(from, to);

        ERC721.transferFrom(from, to, inhabitant);
    }

    /*
     * # safeTransferFrom
     */
    function safeTransferFrom(address from, address to, uint256 inhabitant) public override {
        safeTransferFrom(from, to, inhabitant, "");
    }
    
    function safeTransferFrom(address from, address to, uint256 inhabitant, bytes memory data) public override {
        runes.updateRunes(from, to);

        ERC721.safeTransferFrom(from, to, inhabitant, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"burner","type":"address"},{"internalType":"address","name":"rare","type":"address"}],"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"vessel","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sacrifice","type":"uint256"}],"name":"performRitualEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"vessel","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sacrifice","type":"uint256"}],"name":"performSacredRitualEvent","type":"event"},{"inputs":[{"internalType":"address[]","name":"winners","type":"address[]"}],"name":"addWhitelistWallets","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"checkIfClaimedF","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"checkIfClaimedW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimActive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedF","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creature","outputs":[{"internalType":"contract Creature","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeInhabitantsClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getAmountOfCreaturesHeld","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getAmountOfSuperlativesHeld","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"inhabitant","type":"address"}],"name":"getCaptives","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSacred","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSacrificed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"looks","outputs":[{"internalType":"contract Looks","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"looksPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"looksWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFInhabitants","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxInhabitants","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTxn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxRituals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWInhabitants","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintFList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintWithLooks","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vessel","type":"uint256"},{"internalType":"uint256","name":"sacrifice","type":"uint256"}],"name":"performRitual","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vessel","type":"uint256"},{"internalType":"uint256","name":"sacrifice","type":"uint256"}],"name":"performSacredRitual","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reserveInhabitants","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"ritualPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ritualRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ritualWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ritualizedInhabitants","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"runes","outputs":[{"internalType":"contract IRunes","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"inhabitant","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":"inhabitant","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"metadataUrl","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"creatureContract","type":"address"},{"internalType":"address","name":"superlativeContract","type":"address"},{"internalType":"address","name":"runesContract","type":"address"},{"internalType":"address","name":"looksContract","type":"address"}],"name":"setCollectionInterfaces","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setLooksPrice","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"bool","name":"available","type":"bool"}],"name":"setRitualSettings","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"saleTime","type":"uint256"},{"internalType":"uint256","name":"claimTime","type":"uint256"}],"name":"setSaleSettings","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"superlative","outputs":[{"internalType":"contract Superlative","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamInhabitants","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamInhabitantsClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"templeAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"inhabitant","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uniqueInhabitants","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistInhabitantsClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000601281905560135566d529ae9e86000060145568056bc75e2d631000006015556706f05b59d3b200006016556802017a67f7317400006018556019805460ff60a01b191690553480156200005957600080fd5b5060405162003914380380620039148339810160408190526200007c9162000252565b60408051808201825260148082527f546865204d7973746572696f757320576f726c64000000000000000000000000602080840182815285518087019096529285528401528151919291620000d4916000916200018f565b508051620000ea9060019060208401906200018f565b50505062000107620001016200013960201b60201c565b6200013d565b601780546001600160a01b039384166001600160a01b03199182161790915560198054929093169116179055620002c7565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200019d906200028a565b90600052602060002090601f016020900481019282620001c157600085556200020c565b82601f10620001dc57805160ff19168380011785556200020c565b828001600101855582156200020c579182015b828111156200020c578251825591602001919060010190620001ef565b506200021a9291506200021e565b5090565b5b808211156200021a57600081556001016200021f565b80516001600160a01b03811681146200024d57600080fd5b919050565b600080604083850312156200026657600080fd5b620002718362000235565b9150620002816020840162000235565b90509250929050565b600181811c908216806200029f57607f821691505b60208210811415620002c157634e487b7160e01b600052602260045260246000fd5b50919050565b61363d80620002d76000396000f3fe6080604052600436106103ce5760003560e01c806370a08231116101fd578063b4ff922611610118578063dac13f6d116100ab578063e985e9c51161007a578063e985e9c514610a72578063f2fde38b14610abb578063f4a0a52814610adb578063f4d2656d14610aee578063f600456f14610b0457600080fd5b8063dac13f6d14610a0a578063dcb066cf14610a2a578063e7663f5914610a3d578063e901366f14610a6a57600080fd5b8063bcd18b7c116100e7578063bcd18b7c146109a8578063c87b56dd146109be578063c9247403146109de578063d4a6a2fd146109f457600080fd5b8063b4ff922614610928578063b549a45014610948578063b88d4fde1461095b578063b8ec6a3e1461097b57600080fd5b806396c56399116101905780639f39d4191161015f5780639f39d419146108b5578063a0712d68146108d5578063a22cb465146108e8578063af9666b41461090857600080fd5b806396c563991461083f57806397901f9c1461086f57806399bb35af146108825780639dd33ae9146108a257600080fd5b80638233de99116101cc5780638233de99146107e35780638da5cb5b146107f6578063915992b21461081457806395d89b411461082a57600080fd5b806370a0823114610784578063715018a6146107a45780637df9f718146107b95780637f2a9d6a146107ce57600080fd5b80632a9fd3e4116102ed578063530136d6116102805780636817c76c1161024f5780636817c76c1461071857806368428a1b1461072e578063697f2c7914610744578063699d4dc91461075757600080fd5b8063530136d61461068f57806355f804b3146106c5578063630b5f41146106d85780636352211e146106f857600080fd5b806342842e0e116102bc57806342842e0e146106195780634e0ea0b21461063957806350d7c9bc146106595780635177068a1461067a57600080fd5b80632a9fd3e4146105e15780632d3df31f146105f45780633cb51994146105fc5780633ccfd60b1461061157600080fd5b806318160ddd1161036557806323b872dd1161033457806323b872dd146105455780632475fc3214610565578063255f66131461059b578063281af86e146105b157600080fd5b806318160ddd146104e75780631a38f777146104fc5780631cf72c141461051257806320db28c21461053257600080fd5b80630c48063d116103a15780630c48063d146104845780630ca69012146104a85780630fc12313146104be578063105c338d146104d157600080fd5b806301ffc9a7146103d357806306fdde0314610408578063081812fc1461042a578063095ea7b314610462575b600080fd5b3480156103df57600080fd5b506103f36103ee366004612f80565b610b19565b60405190151581526020015b60405180910390f35b34801561041457600080fd5b5061041d610b6b565b6040516103ff9190613168565b34801561043657600080fd5b5061044a610445366004613003565b610bfd565b6040516001600160a01b0390911681526020016103ff565b34801561046e57600080fd5b5061048261047d366004612ee1565b610c97565b005b34801561049057600080fd5b5061049a60185481565b6040519081526020016103ff565b3480156104b457600080fd5b5061049a60115481565b6104826104cc366004612f0b565b610dad565b3480156104dd57600080fd5b5061049a60165481565b3480156104f357600080fd5b5061049a610e3b565b34801561050857600080fd5b5061049a60105481565b34801561051e57600080fd5b50600c5461044a906001600160a01b031681565b610482610540366004613003565b610e4b565b34801561055157600080fd5b50610482610560366004612dff565b6110f4565b34801561057157600080fd5b5061049a610580366004612d5d565b6001600160a01b03166000908152601d602052604090205490565b3480156105a757600080fd5b5061049a60155481565b3480156105bd57600080fd5b506103f36105cc366004613003565b601a6020526000908152604090205460ff1681565b6104826105ef366004612dab565b611166565b6104826111e0565b34801561060857600080fd5b5061049a600681565b610482611344565b34801561062557600080fd5b50610482610634366004612dff565b6113a1565b34801561064557600080fd5b50600d5461044a906001600160a01b031681565b34801561066557600080fd5b506019546103f390600160a01b900460ff1681565b34801561068657600080fd5b5061049a606481565b34801561069b57600080fd5b5061049a6106aa366004612d5d565b6001600160a01b03166000908152601c602052604090205490565b6104826106d3366004612fba565b6113bc565b3480156106e457600080fd5b5061049a6106f3366004612d5d565b6113f9565b34801561070457600080fd5b5061044a610713366004613003565b611478565b34801561072457600080fd5b5061049a60145481565b34801561073a57600080fd5b5061049a60125481565b610482610752366004613057565b6114ef565b34801561076357600080fd5b50610777610772366004612d5d565b611540565b6040516103ff9190613124565b34801561079057600080fd5b5061049a61079f366004612d5d565b611619565b3480156107b057600080fd5b506104826116a0565b3480156107c557600080fd5b5061049a604281565b3480156107da57600080fd5b5061049a6116d6565b6104826107f1366004613035565b6116e1565b34801561080257600080fd5b506006546001600160a01b031661044a565b34801561082057600080fd5b5061049a610d0581565b34801561083657600080fd5b5061041d611716565b34801561084b57600080fd5b506103f361085a366004613003565b601b6020526000908152604090205460ff1681565b61048261087d366004613003565b611725565b34801561088e57600080fd5b5060175461044a906001600160a01b031681565b6104826108b0366004613035565b61181a565b3480156108c157600080fd5b5060195461044a906001600160a01b031681565b6104826108e3366004613003565b611b29565b3480156108f457600080fd5b50610482610903366004612eb7565b611cb8565b34801561091457600080fd5b50600b5461044a906001600160a01b031681565b34801561093457600080fd5b5061049a610943366004612d5d565b611d7d565b610482610956366004613003565b611db0565b34801561096757600080fd5b50610482610976366004612e3b565b611ddf565b34801561098757600080fd5b5061049a610996366004612d5d565b601c6020526000908152604090205481565b3480156109b457600080fd5b5061049a61038481565b3480156109ca57600080fd5b5061041d6109d9366004613003565b611e58565b3480156109ea57600080fd5b5061049a600f5481565b348015610a0057600080fd5b5061049a60135481565b348015610a1657600080fd5b50600a5461044a906001600160a01b031681565b610482610a38366004613035565b611f33565b348015610a4957600080fd5b5061049a610a58366004612d5d565b601d6020526000908152604090205481565b6104826121ea565b348015610a7e57600080fd5b506103f3610a8d366004612d78565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610ac757600080fd5b50610482610ad6366004612d5d565b6123b3565b610482610ae9366004613003565b61244e565b348015610afa57600080fd5b5061049a611a0a81565b348015610b1057600080fd5b5061049a61247d565b60006001600160e01b031982166380ac58cd60e01b1480610b4a57506001600160e01b03198216635b5e139f60e01b145b80610b6557506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610b7a9061352f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba69061352f565b8015610bf35780601f10610bc857610100808354040283529160200191610bf3565b820191906000526020600020905b815481529060010190602001808311610bd657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c7b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610ca282611478565b9050806001600160a01b0316836001600160a01b03161415610d105760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c72565b336001600160a01b0382161480610d2c5750610d2c8133610a8d565b610d9e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c72565b610da88383612488565b505050565b6006546001600160a01b03163314610dd75760405162461bcd60e51b8152600401610c72906132b5565b60005b81811015610da8576001601c6000858585818110610dfa57610dfa6135c5565b9050602002016020810190610e0f9190612d5d565b6001600160a01b0316815260208101919091526040016000205580610e338161356a565b915050610dda565b6000610e4660075490565b905090565b6012544211610e6c5760405162461bcd60e51b8152600401610c72906132ea565b6000610e7760075490565b9050323314610e985760405162461bcd60e51b8152600401610c72906133a5565b600082118015610ea9575060068211155b610ec55760405162461bcd60e51b8152600401610c729061317b565b6013544211610f1457610edb60646103846134a1565b610ee790611a0a6134ec565b610ef183836134a1565b1115610f0f5760405162461bcd60e51b8152600401610c729061336e565b610f3f565b611a0a610f2183836134a1565b1115610f3f5760405162461bcd60e51b8152600401610c729061336e565b81601854610f4d91906134cd565b600d546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610f9057600080fd5b505afa158015610fa4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc8919061301c565b10156110245760405162461bcd60e51b815260206004820152602560248201527f4e6f7420656e6f75676820244c4f4f4b5320746f20627579206120696e6861626044820152641a5d185b9d60da1b6064820152608401610c72565b600d546019546018546001600160a01b03928316926323b872dd92339291169061104f9087906134cd565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561109e57600080fd5b505af11580156110b2573d6000803e3d6000fd5b5050505060005b82811015610da8576110d4336110cf83856134a1565b6124f6565b6110e2600780546001019055565b806110ec8161356a565b9150506110b9565b600c54604051635febb1e560e11b81526001600160a01b03858116600483015284811660248301529091169063bfd763ca90604401600060405180830381600087803b15801561114357600080fd5b505af1158015611157573d6000803e3d6000fd5b50505050610da8838383612510565b6006546001600160a01b031633146111905760405162461bcd60e51b8152600401610c72906132b5565b600a80546001600160a01b039586166001600160a01b031991821617909155600b805494861694821694909417909355600c805492851692841692909217909155600d8054919093169116179055565b60125442116112015760405162461bcd60e51b8152600401610c72906132ea565b601354421061124d5760405162461bcd60e51b8152602060048201526018602482015277416c6c20696e6861626974616e74732061726520676f6e6560401b6044820152606401610c72565b600061125860075490565b90503233146112795760405162461bcd60e51b8152600401610c72906133a5565b611a0a6112878260016134a1565b11156112a55760405162461bcd60e51b8152600401610c7290613474565b610384600f5460016112b791906134a1565b11156112d55760405162461bcd60e51b8152600401610c7290613474565b336000908152601c60205260409020546001146113045760405162461bcd60e51b8152600401610c7290613321565b61130e33826124f6565b61131c600780546001019055565b336000908152601c60205260408120819055600f80549161133c8361356a565b909155505050565b6006546001600160a01b0316331461136e5760405162461bcd60e51b8152600401610c72906132b5565b6040514790339082156108fc029083906000818181858888f1935050505015801561139d573d6000803e3d6000fd5b5050565b610da883838360405180602001604052806000815250611ddf565b6006546001600160a01b031633146113e65760405162461bcd60e51b8152600401610c72906132b5565b805161139d90600e906020840190612c22565b600a546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b60206040518083038186803b15801561144057600080fd5b505afa158015611454573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b65919061301c565b6000818152600260205260408120546001600160a01b031680610b655760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c72565b6006546001600160a01b031633146115195760405162461bcd60e51b8152600401610c72906132b5565b60159290925560165560198054911515600160a01b0260ff60a01b19909216919091179055565b6060600061154d60075490565b9050600061155a84611619565b90506000808267ffffffffffffffff811115611578576115786135db565b6040519080825280602002602001820160405280156115a1578160200160208202803683370190505b50905060005b8481101561160f57866001600160a01b03166115c282611478565b6001600160a01b031614156115fd57808284815181106115e4576115e46135c5565b6020908102919091010152826115f98161356a565b9350505b806116078161356a565b9150506115a7565b5095945050505050565b60006001600160a01b0382166116845760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c72565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146116ca5760405162461bcd60e51b8152600401610c72906132b5565b6116d46000612541565b565b6000610e4660095490565b6006546001600160a01b0316331461170b5760405162461bcd60e51b8152600401610c72906132b5565b601291909155601355565b606060018054610b7a9061352f565b6006546001600160a01b0316331461174f5760405162461bcd60e51b8152600401610c72906132b5565b600061175a60075490565b905060428260115461176c91906134a1565b106117cb5760405162461bcd60e51b815260206004820152602960248201527f57652776652072756e206f7574206f6620696e6861626974616e747320666f7260448201526820746865207465616d60b81b6064820152608401610c72565b60005b82811015610da8576117e4336110cf83856134a1565b6117f2600780546001019055565b601180549060006118028361356a565b919050555080806118129061356a565b9150506117ce565b813361182582611478565b6001600160a01b03161461184b5760405162461bcd60e51b8152600401610c72906133da565b813361185682611478565b6001600160a01b03161461187c5760405162461bcd60e51b8152600401610c72906133da565b6000848152601a6020526040902054849060ff166118ac5760405162461bcd60e51b8152600401610c7290613258565b6000848152601a6020526040902054849060ff166118dc5760405162461bcd60e51b8152600401610c7290613258565b601954600160a01b900460ff166119355760405162461bcd60e51b815260206004820152601b60248201527f5468652074656d706c65206973206e6f742072656164792079657400000000006044820152606401610c72565b600061194060095490565b61194c9061014d6134cd565b90508587141561196e5760405162461bcd60e51b8152600401610c7290613210565b8061197860085490565b10156119d75760405162461bcd60e51b815260206004820152602860248201527f4e6f7420656e6f756768207361637269666963657320746f20646973636f766560448201526772206120476f642160c01b6064820152608401610c72565b600c546001600160a01b0316639dc29fac336119f260085490565b6016546119ff91906134cd565b601554611a0c91906134a1565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611a5257600080fd5b505af1158015611a66573d6000803e3d6000fd5b5050601754604080516020810190915260008152611a9593503392506001600160a01b03909116908990611ddf565b6000878152601a60209081526040808320805460ff19908116909155601b90925290912080549091166001179055611ad1600880546001019055565b611adf600980546001019055565b60408051338152602081018990529081018790527f7b7727ca544d30c05dd4ded330efc4026ba6ac4eb2ea01a7fec9d292516266f99060600160405180910390a150505050505050565b6012544211611b4a5760405162461bcd60e51b8152600401610c72906132ea565b323314611b695760405162461bcd60e51b8152600401610c72906133a5565b600081118015611b7a575060068111155b611b965760405162461bcd60e51b8152600401610c729061317b565b6013544211611bef57611bac60646103846134a1565b611bb890611a0a6134ec565b81611bc260075490565b611bcc91906134a1565b1115611bea5760405162461bcd60e51b8152600401610c729061336e565b611c24565b611a0a81611bfc60075490565b611c0691906134a1565b1115611c245760405162461bcd60e51b8152600401610c729061336e565b3481601454611c3391906134cd565b14611c805760405162461bcd60e51b815260206004820152601960248201527f4d696e74205072696365206973206e6f7420636f7272656374000000000000006044820152606401610c72565b60005b8181101561139d57611c98336110cf60075490565b611ca6600780546001019055565b80611cb08161356a565b915050611c83565b6001600160a01b038216331415611d115760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c72565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a0823190602401611428565b6006546001600160a01b03163314611dda5760405162461bcd60e51b8152600401610c72906132b5565b601855565b600c54604051635febb1e560e11b81526001600160a01b03868116600483015285811660248301529091169063bfd763ca90604401600060405180830381600087803b158015611e2e57600080fd5b505af1158015611e42573d6000803e3d6000fd5b50505050611e5284848484612593565b50505050565b6000818152600260205260409020546060906001600160a01b0316611ed75760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610c72565b6000611ee16125c5565b90506000815111611f015760405180602001604052806000815250611f2c565b80611f0b846125d4565b604051602001611f1c9291906130b8565b6040516020818303038152906040525b9392505050565b8133611f3e82611478565b6001600160a01b031614611f645760405162461bcd60e51b8152600401610c72906133da565b8133611f6f82611478565b6001600160a01b031614611f955760405162461bcd60e51b8152600401610c72906133da565b601954600160a01b900460ff16611fee5760405162461bcd60e51b815260206004820152601b60248201527f5468652074656d706c65206973206e6f742072656164792079657400000000006044820152606401610c72565b8284141561200e5760405162461bcd60e51b8152600401610c7290613210565b6000848152601a602052604090205460ff1615801561203c57506000838152601a602052604090205460ff16155b6120bd5760405162461bcd60e51b815260206004820152604660248201527f596f752063616e27742073616372696669636520617363656e64656420696e6860448201527f61626974616e747320776974682074686f7365206f6620746865206c6f77657260648201526520636c61737360d01b608482015260a401610c72565b600c546001600160a01b0316639dc29fac336120d860085490565b6016546120e591906134cd565b6015546120f291906134a1565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561213857600080fd5b505af115801561214c573d6000803e3d6000fd5b505060175460408051602081019091526000815261217b93503392506001600160a01b03909116908690611ddf565b612189600880546001019055565b6000848152601a6020908152604091829020805460ff1916600117905581513381529081018690529081018490527f9c1ab6710b9ccf1f4b31f657591d40bdfbed5dcb9d5b714185456e7d258a80659060600160405180910390a150505050565b601254421161220b5760405162461bcd60e51b8152600401610c72906132ea565b60135442106122575760405162461bcd60e51b8152602060048201526018602482015277416c6c20696e6861626974616e74732061726520676f6e6560401b6044820152606401610c72565b600061226260075490565b90503233146122835760405162461bcd60e51b8152600401610c72906133a5565b611a0a6122918260016134a1565b11156122af5760405162461bcd60e51b8152600401610c7290613474565b606460105460016122c091906134a1565b11156122de5760405162461bcd60e51b8152600401610c7290613474565b60016122e9336113f9565b1015806122ff575060016122fc33611d7d565b10155b61231b5760405162461bcd60e51b8152600401610c7290613321565b336000908152601d602052604090205460011161237a5760405162461bcd60e51b815260206004820152601d60248201527f596f7520616c726561647920746f6f6b206120696e6861626974616e740000006044820152606401610c72565b61238433826124f6565b612392600780546001019055565b336000908152601d6020526040812060019055601080549161133c8361356a565b6006546001600160a01b031633146123dd5760405162461bcd60e51b8152600401610c72906132b5565b6001600160a01b0381166124425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c72565b61244b81612541565b50565b6006546001600160a01b031633146124785760405162461bcd60e51b8152600401610c72906132b5565b601455565b6000610e4660085490565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906124bd82611478565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61139d8282604051806020016040528060008152506126da565b61251a338261270d565b6125365760405162461bcd60e51b8152600401610c7290613423565b610da8838383612800565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61259d338361270d565b6125b95760405162461bcd60e51b8152600401610c7290613423565b611e52848484846129a0565b6060600e8054610b7a9061352f565b6060816125f85750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612622578061260c8161356a565b915061261b9050600a836134b9565b91506125fc565b60008167ffffffffffffffff81111561263d5761263d6135db565b6040519080825280601f01601f191660200182016040528015612667576020820181803683370190505b5090505b84156126d25761267c6001836134ec565b9150612689600a86613585565b6126949060306134a1565b60f81b8183815181106126a9576126a96135c5565b60200101906001600160f81b031916908160001a9053506126cb600a866134b9565b945061266b565b949350505050565b6126e483836129d3565b6126f16000848484612b15565b610da85760405162461bcd60e51b8152600401610c72906131be565b6000818152600260205260408120546001600160a01b03166127865760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c72565b600061279183611478565b9050806001600160a01b0316846001600160a01b031614806127cc5750836001600160a01b03166127c184610bfd565b6001600160a01b0316145b806126d257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff166126d2565b826001600160a01b031661281382611478565b6001600160a01b03161461287b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610c72565b6001600160a01b0382166128dd5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c72565b6128e8600082612488565b6001600160a01b03831660009081526003602052604081208054600192906129119084906134ec565b90915550506001600160a01b038216600090815260036020526040812080546001929061293f9084906134a1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6129ab848484612800565b6129b784848484612b15565b611e525760405162461bcd60e51b8152600401610c72906131be565b6001600160a01b038216612a295760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c72565b6000818152600260205260409020546001600160a01b031615612a8e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c72565b6001600160a01b0382166000908152600360205260408120805460019290612ab79084906134a1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15612c1757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b599033908990889088906004016130e7565b602060405180830381600087803b158015612b7357600080fd5b505af1925050508015612ba3575060408051601f3d908101601f19168201909252612ba091810190612f9d565b60015b612bfd573d808015612bd1576040519150601f19603f3d011682016040523d82523d6000602084013e612bd6565b606091505b508051612bf55760405162461bcd60e51b8152600401610c72906131be565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506126d2565b506001949350505050565b828054612c2e9061352f565b90600052602060002090601f016020900481019282612c505760008555612c96565b82601f10612c6957805160ff1916838001178555612c96565b82800160010185558215612c96579182015b82811115612c96578251825591602001919060010190612c7b565b50612ca2929150612ca6565b5090565b5b80821115612ca25760008155600101612ca7565b600067ffffffffffffffff80841115612cd657612cd66135db565b604051601f8501601f19908116603f01168101908282118183101715612cfe57612cfe6135db565b81604052809350858152868686011115612d1757600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612d4857600080fd5b919050565b80358015158114612d4857600080fd5b600060208284031215612d6f57600080fd5b611f2c82612d31565b60008060408385031215612d8b57600080fd5b612d9483612d31565b9150612da260208401612d31565b90509250929050565b60008060008060808587031215612dc157600080fd5b612dca85612d31565b9350612dd860208601612d31565b9250612de660408601612d31565b9150612df460608601612d31565b905092959194509250565b600080600060608486031215612e1457600080fd5b612e1d84612d31565b9250612e2b60208501612d31565b9150604084013590509250925092565b60008060008060808587031215612e5157600080fd5b612e5a85612d31565b9350612e6860208601612d31565b925060408501359150606085013567ffffffffffffffff811115612e8b57600080fd5b8501601f81018713612e9c57600080fd5b612eab87823560208401612cbb565b91505092959194509250565b60008060408385031215612eca57600080fd5b612ed383612d31565b9150612da260208401612d4d565b60008060408385031215612ef457600080fd5b612efd83612d31565b946020939093013593505050565b60008060208385031215612f1e57600080fd5b823567ffffffffffffffff80821115612f3657600080fd5b818501915085601f830112612f4a57600080fd5b813581811115612f5957600080fd5b8660208260051b8501011115612f6e57600080fd5b60209290920196919550909350505050565b600060208284031215612f9257600080fd5b8135611f2c816135f1565b600060208284031215612faf57600080fd5b8151611f2c816135f1565b600060208284031215612fcc57600080fd5b813567ffffffffffffffff811115612fe357600080fd5b8201601f81018413612ff457600080fd5b6126d284823560208401612cbb565b60006020828403121561301557600080fd5b5035919050565b60006020828403121561302e57600080fd5b5051919050565b6000806040838503121561304857600080fd5b50508035926020909101359150565b60008060006060848603121561306c57600080fd5b833592506020840135915061308360408501612d4d565b90509250925092565b600081518084526130a4816020860160208601613503565b601f01601f19169290920160200192915050565b600083516130ca818460208801613503565b8351908301906130de818360208801613503565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061311a9083018461308c565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561315c57835183529284019291840191600101613140565b50909695505050505050565b602081526000611f2c602083018461308c565b60208082526023908201527f596f757220616d6f756e74206d757374206265206265747765656e203120616e60408201526232101b60e91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526028908201527f596f752063616e277420736163726966696365207468652073616d6520696e6860408201526761626974616e747360c01b606082015260800190565b6020808252603f908201527f5468697320696e6861626974616e74206e6565647320746f207361637269666960408201527f636520616e6f7468657220696e6861626974616e7420746f20617363656e6400606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f496e6861626974616e7473206172656e277420626f726e207965740000000000604082015260600190565b6020808252602d908201527f596f7520646f6e27742068617665207065726d697373696f6e20746f2062652060408201526c3432b9329037baba39b4b232b960991b606082015260800190565b6020808252601f908201527f4e6f7420656e6f75676820696e6861626974616e747320666f72207468617400604082015260600190565b6020808252818101527f43616e2774206d696e742066726f6d206f7468657220636f6e74726163747321604082015260600190565b60208082526029908201527f596f752063616e27742075736520616e6f7468657220706572736f6e7320696e6040820152686861626974616e747360b81b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b602080825260139082015272139bc81a5b9a18589a5d185b9d1cc81b19599d606a1b604082015260600190565b600082198211156134b4576134b4613599565b500190565b6000826134c8576134c86135af565b500490565b60008160001904831182151516156134e7576134e7613599565b500290565b6000828210156134fe576134fe613599565b500390565b60005b8381101561351e578181015183820152602001613506565b83811115611e525750506000910152565b600181811c9082168061354357607f821691505b6020821081141561356457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561357e5761357e613599565b5060010190565b600082613594576135946135af565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461244b57600080fdfea26469706673582212205e7f2f09f9a8127a8e22ad349a3197e03e784bac43a52e7563c352ce9070485664736f6c634300080700330000000000000000000000000eef7755d5148effbdded74f33b14ac4e4098526000000000000000000000000838e4c6c7b697fc8beb8f51ea0dedc7523c8dbf4

Deployed Bytecode

0x6080604052600436106103ce5760003560e01c806370a08231116101fd578063b4ff922611610118578063dac13f6d116100ab578063e985e9c51161007a578063e985e9c514610a72578063f2fde38b14610abb578063f4a0a52814610adb578063f4d2656d14610aee578063f600456f14610b0457600080fd5b8063dac13f6d14610a0a578063dcb066cf14610a2a578063e7663f5914610a3d578063e901366f14610a6a57600080fd5b8063bcd18b7c116100e7578063bcd18b7c146109a8578063c87b56dd146109be578063c9247403146109de578063d4a6a2fd146109f457600080fd5b8063b4ff922614610928578063b549a45014610948578063b88d4fde1461095b578063b8ec6a3e1461097b57600080fd5b806396c56399116101905780639f39d4191161015f5780639f39d419146108b5578063a0712d68146108d5578063a22cb465146108e8578063af9666b41461090857600080fd5b806396c563991461083f57806397901f9c1461086f57806399bb35af146108825780639dd33ae9146108a257600080fd5b80638233de99116101cc5780638233de99146107e35780638da5cb5b146107f6578063915992b21461081457806395d89b411461082a57600080fd5b806370a0823114610784578063715018a6146107a45780637df9f718146107b95780637f2a9d6a146107ce57600080fd5b80632a9fd3e4116102ed578063530136d6116102805780636817c76c1161024f5780636817c76c1461071857806368428a1b1461072e578063697f2c7914610744578063699d4dc91461075757600080fd5b8063530136d61461068f57806355f804b3146106c5578063630b5f41146106d85780636352211e146106f857600080fd5b806342842e0e116102bc57806342842e0e146106195780634e0ea0b21461063957806350d7c9bc146106595780635177068a1461067a57600080fd5b80632a9fd3e4146105e15780632d3df31f146105f45780633cb51994146105fc5780633ccfd60b1461061157600080fd5b806318160ddd1161036557806323b872dd1161033457806323b872dd146105455780632475fc3214610565578063255f66131461059b578063281af86e146105b157600080fd5b806318160ddd146104e75780631a38f777146104fc5780631cf72c141461051257806320db28c21461053257600080fd5b80630c48063d116103a15780630c48063d146104845780630ca69012146104a85780630fc12313146104be578063105c338d146104d157600080fd5b806301ffc9a7146103d357806306fdde0314610408578063081812fc1461042a578063095ea7b314610462575b600080fd5b3480156103df57600080fd5b506103f36103ee366004612f80565b610b19565b60405190151581526020015b60405180910390f35b34801561041457600080fd5b5061041d610b6b565b6040516103ff9190613168565b34801561043657600080fd5b5061044a610445366004613003565b610bfd565b6040516001600160a01b0390911681526020016103ff565b34801561046e57600080fd5b5061048261047d366004612ee1565b610c97565b005b34801561049057600080fd5b5061049a60185481565b6040519081526020016103ff565b3480156104b457600080fd5b5061049a60115481565b6104826104cc366004612f0b565b610dad565b3480156104dd57600080fd5b5061049a60165481565b3480156104f357600080fd5b5061049a610e3b565b34801561050857600080fd5b5061049a60105481565b34801561051e57600080fd5b50600c5461044a906001600160a01b031681565b610482610540366004613003565b610e4b565b34801561055157600080fd5b50610482610560366004612dff565b6110f4565b34801561057157600080fd5b5061049a610580366004612d5d565b6001600160a01b03166000908152601d602052604090205490565b3480156105a757600080fd5b5061049a60155481565b3480156105bd57600080fd5b506103f36105cc366004613003565b601a6020526000908152604090205460ff1681565b6104826105ef366004612dab565b611166565b6104826111e0565b34801561060857600080fd5b5061049a600681565b610482611344565b34801561062557600080fd5b50610482610634366004612dff565b6113a1565b34801561064557600080fd5b50600d5461044a906001600160a01b031681565b34801561066557600080fd5b506019546103f390600160a01b900460ff1681565b34801561068657600080fd5b5061049a606481565b34801561069b57600080fd5b5061049a6106aa366004612d5d565b6001600160a01b03166000908152601c602052604090205490565b6104826106d3366004612fba565b6113bc565b3480156106e457600080fd5b5061049a6106f3366004612d5d565b6113f9565b34801561070457600080fd5b5061044a610713366004613003565b611478565b34801561072457600080fd5b5061049a60145481565b34801561073a57600080fd5b5061049a60125481565b610482610752366004613057565b6114ef565b34801561076357600080fd5b50610777610772366004612d5d565b611540565b6040516103ff9190613124565b34801561079057600080fd5b5061049a61079f366004612d5d565b611619565b3480156107b057600080fd5b506104826116a0565b3480156107c557600080fd5b5061049a604281565b3480156107da57600080fd5b5061049a6116d6565b6104826107f1366004613035565b6116e1565b34801561080257600080fd5b506006546001600160a01b031661044a565b34801561082057600080fd5b5061049a610d0581565b34801561083657600080fd5b5061041d611716565b34801561084b57600080fd5b506103f361085a366004613003565b601b6020526000908152604090205460ff1681565b61048261087d366004613003565b611725565b34801561088e57600080fd5b5060175461044a906001600160a01b031681565b6104826108b0366004613035565b61181a565b3480156108c157600080fd5b5060195461044a906001600160a01b031681565b6104826108e3366004613003565b611b29565b3480156108f457600080fd5b50610482610903366004612eb7565b611cb8565b34801561091457600080fd5b50600b5461044a906001600160a01b031681565b34801561093457600080fd5b5061049a610943366004612d5d565b611d7d565b610482610956366004613003565b611db0565b34801561096757600080fd5b50610482610976366004612e3b565b611ddf565b34801561098757600080fd5b5061049a610996366004612d5d565b601c6020526000908152604090205481565b3480156109b457600080fd5b5061049a61038481565b3480156109ca57600080fd5b5061041d6109d9366004613003565b611e58565b3480156109ea57600080fd5b5061049a600f5481565b348015610a0057600080fd5b5061049a60135481565b348015610a1657600080fd5b50600a5461044a906001600160a01b031681565b610482610a38366004613035565b611f33565b348015610a4957600080fd5b5061049a610a58366004612d5d565b601d6020526000908152604090205481565b6104826121ea565b348015610a7e57600080fd5b506103f3610a8d366004612d78565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610ac757600080fd5b50610482610ad6366004612d5d565b6123b3565b610482610ae9366004613003565b61244e565b348015610afa57600080fd5b5061049a611a0a81565b348015610b1057600080fd5b5061049a61247d565b60006001600160e01b031982166380ac58cd60e01b1480610b4a57506001600160e01b03198216635b5e139f60e01b145b80610b6557506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610b7a9061352f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba69061352f565b8015610bf35780601f10610bc857610100808354040283529160200191610bf3565b820191906000526020600020905b815481529060010190602001808311610bd657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c7b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610ca282611478565b9050806001600160a01b0316836001600160a01b03161415610d105760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c72565b336001600160a01b0382161480610d2c5750610d2c8133610a8d565b610d9e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c72565b610da88383612488565b505050565b6006546001600160a01b03163314610dd75760405162461bcd60e51b8152600401610c72906132b5565b60005b81811015610da8576001601c6000858585818110610dfa57610dfa6135c5565b9050602002016020810190610e0f9190612d5d565b6001600160a01b0316815260208101919091526040016000205580610e338161356a565b915050610dda565b6000610e4660075490565b905090565b6012544211610e6c5760405162461bcd60e51b8152600401610c72906132ea565b6000610e7760075490565b9050323314610e985760405162461bcd60e51b8152600401610c72906133a5565b600082118015610ea9575060068211155b610ec55760405162461bcd60e51b8152600401610c729061317b565b6013544211610f1457610edb60646103846134a1565b610ee790611a0a6134ec565b610ef183836134a1565b1115610f0f5760405162461bcd60e51b8152600401610c729061336e565b610f3f565b611a0a610f2183836134a1565b1115610f3f5760405162461bcd60e51b8152600401610c729061336e565b81601854610f4d91906134cd565b600d546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610f9057600080fd5b505afa158015610fa4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc8919061301c565b10156110245760405162461bcd60e51b815260206004820152602560248201527f4e6f7420656e6f75676820244c4f4f4b5320746f20627579206120696e6861626044820152641a5d185b9d60da1b6064820152608401610c72565b600d546019546018546001600160a01b03928316926323b872dd92339291169061104f9087906134cd565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561109e57600080fd5b505af11580156110b2573d6000803e3d6000fd5b5050505060005b82811015610da8576110d4336110cf83856134a1565b6124f6565b6110e2600780546001019055565b806110ec8161356a565b9150506110b9565b600c54604051635febb1e560e11b81526001600160a01b03858116600483015284811660248301529091169063bfd763ca90604401600060405180830381600087803b15801561114357600080fd5b505af1158015611157573d6000803e3d6000fd5b50505050610da8838383612510565b6006546001600160a01b031633146111905760405162461bcd60e51b8152600401610c72906132b5565b600a80546001600160a01b039586166001600160a01b031991821617909155600b805494861694821694909417909355600c805492851692841692909217909155600d8054919093169116179055565b60125442116112015760405162461bcd60e51b8152600401610c72906132ea565b601354421061124d5760405162461bcd60e51b8152602060048201526018602482015277416c6c20696e6861626974616e74732061726520676f6e6560401b6044820152606401610c72565b600061125860075490565b90503233146112795760405162461bcd60e51b8152600401610c72906133a5565b611a0a6112878260016134a1565b11156112a55760405162461bcd60e51b8152600401610c7290613474565b610384600f5460016112b791906134a1565b11156112d55760405162461bcd60e51b8152600401610c7290613474565b336000908152601c60205260409020546001146113045760405162461bcd60e51b8152600401610c7290613321565b61130e33826124f6565b61131c600780546001019055565b336000908152601c60205260408120819055600f80549161133c8361356a565b909155505050565b6006546001600160a01b0316331461136e5760405162461bcd60e51b8152600401610c72906132b5565b6040514790339082156108fc029083906000818181858888f1935050505015801561139d573d6000803e3d6000fd5b5050565b610da883838360405180602001604052806000815250611ddf565b6006546001600160a01b031633146113e65760405162461bcd60e51b8152600401610c72906132b5565b805161139d90600e906020840190612c22565b600a546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b60206040518083038186803b15801561144057600080fd5b505afa158015611454573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b65919061301c565b6000818152600260205260408120546001600160a01b031680610b655760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c72565b6006546001600160a01b031633146115195760405162461bcd60e51b8152600401610c72906132b5565b60159290925560165560198054911515600160a01b0260ff60a01b19909216919091179055565b6060600061154d60075490565b9050600061155a84611619565b90506000808267ffffffffffffffff811115611578576115786135db565b6040519080825280602002602001820160405280156115a1578160200160208202803683370190505b50905060005b8481101561160f57866001600160a01b03166115c282611478565b6001600160a01b031614156115fd57808284815181106115e4576115e46135c5565b6020908102919091010152826115f98161356a565b9350505b806116078161356a565b9150506115a7565b5095945050505050565b60006001600160a01b0382166116845760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c72565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146116ca5760405162461bcd60e51b8152600401610c72906132b5565b6116d46000612541565b565b6000610e4660095490565b6006546001600160a01b0316331461170b5760405162461bcd60e51b8152600401610c72906132b5565b601291909155601355565b606060018054610b7a9061352f565b6006546001600160a01b0316331461174f5760405162461bcd60e51b8152600401610c72906132b5565b600061175a60075490565b905060428260115461176c91906134a1565b106117cb5760405162461bcd60e51b815260206004820152602960248201527f57652776652072756e206f7574206f6620696e6861626974616e747320666f7260448201526820746865207465616d60b81b6064820152608401610c72565b60005b82811015610da8576117e4336110cf83856134a1565b6117f2600780546001019055565b601180549060006118028361356a565b919050555080806118129061356a565b9150506117ce565b813361182582611478565b6001600160a01b03161461184b5760405162461bcd60e51b8152600401610c72906133da565b813361185682611478565b6001600160a01b03161461187c5760405162461bcd60e51b8152600401610c72906133da565b6000848152601a6020526040902054849060ff166118ac5760405162461bcd60e51b8152600401610c7290613258565b6000848152601a6020526040902054849060ff166118dc5760405162461bcd60e51b8152600401610c7290613258565b601954600160a01b900460ff166119355760405162461bcd60e51b815260206004820152601b60248201527f5468652074656d706c65206973206e6f742072656164792079657400000000006044820152606401610c72565b600061194060095490565b61194c9061014d6134cd565b90508587141561196e5760405162461bcd60e51b8152600401610c7290613210565b8061197860085490565b10156119d75760405162461bcd60e51b815260206004820152602860248201527f4e6f7420656e6f756768207361637269666963657320746f20646973636f766560448201526772206120476f642160c01b6064820152608401610c72565b600c546001600160a01b0316639dc29fac336119f260085490565b6016546119ff91906134cd565b601554611a0c91906134a1565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611a5257600080fd5b505af1158015611a66573d6000803e3d6000fd5b5050601754604080516020810190915260008152611a9593503392506001600160a01b03909116908990611ddf565b6000878152601a60209081526040808320805460ff19908116909155601b90925290912080549091166001179055611ad1600880546001019055565b611adf600980546001019055565b60408051338152602081018990529081018790527f7b7727ca544d30c05dd4ded330efc4026ba6ac4eb2ea01a7fec9d292516266f99060600160405180910390a150505050505050565b6012544211611b4a5760405162461bcd60e51b8152600401610c72906132ea565b323314611b695760405162461bcd60e51b8152600401610c72906133a5565b600081118015611b7a575060068111155b611b965760405162461bcd60e51b8152600401610c729061317b565b6013544211611bef57611bac60646103846134a1565b611bb890611a0a6134ec565b81611bc260075490565b611bcc91906134a1565b1115611bea5760405162461bcd60e51b8152600401610c729061336e565b611c24565b611a0a81611bfc60075490565b611c0691906134a1565b1115611c245760405162461bcd60e51b8152600401610c729061336e565b3481601454611c3391906134cd565b14611c805760405162461bcd60e51b815260206004820152601960248201527f4d696e74205072696365206973206e6f7420636f7272656374000000000000006044820152606401610c72565b60005b8181101561139d57611c98336110cf60075490565b611ca6600780546001019055565b80611cb08161356a565b915050611c83565b6001600160a01b038216331415611d115760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c72565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a0823190602401611428565b6006546001600160a01b03163314611dda5760405162461bcd60e51b8152600401610c72906132b5565b601855565b600c54604051635febb1e560e11b81526001600160a01b03868116600483015285811660248301529091169063bfd763ca90604401600060405180830381600087803b158015611e2e57600080fd5b505af1158015611e42573d6000803e3d6000fd5b50505050611e5284848484612593565b50505050565b6000818152600260205260409020546060906001600160a01b0316611ed75760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610c72565b6000611ee16125c5565b90506000815111611f015760405180602001604052806000815250611f2c565b80611f0b846125d4565b604051602001611f1c9291906130b8565b6040516020818303038152906040525b9392505050565b8133611f3e82611478565b6001600160a01b031614611f645760405162461bcd60e51b8152600401610c72906133da565b8133611f6f82611478565b6001600160a01b031614611f955760405162461bcd60e51b8152600401610c72906133da565b601954600160a01b900460ff16611fee5760405162461bcd60e51b815260206004820152601b60248201527f5468652074656d706c65206973206e6f742072656164792079657400000000006044820152606401610c72565b8284141561200e5760405162461bcd60e51b8152600401610c7290613210565b6000848152601a602052604090205460ff1615801561203c57506000838152601a602052604090205460ff16155b6120bd5760405162461bcd60e51b815260206004820152604660248201527f596f752063616e27742073616372696669636520617363656e64656420696e6860448201527f61626974616e747320776974682074686f7365206f6620746865206c6f77657260648201526520636c61737360d01b608482015260a401610c72565b600c546001600160a01b0316639dc29fac336120d860085490565b6016546120e591906134cd565b6015546120f291906134a1565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561213857600080fd5b505af115801561214c573d6000803e3d6000fd5b505060175460408051602081019091526000815261217b93503392506001600160a01b03909116908690611ddf565b612189600880546001019055565b6000848152601a6020908152604091829020805460ff1916600117905581513381529081018690529081018490527f9c1ab6710b9ccf1f4b31f657591d40bdfbed5dcb9d5b714185456e7d258a80659060600160405180910390a150505050565b601254421161220b5760405162461bcd60e51b8152600401610c72906132ea565b60135442106122575760405162461bcd60e51b8152602060048201526018602482015277416c6c20696e6861626974616e74732061726520676f6e6560401b6044820152606401610c72565b600061226260075490565b90503233146122835760405162461bcd60e51b8152600401610c72906133a5565b611a0a6122918260016134a1565b11156122af5760405162461bcd60e51b8152600401610c7290613474565b606460105460016122c091906134a1565b11156122de5760405162461bcd60e51b8152600401610c7290613474565b60016122e9336113f9565b1015806122ff575060016122fc33611d7d565b10155b61231b5760405162461bcd60e51b8152600401610c7290613321565b336000908152601d602052604090205460011161237a5760405162461bcd60e51b815260206004820152601d60248201527f596f7520616c726561647920746f6f6b206120696e6861626974616e740000006044820152606401610c72565b61238433826124f6565b612392600780546001019055565b336000908152601d6020526040812060019055601080549161133c8361356a565b6006546001600160a01b031633146123dd5760405162461bcd60e51b8152600401610c72906132b5565b6001600160a01b0381166124425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c72565b61244b81612541565b50565b6006546001600160a01b031633146124785760405162461bcd60e51b8152600401610c72906132b5565b601455565b6000610e4660085490565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906124bd82611478565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61139d8282604051806020016040528060008152506126da565b61251a338261270d565b6125365760405162461bcd60e51b8152600401610c7290613423565b610da8838383612800565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61259d338361270d565b6125b95760405162461bcd60e51b8152600401610c7290613423565b611e52848484846129a0565b6060600e8054610b7a9061352f565b6060816125f85750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612622578061260c8161356a565b915061261b9050600a836134b9565b91506125fc565b60008167ffffffffffffffff81111561263d5761263d6135db565b6040519080825280601f01601f191660200182016040528015612667576020820181803683370190505b5090505b84156126d25761267c6001836134ec565b9150612689600a86613585565b6126949060306134a1565b60f81b8183815181106126a9576126a96135c5565b60200101906001600160f81b031916908160001a9053506126cb600a866134b9565b945061266b565b949350505050565b6126e483836129d3565b6126f16000848484612b15565b610da85760405162461bcd60e51b8152600401610c72906131be565b6000818152600260205260408120546001600160a01b03166127865760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c72565b600061279183611478565b9050806001600160a01b0316846001600160a01b031614806127cc5750836001600160a01b03166127c184610bfd565b6001600160a01b0316145b806126d257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff166126d2565b826001600160a01b031661281382611478565b6001600160a01b03161461287b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610c72565b6001600160a01b0382166128dd5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c72565b6128e8600082612488565b6001600160a01b03831660009081526003602052604081208054600192906129119084906134ec565b90915550506001600160a01b038216600090815260036020526040812080546001929061293f9084906134a1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6129ab848484612800565b6129b784848484612b15565b611e525760405162461bcd60e51b8152600401610c72906131be565b6001600160a01b038216612a295760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c72565b6000818152600260205260409020546001600160a01b031615612a8e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c72565b6001600160a01b0382166000908152600360205260408120805460019290612ab79084906134a1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15612c1757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b599033908990889088906004016130e7565b602060405180830381600087803b158015612b7357600080fd5b505af1925050508015612ba3575060408051601f3d908101601f19168201909252612ba091810190612f9d565b60015b612bfd573d808015612bd1576040519150601f19603f3d011682016040523d82523d6000602084013e612bd6565b606091505b508051612bf55760405162461bcd60e51b8152600401610c72906131be565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506126d2565b506001949350505050565b828054612c2e9061352f565b90600052602060002090601f016020900481019282612c505760008555612c96565b82601f10612c6957805160ff1916838001178555612c96565b82800160010185558215612c96579182015b82811115612c96578251825591602001919060010190612c7b565b50612ca2929150612ca6565b5090565b5b80821115612ca25760008155600101612ca7565b600067ffffffffffffffff80841115612cd657612cd66135db565b604051601f8501601f19908116603f01168101908282118183101715612cfe57612cfe6135db565b81604052809350858152868686011115612d1757600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612d4857600080fd5b919050565b80358015158114612d4857600080fd5b600060208284031215612d6f57600080fd5b611f2c82612d31565b60008060408385031215612d8b57600080fd5b612d9483612d31565b9150612da260208401612d31565b90509250929050565b60008060008060808587031215612dc157600080fd5b612dca85612d31565b9350612dd860208601612d31565b9250612de660408601612d31565b9150612df460608601612d31565b905092959194509250565b600080600060608486031215612e1457600080fd5b612e1d84612d31565b9250612e2b60208501612d31565b9150604084013590509250925092565b60008060008060808587031215612e5157600080fd5b612e5a85612d31565b9350612e6860208601612d31565b925060408501359150606085013567ffffffffffffffff811115612e8b57600080fd5b8501601f81018713612e9c57600080fd5b612eab87823560208401612cbb565b91505092959194509250565b60008060408385031215612eca57600080fd5b612ed383612d31565b9150612da260208401612d4d565b60008060408385031215612ef457600080fd5b612efd83612d31565b946020939093013593505050565b60008060208385031215612f1e57600080fd5b823567ffffffffffffffff80821115612f3657600080fd5b818501915085601f830112612f4a57600080fd5b813581811115612f5957600080fd5b8660208260051b8501011115612f6e57600080fd5b60209290920196919550909350505050565b600060208284031215612f9257600080fd5b8135611f2c816135f1565b600060208284031215612faf57600080fd5b8151611f2c816135f1565b600060208284031215612fcc57600080fd5b813567ffffffffffffffff811115612fe357600080fd5b8201601f81018413612ff457600080fd5b6126d284823560208401612cbb565b60006020828403121561301557600080fd5b5035919050565b60006020828403121561302e57600080fd5b5051919050565b6000806040838503121561304857600080fd5b50508035926020909101359150565b60008060006060848603121561306c57600080fd5b833592506020840135915061308360408501612d4d565b90509250925092565b600081518084526130a4816020860160208601613503565b601f01601f19169290920160200192915050565b600083516130ca818460208801613503565b8351908301906130de818360208801613503565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061311a9083018461308c565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561315c57835183529284019291840191600101613140565b50909695505050505050565b602081526000611f2c602083018461308c565b60208082526023908201527f596f757220616d6f756e74206d757374206265206265747765656e203120616e60408201526232101b60e91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526028908201527f596f752063616e277420736163726966696365207468652073616d6520696e6860408201526761626974616e747360c01b606082015260800190565b6020808252603f908201527f5468697320696e6861626974616e74206e6565647320746f207361637269666960408201527f636520616e6f7468657220696e6861626974616e7420746f20617363656e6400606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f496e6861626974616e7473206172656e277420626f726e207965740000000000604082015260600190565b6020808252602d908201527f596f7520646f6e27742068617665207065726d697373696f6e20746f2062652060408201526c3432b9329037baba39b4b232b960991b606082015260800190565b6020808252601f908201527f4e6f7420656e6f75676820696e6861626974616e747320666f72207468617400604082015260600190565b6020808252818101527f43616e2774206d696e742066726f6d206f7468657220636f6e74726163747321604082015260600190565b60208082526029908201527f596f752063616e27742075736520616e6f7468657220706572736f6e7320696e6040820152686861626974616e747360b81b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b602080825260139082015272139bc81a5b9a18589a5d185b9d1cc81b19599d606a1b604082015260600190565b600082198211156134b4576134b4613599565b500190565b6000826134c8576134c86135af565b500490565b60008160001904831182151516156134e7576134e7613599565b500290565b6000828210156134fe576134fe613599565b500390565b60005b8381101561351e578181015183820152602001613506565b83811115611e525750506000910152565b600181811c9082168061354357607f821691505b6020821081141561356457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561357e5761357e613599565b5060010190565b600082613594576135946135af565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461244b57600080fdfea26469706673582212205e7f2f09f9a8127a8e22ad349a3197e03e784bac43a52e7563c352ce9070485664736f6c63430008070033

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

0000000000000000000000000eef7755d5148effbdded74f33b14ac4e4098526000000000000000000000000838e4c6c7b697fc8beb8f51ea0dedc7523c8dbf4

-----Decoded View---------------
Arg [0] : burner (address): 0x0eEf7755d5148effbdDeD74f33B14Ac4e4098526
Arg [1] : rare (address): 0x838E4c6C7b697Fc8bEB8f51EA0dEdC7523C8DbF4

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000eef7755d5148effbdded74f33b14ac4e4098526
Arg [1] : 000000000000000000000000838e4c6c7b697fc8beb8f51ea0dedc7523c8dbf4


Deployed Bytecode Sourcemap

44467:16184:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19936:305;;;;;;;;;;-1:-1:-1;19936:305:0;;;;;:::i;:::-;;:::i;:::-;;;9470:14:1;;9463:22;9445:41;;9433:2;9418:18;19936:305:0;;;;;;;;20881:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22440:221::-;;;;;;;;;;-1:-1:-1;22440:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6813:32:1;;;6795:51;;6783:2;6768:18;22440:221:0;6649:203:1;21963:411:0;;;;;;;;;;-1:-1:-1;21963:411:0;;;;;:::i;:::-;;:::i;:::-;;46450:36;;;;;;;;;;;;;;;;;;;23766:25:1;;;23754:2;23739:18;46450:36:0;23620:177:1;45773:37:0;;;;;;;;;;;;;;;;49936:212;;;;;;:::i;:::-;;:::i;46232:38::-;;;;;;;;;;;;;;;;57448:100;;;;;;;;;;;;;:::i;45645:37::-;;;;;;;;;;;;;;;;44869:19;;;;;;;;;;-1:-1:-1;44869:19:0;;;;-1:-1:-1;;;;;44869:19:0;;;52944:1028;;;;;;:::i;:::-;;:::i;60034:184::-;;;;;;;;;;-1:-1:-1;60034:184:0;;;;;:::i;:::-;;:::i;49682:112::-;;;;;;;;;;-1:-1:-1;49682:112:0;;;;;:::i;:::-;-1:-1:-1;;;;;49770:16:0;49743:7;49770:16;;;:8;:16;;;;;;;49682:112;46147:38;;;;;;;;;;;;;;;;46723:56;;;;;;;;;;-1:-1:-1;46723:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;59620:366;;;;;;:::i;:::-;;:::i;51149:696::-;;;:::i;45484:43::-;;;;;;;;;;;;45526:1;45484:43;;58249:178;;;:::i;60270:149::-;;;;;;;;;;-1:-1:-1;60270:149:0;;;;;:::i;:::-;;:::i;44895:18::-;;;;;;;;;;-1:-1:-1;44895:18:0;;;;-1:-1:-1;;;;;44895:18:0;;;46604:35;;;;;;;;;;-1:-1:-1;46604:35:0;;;;-1:-1:-1;;;46604:35:0;;;;;;45337:45;;;;;;;;;;;;45379:3;45337:45;;49439:112;;;;;;;;;;-1:-1:-1;49439:112:0;;;;;:::i;:::-;-1:-1:-1;;;;;49527:16:0;49500:7;49527:16;;;:8;:16;;;;;;;49439:112;58028;;;;;;:::i;:::-;;:::i;48929:131::-;;;;;;;;;;-1:-1:-1;48929:131:0;;;;;:::i;:::-;;:::i;20575:239::-;;;;;;;;;;-1:-1:-1;20575:239:0;;;;;:::i;:::-;;:::i;46101:39::-;;;;;;;;;;;;;;;;45867:29;;;;;;;;;;;;;;;;59281:210;;;;;;:::i;:::-;;:::i;56884:517::-;;;;;;;;;;-1:-1:-1;56884:517:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;20305:208::-;;;;;;;;;;-1:-1:-1;20305:208:0;;;;;:::i;:::-;;:::i;33622:94::-;;;;;;;;;;;;;:::i;45106:44::-;;;;;;;;;;;;45148:2;45106:44;;57744:94;;;;;;;;;;;;;:::i;58527:162::-;;;;;;:::i;:::-;;:::i;32971:87::-;;;;;;;;;;-1:-1:-1;33044:6:0;;-1:-1:-1;;;;;33044:6:0;32971:87;;45006:46;;;;;;;;;;;;45048:4;45006:46;;21050:104;;;;;;;;;;;;;:::i;46840:52::-;;;;;;;;;;-1:-1:-1;46840:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;54122:488;;;;;;:::i;:::-;;:::i;46350:27::-;;;;;;;;;;-1:-1:-1;46350:27:0;;;;-1:-1:-1;;;;;46350:27:0;;;55868:923;;;;;;:::i;:::-;;:::i;46569:26::-;;;;;;;;;;-1:-1:-1;46569:26:0;;;;-1:-1:-1;;;;;46569:26:0;;;50230:811;;;;;;:::i;:::-;;:::i;22733:295::-;;;;;;;;;;-1:-1:-1;22733:295:0;;;;;:::i;:::-;;:::i;44832:30::-;;;;;;;;;;-1:-1:-1;44832:30:0;;;;-1:-1:-1;;;;;44832:30:0;;;49192:137;;;;;;;;;;-1:-1:-1;49192:137:0;;;;;:::i;:::-;;:::i;59039:100::-;;;;;;:::i;:::-;;:::i;60431:217::-;;;;;;;;;;-1:-1:-1;60431:217:0;;;;;:::i;:::-;;:::i;46937:43::-;;;;;;;;;;-1:-1:-1;46937:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;45228:45;;;;;;;;;;;;45270:3;45228:45;;21225:334;;;;;;;;;;-1:-1:-1;21225:334:0;;;;;:::i;:::-;;:::i;45536:42::-;;;;;;;;;;;;;;;;45945:30;;;;;;;;;;;;;;;;44801:24;;;;;;;;;;-1:-1:-1;44801:24:0;;;;-1:-1:-1;;;;;44801:24:0;;;54864:841;;;;;;:::i;:::-;;:::i;47054:43::-;;;;;;;;;;-1:-1:-1;47054:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;52008:815;;;:::i;23099:164::-;;;;;;;;;;-1:-1:-1;23099:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23220:25:0;;;23196:4;23220:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23099:164;33871:192;;;;;;;;;;-1:-1:-1;33871:192:0;;;;;:::i;:::-;;:::i;58806:98::-;;;;;;:::i;:::-;;:::i;44953:46::-;;;;;;;;;;;;44995:4;44953:46;;57597:102;;;;;;;;;;;;;:::i;19936:305::-;20038:4;-1:-1:-1;;;;;;20075:40:0;;-1:-1:-1;;;20075:40:0;;:105;;-1:-1:-1;;;;;;;20132:48:0;;-1:-1:-1;;;20132:48:0;20075:105;:158;;;-1:-1:-1;;;;;;;;;;18652:40:0;;;20197:36;20055:178;19936:305;-1:-1:-1;;19936:305:0:o;20881:100::-;20935:13;20968:5;20961:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20881:100;:::o;22440:221::-;22516:7;25923:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25923:16:0;22536:73;;;;-1:-1:-1;;;22536:73:0;;17558:2:1;22536:73:0;;;17540:21:1;17597:2;17577:18;;;17570:30;17636:34;17616:18;;;17609:62;-1:-1:-1;;;17687:18:1;;;17680:42;17739:19;;22536:73:0;;;;;;;;;-1:-1:-1;22629:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22629:24:0;;22440:221::o;21963:411::-;22044:13;22060:23;22075:7;22060:14;:23::i;:::-;22044:39;;22108:5;-1:-1:-1;;;;;22102:11:0;:2;-1:-1:-1;;;;;22102:11:0;;;22094:57;;;;-1:-1:-1;;;22094:57:0;;19928:2:1;22094:57:0;;;19910:21:1;19967:2;19947:18;;;19940:30;20006:34;19986:18;;;19979:62;-1:-1:-1;;;20057:18:1;;;20050:31;20098:19;;22094:57:0;19726:397:1;22094:57:0;15722:10;-1:-1:-1;;;;;22186:21:0;;;;:62;;-1:-1:-1;22211:37:0;22228:5;15722:10;23099:164;:::i;22211:37::-;22164:168;;;;-1:-1:-1;;;22164:168:0;;15113:2:1;22164:168:0;;;15095:21:1;15152:2;15132:18;;;15125:30;15191:34;15171:18;;;15164:62;15262:26;15242:18;;;15235:54;15306:19;;22164:168:0;14911:420:1;22164:168:0;22345:21;22354:2;22358:7;22345:8;:21::i;:::-;22033:341;21963:411;;:::o;49936:212::-;33044:6;;-1:-1:-1;;;;;33044:6:0;15722:10;33191:23;33183:68;;;;-1:-1:-1;;;33183:68:0;;;;;;;:::i;:::-;50036:14:::1;50031:110;50051:23:::0;;::::1;50031:110;;;50128:1;50100:8;:25;50109:7;;50117:6;50109:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50100:25:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;50100:25:0;:29;50075:8;::::1;::::0;::::1;:::i;:::-;;;;50031:110;;57448:100:::0;57493:7;57520:20;:10;41942:14;;41850:114;57520:20;57513:27;;57448:100;:::o;52944:1028::-;48310:10;;48292:15;:28;48284:68;;;;-1:-1:-1;;;48284:68:0;;;;;;;:::i;:::-;53022:26:::1;53051:20;:10;41942:14:::0;;41850:114;53051:20:::1;53022:49:::0;-1:-1:-1;53092:9:0::1;53105:10;53092:23;53084:68;;;;-1:-1:-1::0;;;53084:68:0::1;;;;;;;:::i;:::-;53180:1;53171:6;:10;:33;;;;;45526:1;53185:6;:19;;53171:33;53163:81;;;;-1:-1:-1::0;;;53163:81:0::1;;;;;;;:::i;:::-;53280:11;;53261:15;:30;53257:314;;53366:33;45379:3;45270;53366:33;:::i;:::-;53348:52;::::0;44995:4:::1;53348:52;:::i;:::-;53316:27;53337:6:::0;53316:18;:27:::1;:::i;:::-;:85;;53308:129;;;;-1:-1:-1::0;;;53308:129:0::1;;;;;;;:::i;:::-;53257:314;;;44995:4;53478:27;53499:6:::0;53478:18;:27:::1;:::i;:::-;:45;;53470:89;;;;-1:-1:-1::0;;;53470:89:0::1;;;;;;;:::i;:::-;53635:6;53622:10;;:19;;;;:::i;:::-;53591:5;::::0;:27:::1;::::0;-1:-1:-1;;;53591:27:0;;53607:10:::1;53591:27;::::0;::::1;6795:51:1::0;-1:-1:-1;;;;;53591:5:0;;::::1;::::0;:15:::1;::::0;6768:18:1;;53591:27:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;53583:100;;;::::0;-1:-1:-1;;;53583:100:0;;16359:2:1;53583:100:0::1;::::0;::::1;16341:21:1::0;16398:2;16378:18;;;16371:30;16437:34;16417:18;;;16410:62;-1:-1:-1;;;16488:18:1;;;16481:35;16533:19;;53583:100:0::1;16157:401:1::0;53583:100:0::1;53704:5;::::0;53735:11:::1;::::0;53748:10:::1;::::0;-1:-1:-1;;;;;53704:5:0;;::::1;::::0;:18:::1;::::0;53723:10:::1;::::0;53735:11;::::1;::::0;53748:19:::1;::::0;53761:6;;53748:19:::1;:::i;:::-;53704:64;::::0;-1:-1:-1;;;;;;53704:64:0::1;::::0;;;;;;-1:-1:-1;;;;;7424:15:1;;;53704:64:0::1;::::0;::::1;7406:34:1::0;7476:15;;;;7456:18;;;7449:43;7508:18;;;7501:34;7341:18;;53704:64:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;53786:9;53781:146;53804:6;53800:1;:10;53781:146;;;53831:45;53841:10;53853:22;53874:1:::0;53853:18;:22:::1;:::i;:::-;53831:9;:45::i;:::-;53893:22;:10;42061:19:::0;;42079:1;42061:19;;;41972:127;53893:22:::1;53811:3:::0;::::1;::::0;::::1;:::i;:::-;;;;53781:146;;60034:184:::0;60129:5;;:27;;-1:-1:-1;;;60129:27:0;;-1:-1:-1;;;;;7087:15:1;;;60129:27:0;;;7069:34:1;7139:15;;;7119:18;;;7112:43;60129:5:0;;;;:17;;7004:18:1;;60129:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60169:41;60189:4;60195:2;60199:10;60169:19;:41::i;59620:366::-;33044:6;;-1:-1:-1;;;;;33044:6:0;15722:10;33191:23;33183:68;;;;-1:-1:-1;;;33183:68:0;;;;;;;:::i;:::-;59790:8:::1;:40:::0;;-1:-1:-1;;;;;59790:40:0;;::::1;-1:-1:-1::0;;;;;;59790:40:0;;::::1;;::::0;;;59841:11:::1;:46:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;59898:5:::1;:35:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;59944:5:::1;:34:::0;;;;;::::1;::::0;::::1;;::::0;;59620:366::o;51149:696::-;48310:10;;48292:15;:28;48284:68;;;;-1:-1:-1;;;48284:68:0;;;;;;;:::i;:::-;48564:11:::1;;48546:15;:29;48538:66;;;::::0;-1:-1:-1;;;48538:66:0;;22358:2:1;48538:66:0::1;::::0;::::1;22340:21:1::0;22397:2;22377:18;;;22370:30;-1:-1:-1;;;22416:18:1;;;22409:54;22480:18;;48538:66:0::1;22156:348:1::0;48538:66:0::1;51227:26:::2;51256:20;:10;41942:14:::0;;41850:114;51256:20:::2;51227:49:::0;-1:-1:-1;51297:9:0::2;51310:10;51297:23;51289:68;;;;-1:-1:-1::0;;;51289:68:0::2;;;;;;;:::i;:::-;44995:4;51376:22;:18:::0;51397:1:::2;51376:22;:::i;:::-;:40;;51368:72;;;;-1:-1:-1::0;;;51368:72:0::2;;;;;;;:::i;:::-;45270:3;51459:27;;51489:1;51459:31;;;;:::i;:::-;:50;;51451:82;;;;-1:-1:-1::0;;;51451:82:0::2;;;;;;;:::i;:::-;51561:10;51552:20;::::0;;;:8:::2;:20;::::0;;;;;51576:1:::2;51552:25;51544:83;;;;-1:-1:-1::0;;;51544:83:0::2;;;;;;;:::i;:::-;51640:41;51650:10;51662:18;51640:9;:41::i;:::-;51702:22;:10;42061:19:::0;;42079:1;42061:19;;;41972:127;51702:22:::2;51744:10;51758:1;51735:20:::0;;;:8:::2;:20;::::0;;;;:24;;;51770:27:::2;:29:::0;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;;51149:696:0:o;58249:178::-;33044:6;;-1:-1:-1;;;;;33044:6:0;15722:10;33191:23;33183:68;;;;-1:-1:-1;;;33183:68:0;;;;;;;:::i;:::-;58355:37:::1;::::0;58323:21:::1;::::0;58363:10:::1;::::0;58355:37;::::1;;;::::0;58323:21;;58305:15:::1;58355:37:::0;58305:15;58355:37;58323:21;58363:10;58355:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;58249:178:0:o;60270:149::-;60369:42;60386:4;60392:2;60396:10;60369:42;;;;;;;;;;;;:16;:42::i;58028:112::-;33044:6;;-1:-1:-1;;;;;33044:6:0;15722:10;33191:23;33183:68;;;;-1:-1:-1;;;33183:68:0;;;;;;;:::i;:::-;58111:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;48929:131::-:0;49026:8;;:26;;-1:-1:-1;;;49026:26:0;;-1:-1:-1;;;;;6813:32:1;;;49026:26:0;;;6795:51:1;48999:7:0;;49026:8;;:18;;6768::1;;49026:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20575:239::-;20647:7;20683:16;;;:7;:16;;;;;;-1:-1:-1;;;;;20683:16:0;20718:19;20710:73;;;;-1:-1:-1;;;20710:73:0;;15949:2:1;20710:73:0;;;15931:21:1;15988:2;15968:18;;;15961:30;16027:34;16007:18;;;16000:62;-1:-1:-1;;;16078:18:1;;;16071:39;16127:19;;20710:73:0;15747:405:1;59281:210:0;33044:6;;-1:-1:-1;;;;;33044:6:0;15722:10;33191:23;33183:68;;;;-1:-1:-1;;;33183:68:0;;;;;;;:::i;:::-;59389:11:::1;:23:::0;;;;59423:10:::1;:22:::0;59456:15:::1;:27:::0;;;::::1;;-1:-1:-1::0;;;59456:27:0::1;-1:-1:-1::0;;;;59456:27:0;;::::1;::::0;;;::::1;::::0;;59281:210::o;56884:517::-;56945:16;56974:18;56995:20;:10;41942:14;;41850:114;56995:20;56974:41;;57026:14;57047:21;57057:10;57047:9;:21::i;:::-;57026:42;;57079:16;57114:28;57159:6;57145:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57145:21:0;;57114:52;;57184:9;57179:184;57202:10;57198:1;:14;57179:184;;;57251:10;-1:-1:-1;;;;;57237:24:0;:10;57245:1;57237:7;:10::i;:::-;-1:-1:-1;;;;;57237:24:0;;57233:119;;;57306:1;57282:11;57294:8;57282:21;;;;;;;;:::i;:::-;;;;;;;;;;:25;57326:10;;;;:::i;:::-;;;;57233:119;57213:3;;;;:::i;:::-;;;;57179:184;;;-1:-1:-1;57382:11:0;56884:517;-1:-1:-1;;;;;56884:517:0:o;20305:208::-;20377:7;-1:-1:-1;;;;;20405:19:0;;20397:74;;;;-1:-1:-1;;;20397:74:0;;15538:2:1;20397:74:0;;;15520:21:1;15577:2;15557:18;;;15550:30;15616:34;15596:18;;;15589:62;-1:-1:-1;;;15667:18:1;;;15660:40;15717:19;;20397:74:0;15336:406:1;20397:74:0;-1:-1:-1;;;;;;20489:16:0;;;;;:9;:16;;;;;;;20305:208::o;33622:94::-;33044:6;;-1:-1:-1;;;;;33044:6:0;15722:10;33191:23;33183:68;;;;-1:-1:-1;;;33183:68:0;;;;;;;:::i;:::-;33687:21:::1;33705:1;33687:9;:21::i;:::-;33622:94::o:0;57744:::-;57787:7;57814:16;:6;41942:14;;41850:114;58527:162;33044:6;;-1:-1:-1;;;;;33044:6:0;15722:10;33191:23;33183:68;;;;-1:-1:-1;;;33183:68:0;;;;;;;:::i;:::-;58625:10:::1;:22:::0;;;;58658:11:::1;:23:::0;58527:162::o;21050:104::-;21106:13;21139:7;21132:14;;;;;:::i;54122:488::-;33044:6;;-1:-1:-1;;;;;33044:6:0;15722:10;33191:23;33183:68;;;;-1:-1:-1;;;33183:68:0;;;;;;;:::i;:::-;54202:26:::1;54231:20;:10;41942:14:::0;;41850:114;54231:20:::1;54202:49;;45148:2;54297:6;54272:22;;:31;;;;:::i;:::-;:49;54264:103;;;::::0;-1:-1:-1;;;54264:103:0;;11179:2:1;54264:103:0::1;::::0;::::1;11161:21:1::0;11218:2;11198:18;;;11191:30;11257:34;11237:18;;;11230:62;-1:-1:-1;;;11308:18:1;;;11301:39;11357:19;;54264:103:0::1;10977:405:1::0;54264:103:0::1;54385:9;54380:185;54403:6;54399:1;:10;54380:185;;;54430:45;54440:10;54452:22;54473:1:::0;54452:18;:22:::1;:::i;54430:45::-;54492:22;:10;42061:19:::0;;42079:1;42061:19;;;41972:127;54492:22:::1;54529;:24:::0;;;:22:::1;:24;::::0;::::1;:::i;:::-;;;;;;54410:3;;;;;:::i;:::-;;;;54380:185;;55868:923:::0;55963:6;47800:10;47777:19;55963:6;47777:7;:19::i;:::-;-1:-1:-1;;;;;47777:33:0;;47769:87;;;;-1:-1:-1;;;47769:87:0;;;;;;;:::i;:::-;55987:9;47800:10:::1;47777:19;55987:9:::0;47777:7:::1;:19::i;:::-;-1:-1:-1::0;;;;;47777:33:0::1;;47769:87;;;;-1:-1:-1::0;;;47769:87:0::1;;;;;;;:::i;:::-;48039:33:::2;::::0;;;:21:::2;:33;::::0;;;;;56012:6;;48039:33:::2;;48031:109;;;;-1:-1:-1::0;;;48031:109:0::2;;;;;;;:::i;:::-;48039:33:::3;::::0;;;:21:::3;:33;::::0;;;;;56034:9;;48039:33:::3;;48031:109;;;;-1:-1:-1::0;;;48031:109:0::3;;;;;;;:::i;:::-;47541:15:::4;::::0;-1:-1:-1;;;47541:15:0;::::4;;;47533:55;;;::::0;-1:-1:-1;;;47533:55:0;;12819:2:1;47533:55:0::4;::::0;::::4;12801:21:1::0;12858:2;12838:18;;;12831:30;12897:29;12877:18;;;12870:57;12944:18;;47533:55:0::4;12617:351:1::0;47533:55:0::4;56069:19:::5;56097:16;:6;41942:14:::0;;41850:114;56097:16:::5;56091:22;::::0;:3:::5;:22;:::i;:::-;56069:44;;56166:9;56156:6;:19;;56148:72;;;;-1:-1:-1::0;;;56148:72:0::5;;;;;;;:::i;:::-;56263:11;56239:20;:10;41942:14:::0;;41850:114;56239:20:::5;:35;;56231:88;;;::::0;-1:-1:-1;;;56231:88:0;;23413:2:1;56231:88:0::5;::::0;::::5;23395:21:1::0;23452:2;23432:18;;;23425:30;23491:34;23471:18;;;23464:62;-1:-1:-1;;;23542:18:1;;;23535:38;23590:19;;56231:88:0::5;23211:404:1::0;56231:88:0::5;56414:5;::::0;-1:-1:-1;;;;;56414:5:0::5;:10;56425;56465:20;:10;41942:14:::0;;41850:114;56465:20:::5;56452:10;;:33;;;;:::i;:::-;56437:11;;:49;;;;:::i;:::-;56414:73;::::0;-1:-1:-1;;;;;;56414:73:0::5;::::0;;;;;;-1:-1:-1;;;;;8231:32:1;;;56414:73:0::5;::::0;::::5;8213:51:1::0;8280:18;;;8273:34;8186:18;;56414:73:0::5;;;;;;;;;;;;;;;;;::::0;::::5;;;;;;;;;;;;::::0;::::5;;;;;-1:-1:-1::0;;56527:12:0::5;::::0;56498:57:::5;::::0;;::::5;::::0;::::5;::::0;;;56527:12:::5;56498:57:::0;;::::5;::::0;-1:-1:-1;56515:10:0::5;::::0;-1:-1:-1;;;;;;56527:12:0;;::::5;::::0;56541:9;;56498:16:::5;:57::i;:::-;56600:5;56568:29:::0;;;:21:::5;:29;::::0;;;;;;;:37;;-1:-1:-1;;56568:37:0;;::::5;::::0;;;56616:17:::5;:25:::0;;;;;;:32;;;;::::5;56568:37:::0;56616:32:::5;::::0;;56659:22:::5;:10;42061:19:::0;;42079:1;42061:19;;;41972:127;56659:22:::5;56692:18;:6;42061:19:::0;;42079:1;42061:19;;;41972:127;56692:18:::5;56728:55;::::0;;56753:10:::5;8520:51:1::0;;8602:2;8587:18;;8580:34;;;8630:18;;;8623:34;;;56728:55:0::5;::::0;8508:2:1;8493:18;56728:55:0::5;;;;;;;56058:733;48151:1:::3;47867::::2;::::1;55868:923:::0;;;:::o;50230:811::-;48310:10;;48292:15;:28;48284:68;;;;-1:-1:-1;;;48284:68:0;;;;;;;:::i;:::-;50307:9:::1;50320:10;50307:23;50299:68;;;;-1:-1:-1::0;;;50299:68:0::1;;;;;;;:::i;:::-;50395:1;50386:6;:10;:33;;;;;45526:1;50400:6;:19;;50386:33;50378:81;;;;-1:-1:-1::0;;;50378:81:0::1;;;;;;;:::i;:::-;50495:11;;50476:15;:30;50472:318;;50583:33;45379:3;45270;50583:33;:::i;:::-;50565:52;::::0;44995:4:::1;50565:52;:::i;:::-;50554:6;50531:20;:10;41942:14:::0;;41850:114;50531:20:::1;:29;;;;:::i;:::-;:87;;50523:131;;;;-1:-1:-1::0;;;50523:131:0::1;;;;;;;:::i;:::-;50472:318;;;44995:4;50718:6;50695:20;:10;41942:14:::0;;41850:114;50695:20:::1;:29;;;;:::i;:::-;:47;;50687:91;;;;-1:-1:-1::0;;;50687:91:0::1;;;;;;;:::i;:::-;50832:9;50822:6;50810:9;;:18;;;;:::i;:::-;:31;50802:69;;;::::0;-1:-1:-1;;;50802:69:0;;23059:2:1;50802:69:0::1;::::0;::::1;23041:21:1::0;23098:2;23078:18;;;23071:30;23137:27;23117:18;;;23110:55;23182:18;;50802:69:0::1;22857:349:1::0;50802:69:0::1;50897:9;50892:142;50915:6;50911:1;:10;50892:142;;;50942:43;50952:10;50964:20;:10;41942:14:::0;;41850:114;50942:43:::1;51000:22;:10;42061:19:::0;;42079:1;42061:19;;;41972:127;51000:22:::1;50922:3:::0;::::1;::::0;::::1;:::i;:::-;;;;50892:142;;22733:295:::0;-1:-1:-1;;;;;22836:24:0;;15722:10;22836:24;;22828:62;;;;-1:-1:-1;;;22828:62:0;;13937:2:1;22828:62:0;;;13919:21:1;13976:2;13956:18;;;13949:30;14015:27;13995:18;;;13988:55;14060:18;;22828:62:0;13735:349:1;22828:62:0;15722:10;22903:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;22903:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;22903:53:0;;;;;;;;;;22972:48;;9445:41:1;;;22903:42:0;;15722:10;22972:48;;9418:18:1;22972:48:0;;;;;;;22733:295;;:::o;49192:137::-;49292:11;;:29;;-1:-1:-1;;;49292:29:0;;-1:-1:-1;;;;;6813:32:1;;;49292:29:0;;;6795:51:1;49265:7:0;;49292:11;;:21;;6768:18:1;;49292:29:0;6649:203:1;59039:100:0;33044:6;;-1:-1:-1;;;;;33044:6:0;15722:10;33191:23;33183:68;;;;-1:-1:-1;;;33183:68:0;;;;;;;:::i;:::-;59113:10:::1;:18:::0;59039:100::o;60431:217::-;60549:5;;:27;;-1:-1:-1;;;60549:27:0;;-1:-1:-1;;;;;7087:15:1;;;60549:27:0;;;7069:34:1;7139:15;;;7119:18;;;7112:43;60549:5:0;;;;:17;;7004:18:1;;60549:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60589:51;60613:4;60619:2;60623:10;60635:4;60589:23;:51::i;:::-;60431:217;;;;:::o;21225:334::-;25899:4;25923:16;;;:7;:16;;;;;;21298:13;;-1:-1:-1;;;;;25923:16:0;21324:76;;;;-1:-1:-1;;;21324:76:0;;18742:2:1;21324:76:0;;;18724:21:1;18781:2;18761:18;;;18754:30;18820:34;18800:18;;;18793:62;-1:-1:-1;;;18871:18:1;;;18864:45;18926:19;;21324:76:0;18540:411:1;21324:76:0;21413:21;21437:10;:8;:10::i;:::-;21413:34;;21489:1;21471:7;21465:21;:25;:86;;;;;;;;;;;;;;;;;21517:7;21526:18;:7;:16;:18::i;:::-;21500:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21465:86;21458:93;21225:334;-1:-1:-1;;;21225:334:0:o;54864:841::-;54953:6;47800:10;47777:19;54953:6;47777:7;:19::i;:::-;-1:-1:-1;;;;;47777:33:0;;47769:87;;;;-1:-1:-1;;;47769:87:0;;;;;;;:::i;:::-;54977:9;47800:10:::1;47777:19;54977:9:::0;47777:7:::1;:19::i;:::-;-1:-1:-1::0;;;;;47777:33:0::1;;47769:87;;;;-1:-1:-1::0;;;47769:87:0::1;;;;;;;:::i;:::-;47541:15:::2;::::0;-1:-1:-1;;;47541:15:0;::::2;;;47533:55;;;::::0;-1:-1:-1;;;47533:55:0;;12819:2:1;47533:55:0::2;::::0;::::2;12801:21:1::0;12858:2;12838:18;;;12831:30;12897:29;12877:18;;;12870:57;12944:18;;47533:55:0::2;12617:351:1::0;47533:55:0::2;55030:9:::3;55020:6;:19;;55012:72;;;;-1:-1:-1::0;;;55012:72:0::3;;;;;;;:::i;:::-;55104:29;::::0;;;:21:::3;:29;::::0;;;;;::::3;;55103:30;:67:::0;::::3;;;-1:-1:-1::0;55138:32:0::3;::::0;;;:21:::3;:32;::::0;;;;;::::3;;55137:33;55103:67;55095:150;;;::::0;-1:-1:-1;;;55095:150:0;;21461:2:1;55095:150:0::3;::::0;::::3;21443:21:1::0;21500:2;21480:18;;;21473:30;21539:34;21519:18;;;21512:62;21610:34;21590:18;;;21583:62;-1:-1:-1;;;21661:19:1;;;21654:37;21708:19;;55095:150:0::3;21259:474:1::0;55095:150:0::3;55339:5;::::0;-1:-1:-1;;;;;55339:5:0::3;:10;55350;55390:20;:10;41942:14:::0;;41850:114;55390:20:::3;55377:10;;:33;;;;:::i;:::-;55362:11;;:49;;;;:::i;:::-;55339:73;::::0;-1:-1:-1;;;;;;55339:73:0::3;::::0;;;;;;-1:-1:-1;;;;;8231:32:1;;;55339:73:0::3;::::0;::::3;8213:51:1::0;8280:18;;;8273:34;8186:18;;55339:73:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;55452:12:0::3;::::0;55423:57:::3;::::0;;::::3;::::0;::::3;::::0;;;55452:12:::3;55423:57:::0;;::::3;::::0;-1:-1:-1;55440:10:0::3;::::0;-1:-1:-1;;;;;;55452:12:0;;::::3;::::0;55466:9;;55423:16:::3;:57::i;:::-;55561:22;:10;42061:19:::0;;42079:1;42061:19;;;41972:127;55561:22:::3;55594:29;::::0;;;:21:::3;:29;::::0;;;;;;;;:36;;-1:-1:-1;;55594:36:0::3;55626:4;55594:36;::::0;;55648:49;;55667:10:::3;8520:51:1::0;;8587:18;;;8580:34;;;8630:18;;;8623:34;;;55648:49:0::3;::::0;8508:2:1;8493:18;55648:49:0::3;;;;;;;47867:1:::1;54864:841:::0;;;:::o;52008:815::-;48310:10;;48292:15;:28;48284:68;;;;-1:-1:-1;;;48284:68:0;;;;;;;:::i;:::-;48564:11:::1;;48546:15;:29;48538:66;;;::::0;-1:-1:-1;;;48538:66:0;;22358:2:1;48538:66:0::1;::::0;::::1;22340:21:1::0;22397:2;22377:18;;;22370:30;-1:-1:-1;;;22416:18:1;;;22409:54;22480:18;;48538:66:0::1;22156:348:1::0;48538:66:0::1;52082:26:::2;52111:20;:10;41942:14:::0;;41850:114;52111:20:::2;52082:49:::0;-1:-1:-1;52152:9:0::2;52165:10;52152:23;52144:68;;;;-1:-1:-1::0;;;52144:68:0::2;;;;;;;:::i;:::-;44995:4;52231:22;:18:::0;52252:1:::2;52231:22;:::i;:::-;:40;;52223:72;;;;-1:-1:-1::0;;;52223:72:0::2;;;;;;;:::i;:::-;45379:3;52314:22;;52339:1;52314:26;;;;:::i;:::-;:45;;52306:77;;;;-1:-1:-1::0;;;52306:77:0::2;;;;;;;:::i;:::-;52442:1;52402:36;52427:10;52402:24;:36::i;:::-;:41;;:89;;;;52490:1;52447:39;52475:10;52447:27;:39::i;:::-;:44;;52402:89;52394:147;;;;-1:-1:-1::0;;;52394:147:0::2;;;;;;;:::i;:::-;52569:10;52560:20;::::0;;;:8:::2;:20;::::0;;;;;52583:1:::2;-1:-1:-1::0;52552:66:0::2;;;::::0;-1:-1:-1;;;52552:66:0;;10821:2:1;52552:66:0::2;::::0;::::2;10803:21:1::0;10860:2;10840:18;;;10833:30;10899:31;10879:18;;;10872:59;10948:18;;52552:66:0::2;10619:353:1::0;52552:66:0::2;52631:41;52641:10;52653:18;52631:9;:41::i;:::-;52685:22;:10;42061:19:::0;;42079:1;42061:19;;;41972:127;52685:22:::2;52727:10;52718:20;::::0;;;:8:::2;:20;::::0;;;;52741:1:::2;52718:24:::0;;52753:22:::2;:24:::0;;;::::2;::::0;::::2;:::i;33871:192::-:0;33044:6;;-1:-1:-1;;;;;33044:6:0;15722:10;33191:23;33183:68;;;;-1:-1:-1;;;33183:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33960:22:0;::::1;33952:73;;;::::0;-1:-1:-1;;;33952:73:0;;12412:2:1;33952:73:0::1;::::0;::::1;12394:21:1::0;12451:2;12431:18;;;12424:30;12490:34;12470:18;;;12463:62;-1:-1:-1;;;12541:18:1;;;12534:36;12587:19;;33952:73:0::1;12210:402:1::0;33952:73:0::1;34036:19;34046:8;34036:9;:19::i;:::-;33871:192:::0;:::o;58806:98::-;33044:6;;-1:-1:-1;;;;;33044:6:0;15722:10;33191:23;33183:68;;;;-1:-1:-1;;;33183:68:0;;;;;;;:::i;:::-;58879:9:::1;:17:::0;58806:98::o;57597:102::-;57644:7;57671:20;:10;41942:14;;41850:114;29816:174;29891:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;29891:29:0;-1:-1:-1;;;;;29891:29:0;;;;;;;;:24;;29945:23;29891:24;29945:14;:23::i;:::-;-1:-1:-1;;;;;29936:46:0;;;;;;;;;;;29816:174;;:::o;26818:110::-;26894:26;26904:2;26908:7;26894:26;;;;;;;;;;;;:9;:26::i;23330:339::-;23525:41;15722:10;23558:7;23525:18;:41::i;:::-;23517:103;;;;-1:-1:-1;;;23517:103:0;;;;;;;:::i;:::-;23633:28;23643:4;23649:2;23653:7;23633:9;:28::i;34071:173::-;34146:6;;;-1:-1:-1;;;;;34163:17:0;;;-1:-1:-1;;;;;;34163:17:0;;;;;;;34196:40;;34146:6;;;34163:17;34146:6;;34196:40;;34127:16;;34196:40;34116:128;34071:173;:::o;23996:328::-;24171:41;15722:10;24204:7;24171:18;:41::i;:::-;24163:103;;;;-1:-1:-1;;;24163:103:0;;;;;;;:::i;:::-;24277:39;24291:4;24297:2;24301:7;24310:5;24277:13;:39::i;57882:100::-;57934:13;57967:7;57960:14;;;;;:::i;16084:723::-;16140:13;16361:10;16357:53;;-1:-1:-1;;16388:10:0;;;;;;;;;;;;-1:-1:-1;;;16388:10:0;;;;;16084:723::o;16357:53::-;16435:5;16420:12;16476:78;16483:9;;16476:78;;16509:8;;;;:::i;:::-;;-1:-1:-1;16532:10:0;;-1:-1:-1;16540:2:0;16532:10;;:::i;:::-;;;16476:78;;;16564:19;16596:6;16586:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16586:17:0;;16564:39;;16614:154;16621:10;;16614:154;;16648:11;16658:1;16648:11;;:::i;:::-;;-1:-1:-1;16717:10:0;16725:2;16717:5;:10;:::i;:::-;16704:24;;:2;:24;:::i;:::-;16691:39;;16674:6;16681;16674:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;16674:56:0;;;;;;;;-1:-1:-1;16745:11:0;16754:2;16745:11;;:::i;:::-;;;16614:154;;;16792:6;16084:723;-1:-1:-1;;;;16084:723:0:o;27155:321::-;27285:18;27291:2;27295:7;27285:5;:18::i;:::-;27336:54;27367:1;27371:2;27375:7;27384:5;27336:22;:54::i;:::-;27314:154;;;;-1:-1:-1;;;27314:154:0;;;;;;;:::i;26128:348::-;26221:4;25923:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25923:16:0;26238:73;;;;-1:-1:-1;;;26238:73:0;;14700:2:1;26238:73:0;;;14682:21:1;14739:2;14719:18;;;14712:30;14778:34;14758:18;;;14751:62;-1:-1:-1;;;14829:18:1;;;14822:42;14881:19;;26238:73:0;14498:408:1;26238:73:0;26322:13;26338:23;26353:7;26338:14;:23::i;:::-;26322:39;;26391:5;-1:-1:-1;;;;;26380:16:0;:7;-1:-1:-1;;;;;26380:16:0;;:51;;;;26424:7;-1:-1:-1;;;;;26400:31:0;:20;26412:7;26400:11;:20::i;:::-;-1:-1:-1;;;;;26400:31:0;;26380:51;:87;;;-1:-1:-1;;;;;;23220:25:0;;;23196:4;23220:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;26435:32;23099:164;29120:578;29279:4;-1:-1:-1;;;;;29252:31:0;:23;29267:7;29252:14;:23::i;:::-;-1:-1:-1;;;;;29252:31:0;;29244:85;;;;-1:-1:-1;;;29244:85:0;;18332:2:1;29244:85:0;;;18314:21:1;18371:2;18351:18;;;18344:30;18410:34;18390:18;;;18383:62;-1:-1:-1;;;18461:18:1;;;18454:39;18510:19;;29244:85:0;18130:405:1;29244:85:0;-1:-1:-1;;;;;29348:16:0;;29340:65;;;;-1:-1:-1;;;29340:65:0;;13532:2:1;29340:65:0;;;13514:21:1;13571:2;13551:18;;;13544:30;13610:34;13590:18;;;13583:62;-1:-1:-1;;;13661:18:1;;;13654:34;13705:19;;29340:65:0;13330:400:1;29340:65:0;29522:29;29539:1;29543:7;29522:8;:29::i;:::-;-1:-1:-1;;;;;29564:15:0;;;;;;:9;:15;;;;;:20;;29583:1;;29564:15;:20;;29583:1;;29564:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29595:13:0;;;;;;:9;:13;;;;;:18;;29612:1;;29595:13;:18;;29612:1;;29595:18;:::i;:::-;;;;-1:-1:-1;;29624:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29624:21:0;-1:-1:-1;;;;;29624:21:0;;;;;;;;;29663:27;;29624:16;;29663:27;;;;;;;29120:578;;;:::o;25206:315::-;25363:28;25373:4;25379:2;25383:7;25363:9;:28::i;:::-;25410:48;25433:4;25439:2;25443:7;25452:5;25410:22;:48::i;:::-;25402:111;;;;-1:-1:-1;;;25402:111:0;;;;;;;:::i;27812:382::-;-1:-1:-1;;;;;27892:16:0;;27884:61;;;;-1:-1:-1;;;27884:61:0;;17197:2:1;27884:61:0;;;17179:21:1;;;17216:18;;;17209:30;17275:34;17255:18;;;17248:62;17327:18;;27884:61:0;16995:356:1;27884:61:0;25899:4;25923:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25923:16:0;:30;27956:58;;;;-1:-1:-1;;;27956:58:0;;13175:2:1;27956:58:0;;;13157:21:1;13214:2;13194:18;;;13187:30;13253;13233:18;;;13226:58;13301:18;;27956:58:0;12973:352:1;27956:58:0;-1:-1:-1;;;;;28085:13:0;;;;;;:9;:13;;;;;:18;;28102:1;;28085:13;:18;;28102:1;;28085:18;:::i;:::-;;;;-1:-1:-1;;28114:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28114:21:0;-1:-1:-1;;;;;28114:21:0;;;;;;;;28153:33;;28114:16;;;28153:33;;28114:16;;28153:33;27812:382;;:::o;30555:799::-;30710:4;-1:-1:-1;;;;;30731:13:0;;8092:20;8140:8;30727:620;;30767:72;;-1:-1:-1;;;30767:72:0;;-1:-1:-1;;;;;30767:36:0;;;;;:72;;15722:10;;30818:4;;30824:7;;30833:5;;30767:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30767:72:0;;;;;;;;-1:-1:-1;;30767:72:0;;;;;;;;;;;;:::i;:::-;;;30763:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31009:13:0;;31005:272;;31052:60;;-1:-1:-1;;;31052:60:0;;;;;;;:::i;31005:272::-;31227:6;31221:13;31212:6;31208:2;31204:15;31197:38;30763:529;-1:-1:-1;;;;;;30890:51:0;-1:-1:-1;;;30890:51:0;;-1:-1:-1;30883:58:0;;30727:620;-1:-1:-1;31331:4:0;30555:799;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:186;1052:6;1105:2;1093:9;1084:7;1080:23;1076:32;1073:52;;;1121:1;1118;1111:12;1073:52;1144:29;1163:9;1144:29;:::i;1184:260::-;1252:6;1260;1313:2;1301:9;1292:7;1288:23;1284:32;1281:52;;;1329:1;1326;1319:12;1281:52;1352:29;1371:9;1352:29;:::i;:::-;1342:39;;1400:38;1434:2;1423:9;1419:18;1400:38;:::i;:::-;1390:48;;1184:260;;;;;:::o;1449:409::-;1535:6;1543;1551;1559;1612:3;1600:9;1591:7;1587:23;1583:33;1580:53;;;1629:1;1626;1619:12;1580:53;1652:29;1671:9;1652:29;:::i;:::-;1642:39;;1700:38;1734:2;1723:9;1719:18;1700:38;:::i;:::-;1690:48;;1757:38;1791:2;1780:9;1776:18;1757:38;:::i;:::-;1747:48;;1814:38;1848:2;1837:9;1833:18;1814:38;:::i;:::-;1804:48;;1449:409;;;;;;;:::o;1863:328::-;1940:6;1948;1956;2009:2;1997:9;1988:7;1984:23;1980:32;1977:52;;;2025:1;2022;2015:12;1977:52;2048:29;2067:9;2048:29;:::i;:::-;2038:39;;2096:38;2130:2;2119:9;2115:18;2096:38;:::i;:::-;2086:48;;2181:2;2170:9;2166:18;2153:32;2143:42;;1863:328;;;;;:::o;2196:666::-;2291:6;2299;2307;2315;2368:3;2356:9;2347:7;2343:23;2339:33;2336:53;;;2385:1;2382;2375:12;2336:53;2408:29;2427:9;2408:29;:::i;:::-;2398:39;;2456:38;2490:2;2479:9;2475:18;2456:38;:::i;:::-;2446:48;;2541:2;2530:9;2526:18;2513:32;2503:42;;2596:2;2585:9;2581:18;2568:32;2623:18;2615:6;2612:30;2609:50;;;2655:1;2652;2645:12;2609:50;2678:22;;2731:4;2723:13;;2719:27;-1:-1:-1;2709:55:1;;2760:1;2757;2750:12;2709:55;2783:73;2848:7;2843:2;2830:16;2825:2;2821;2817:11;2783:73;:::i;:::-;2773:83;;;2196:666;;;;;;;:::o;2867:254::-;2932:6;2940;2993:2;2981:9;2972:7;2968:23;2964:32;2961:52;;;3009:1;3006;2999:12;2961:52;3032:29;3051:9;3032:29;:::i;:::-;3022:39;;3080:35;3111:2;3100:9;3096:18;3080:35;:::i;3126:254::-;3194:6;3202;3255:2;3243:9;3234:7;3230:23;3226:32;3223:52;;;3271:1;3268;3261:12;3223:52;3294:29;3313:9;3294:29;:::i;:::-;3284:39;3370:2;3355:18;;;;3342:32;;-1:-1:-1;;;3126:254:1:o;3385:615::-;3471:6;3479;3532:2;3520:9;3511:7;3507:23;3503:32;3500:52;;;3548:1;3545;3538:12;3500:52;3588:9;3575:23;3617:18;3658:2;3650:6;3647:14;3644:34;;;3674:1;3671;3664:12;3644:34;3712:6;3701:9;3697:22;3687:32;;3757:7;3750:4;3746:2;3742:13;3738:27;3728:55;;3779:1;3776;3769:12;3728:55;3819:2;3806:16;3845:2;3837:6;3834:14;3831:34;;;3861:1;3858;3851:12;3831:34;3914:7;3909:2;3899:6;3896:1;3892:14;3888:2;3884:23;3880:32;3877:45;3874:65;;;3935:1;3932;3925:12;3874:65;3966:2;3958:11;;;;;3988:6;;-1:-1:-1;3385:615:1;;-1:-1:-1;;;;3385:615:1:o;4005:245::-;4063:6;4116:2;4104:9;4095:7;4091:23;4087:32;4084:52;;;4132:1;4129;4122:12;4084:52;4171:9;4158:23;4190:30;4214:5;4190:30;:::i;4255:249::-;4324:6;4377:2;4365:9;4356:7;4352:23;4348:32;4345:52;;;4393:1;4390;4383:12;4345:52;4425:9;4419:16;4444:30;4468:5;4444:30;:::i;4509:450::-;4578:6;4631:2;4619:9;4610:7;4606:23;4602:32;4599:52;;;4647:1;4644;4637:12;4599:52;4687:9;4674:23;4720:18;4712:6;4709:30;4706:50;;;4752:1;4749;4742:12;4706:50;4775:22;;4828:4;4820:13;;4816:27;-1:-1:-1;4806:55:1;;4857:1;4854;4847:12;4806:55;4880:73;4945:7;4940:2;4927:16;4922:2;4918;4914:11;4880:73;:::i;4964:180::-;5023:6;5076:2;5064:9;5055:7;5051:23;5047:32;5044:52;;;5092:1;5089;5082:12;5044:52;-1:-1:-1;5115:23:1;;4964:180;-1:-1:-1;4964:180:1:o;5149:184::-;5219:6;5272:2;5260:9;5251:7;5247:23;5243:32;5240:52;;;5288:1;5285;5278:12;5240:52;-1:-1:-1;5311:16:1;;5149:184;-1:-1:-1;5149:184:1:o;5338:248::-;5406:6;5414;5467:2;5455:9;5446:7;5442:23;5438:32;5435:52;;;5483:1;5480;5473:12;5435:52;-1:-1:-1;;5506:23:1;;;5576:2;5561:18;;;5548:32;;-1:-1:-1;5338:248:1:o;5591:316::-;5665:6;5673;5681;5734:2;5722:9;5713:7;5709:23;5705:32;5702:52;;;5750:1;5747;5740:12;5702:52;5786:9;5773:23;5763:33;;5843:2;5832:9;5828:18;5815:32;5805:42;;5866:35;5897:2;5886:9;5882:18;5866:35;:::i;:::-;5856:45;;5591:316;;;;;:::o;5912:257::-;5953:3;5991:5;5985:12;6018:6;6013:3;6006:19;6034:63;6090:6;6083:4;6078:3;6074:14;6067:4;6060:5;6056:16;6034:63;:::i;:::-;6151:2;6130:15;-1:-1:-1;;6126:29:1;6117:39;;;;6158:4;6113:50;;5912:257;-1:-1:-1;;5912:257:1:o;6174:470::-;6353:3;6391:6;6385:13;6407:53;6453:6;6448:3;6441:4;6433:6;6429:17;6407:53;:::i;:::-;6523:13;;6482:16;;;;6545:57;6523:13;6482:16;6579:4;6567:17;;6545:57;:::i;:::-;6618:20;;6174:470;-1:-1:-1;;;;6174:470:1:o;7546:488::-;-1:-1:-1;;;;;7815:15:1;;;7797:34;;7867:15;;7862:2;7847:18;;7840:43;7914:2;7899:18;;7892:34;;;7962:3;7957:2;7942:18;;7935:31;;;7740:4;;7983:45;;8008:19;;8000:6;7983:45;:::i;:::-;7975:53;7546:488;-1:-1:-1;;;;;;7546:488:1:o;8668:632::-;8839:2;8891:21;;;8961:13;;8864:18;;;8983:22;;;8810:4;;8839:2;9062:15;;;;9036:2;9021:18;;;8810:4;9105:169;9119:6;9116:1;9113:13;9105:169;;;9180:13;;9168:26;;9249:15;;;;9214:12;;;;9141:1;9134:9;9105:169;;;-1:-1:-1;9291:3:1;;8668:632;-1:-1:-1;;;;;;8668:632:1:o;10395:219::-;10544:2;10533:9;10526:21;10507:4;10564:44;10604:2;10593:9;10589:18;10581:6;10564:44;:::i;11387:399::-;11589:2;11571:21;;;11628:2;11608:18;;;11601:30;11667:34;11662:2;11647:18;;11640:62;-1:-1:-1;;;11733:2:1;11718:18;;11711:33;11776:3;11761:19;;11387:399::o;11791:414::-;11993:2;11975:21;;;12032:2;12012:18;;;12005:30;12071:34;12066:2;12051:18;;12044:62;-1:-1:-1;;;12137:2:1;12122:18;;12115:48;12195:3;12180:19;;11791:414::o;14089:404::-;14291:2;14273:21;;;14330:2;14310:18;;;14303:30;14369:34;14364:2;14349:18;;14342:62;-1:-1:-1;;;14435:2:1;14420:18;;14413:38;14483:3;14468:19;;14089:404::o;16563:427::-;16765:2;16747:21;;;16804:2;16784:18;;;16777:30;16843:34;16838:2;16823:18;;16816:62;16914:33;16909:2;16894:18;;16887:61;16980:3;16965:19;;16563:427::o;17769:356::-;17971:2;17953:21;;;17990:18;;;17983:30;18049:34;18044:2;18029:18;;18022:62;18116:2;18101:18;;17769:356::o;18956:351::-;19158:2;19140:21;;;19197:2;19177:18;;;19170:30;19236:29;19231:2;19216:18;;19209:57;19298:2;19283:18;;18956:351::o;19312:409::-;19514:2;19496:21;;;19553:2;19533:18;;;19526:30;19592:34;19587:2;19572:18;;19565:62;-1:-1:-1;;;19658:2:1;19643:18;;19636:43;19711:3;19696:19;;19312:409::o;20128:355::-;20330:2;20312:21;;;20369:2;20349:18;;;20342:30;20408:33;20403:2;20388:18;;20381:61;20474:2;20459:18;;20128:355::o;20488:356::-;20690:2;20672:21;;;20709:18;;;20702:30;20768:34;20763:2;20748:18;;20741:62;20835:2;20820:18;;20488:356::o;20849:405::-;21051:2;21033:21;;;21090:2;21070:18;;;21063:30;21129:34;21124:2;21109:18;;21102:62;-1:-1:-1;;;21195:2:1;21180:18;;21173:39;21244:3;21229:19;;20849:405::o;21738:413::-;21940:2;21922:21;;;21979:2;21959:18;;;21952:30;22018:34;22013:2;21998:18;;21991:62;-1:-1:-1;;;22084:2:1;22069:18;;22062:47;22141:3;22126:19;;21738:413::o;22509:343::-;22711:2;22693:21;;;22750:2;22730:18;;;22723:30;-1:-1:-1;;;22784:2:1;22769:18;;22762:49;22843:2;22828:18;;22509:343::o;23802:128::-;23842:3;23873:1;23869:6;23866:1;23863:13;23860:39;;;23879:18;;:::i;:::-;-1:-1:-1;23915:9:1;;23802:128::o;23935:120::-;23975:1;24001;23991:35;;24006:18;;:::i;:::-;-1:-1:-1;24040:9:1;;23935:120::o;24060:168::-;24100:7;24166:1;24162;24158:6;24154:14;24151:1;24148:21;24143:1;24136:9;24129:17;24125:45;24122:71;;;24173:18;;:::i;:::-;-1:-1:-1;24213:9:1;;24060:168::o;24233:125::-;24273:4;24301:1;24298;24295:8;24292:34;;;24306:18;;:::i;:::-;-1:-1:-1;24343:9:1;;24233:125::o;24363:258::-;24435:1;24445:113;24459:6;24456:1;24453:13;24445:113;;;24535:11;;;24529:18;24516:11;;;24509:39;24481:2;24474:10;24445:113;;;24576:6;24573:1;24570:13;24567:48;;;-1:-1:-1;;24611:1:1;24593:16;;24586:27;24363:258::o;24626:380::-;24705:1;24701:12;;;;24748;;;24769:61;;24823:4;24815:6;24811:17;24801:27;;24769:61;24876:2;24868:6;24865:14;24845:18;24842:38;24839:161;;;24922:10;24917:3;24913:20;24910:1;24903:31;24957:4;24954:1;24947:15;24985:4;24982:1;24975:15;24839:161;;24626:380;;;:::o;25011:135::-;25050:3;-1:-1:-1;;25071:17:1;;25068:43;;;25091:18;;:::i;:::-;-1:-1:-1;25138:1:1;25127:13;;25011:135::o;25151:112::-;25183:1;25209;25199:35;;25214:18;;:::i;:::-;-1:-1:-1;25248:9:1;;25151:112::o;25268:127::-;25329:10;25324:3;25320:20;25317:1;25310:31;25360:4;25357:1;25350:15;25384:4;25381:1;25374:15;25400:127;25461:10;25456:3;25452:20;25449:1;25442:31;25492:4;25489:1;25482:15;25516:4;25513:1;25506:15;25532:127;25593:10;25588:3;25584:20;25581:1;25574:31;25624:4;25621:1;25614:15;25648:4;25645:1;25638:15;25664:127;25725:10;25720:3;25716:20;25713:1;25706:31;25756:4;25753:1;25746:15;25780:4;25777:1;25770:15;25796:131;-1:-1:-1;;;;;;25870:32:1;;25860:43;;25850:71;;25917:1;25914;25907:12

Swarm Source

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