ETH Price: $2,847.24 (-9.91%)
Gas: 13 Gwei

Token

Neo Tokyo: Outer Identities (NEOTOI)
 

Overview

Max Total Supply

4,495 NEOTOI

Holders

294

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
s1nghara.eth
Balance
1 NEOTOI
0xbdc48feac848d0d1d3714ef61dc3e15637248a40
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Ciphers decoding.... Preparing bytestream headers [/*|] Memory linked list unpacked. Welcome to the New World.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NTOuterIdentity

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-11
*/

/*
* Generated by @Thrasher66099
* Email [email protected] for your NFT launch needs
*/

pragma solidity ^0.8.0;

interface IByteContract {
    function burn(address _from, uint256 _amount) external;
}

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



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


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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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



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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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




/**
 * @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(to).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 {}
}



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

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

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


contract NTOuterIdentity is ERC721Enumerable, ReentrancyGuard, Ownable {

    uint256 maxTokens = 4500;
    uint256 costToReserve = 1 ether;
    uint256 timeToBurn = 60 minutes;
    uint256 earlyReservePeriod = 5 minutes;
    uint256 maxMints;
    uint256 beginBurn;
    uint256 beginReserve;
    uint256 mostBytesBurned;
    uint256 public totalMembersInBytesAuction;
    bool public saleActive;
    bool public whitelistActive;
    bool public burnActive;
    address outerIdentityMint;
    address bytesContract;
    address withdrawalAddress;
    address citizenContract;
    address identityContract;
    bytes32[] _rootHash;
    address[] public joinedBytesAuction;

     // Mapping for wallet addresses that have previously minted
    mapping(address => uint8) private _previousMinters;

    mapping(address => uint256) public bytesBurned;

    mapping(address => bool) public addressHasReserved;

    function setSaleActive() external onlyOwner
    {
        require(!saleActive, "Sale is already active");
        saleActive = true;
        beginReserve = block.timestamp;
    }

    function setWhitelistState() external onlyOwner
    {
        whitelistActive = !whitelistActive;
    }

    function setBurnState() external onlyOwner
    {
        burnActive = !burnActive;
    }

    function addRootHash(bytes32 _hash) external onlyOwner
    {
        _rootHash.push(_hash);
    }

    function setMaxMints(uint256 _value) external onlyOwner
    {
        maxMints = _value;
    }

    function setCitizenContract(address _address) external onlyOwner
    {
        citizenContract = _address;
    }

    function setIdentityContract(address _address) external onlyOwner
    {
        identityContract = _address;
    }

    function getMostBytesBurned() public view returns(uint256)
    {
        return mostBytesBurned;
    }

    function startBurn() external onlyOwner
    {
        require(!burnActive, "Burn already started");
        burnActive = true;
        beginBurn = block.timestamp;
    }

    function changeTimeToBurn(uint256 _time) external onlyOwner
    {
        require(burnActive, "Burn not active");
        timeToBurn = _time;
    }
    
    function getClass(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        NTOuterIdentity dataContract = NTOuterIdentity(outerIdentityMint);
        output = dataContract.getClass(tokenId);

        return output;
    }
    
    function getRace(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        NTOuterIdentity dataContract = NTOuterIdentity(outerIdentityMint);
        output = dataContract.getRace(tokenId);

        return output;
    }

    function getNose(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        NTOuterIdentity dataContract = NTOuterIdentity(outerIdentityMint);
        output = dataContract.getNose(tokenId);

        return output;
    }

    function getHair(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        NTOuterIdentity dataContract = NTOuterIdentity(outerIdentityMint);
        output = dataContract.getHair(tokenId);

        return output;
    }

    function getExpression(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        NTOuterIdentity dataContract = NTOuterIdentity(outerIdentityMint);
        output = dataContract.getExpression(tokenId);

        return output;
    }
    
    function getStrength(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        NTOuterIdentity dataContract = NTOuterIdentity(outerIdentityMint);
        output = dataContract.getStrength(tokenId);

        return output;
    }
    
    function getAttractiveness(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        NTOuterIdentity dataContract = NTOuterIdentity(outerIdentityMint);
        output = dataContract.getAttractiveness(tokenId);

        return output;
    }
    
    function getTechSkill(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;

        NTOuterIdentity dataContract = NTOuterIdentity(outerIdentityMint);
        output = dataContract.getTechSkill(tokenId);

        return output;
    }
    
    function getCool(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;

        NTOuterIdentity dataContract = NTOuterIdentity(outerIdentityMint);
        output = dataContract.getCool(tokenId);

        return output;
    }

    function getEyes(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;

        NTOuterIdentity dataContract = NTOuterIdentity(outerIdentityMint);
        output = dataContract.getEyes(tokenId);

        return output;
    }

    function getAbility(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        NTOuterIdentity dataContract = NTOuterIdentity(outerIdentityMint);
        output = dataContract.getAbility(tokenId);

        return output;
    }

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

        NTOuterIdentity dataContract = NTOuterIdentity(outerIdentityMint);
        output = dataContract.tokenURI(tokenId);

        return output;
    }

    function timeUntilBytesAuctionEnds() external view returns(uint256)
    {
        require(burnActive, "Burning is not active");
        require(block.timestamp < (beginBurn + timeToBurn), "Burning has ended");
        return (beginBurn + timeToBurn) - block.timestamp;
    }

    function timeUntilPublicMint() external view returns(uint256)
    {
        require(saleActive, "Private minting has not started");
        require(block.timestamp < (beginReserve + earlyReservePeriod), "Public minting is open");
        return (beginReserve + earlyReservePeriod) - block.timestamp;
    }

    function reserveIdentity() public nonReentrant payable {
        require(saleActive, "Reserving is currently closed");
        require(block.timestamp > (beginReserve + earlyReservePeriod) || validateCitizen(), "You cannot reserve yet");
        require(totalMembersInBytesAuction < maxTokens, "All tokens have been reserved");
        require(!addressHasReserved[_msgSender()], "This wallet has already reserved");
        require(msg.value == costToReserve, "Incorrect reserve payment");

        addressHasReserved[_msgSender()] = true;

        joinedBytesAuction.push(_msgSender());

        totalMembersInBytesAuction++;
    }

    function validateCitizen() internal view returns(bool) {
        ERC721 citizenData = ERC721(citizenContract);
        ERC721 identityData = ERC721(identityContract);
        if(citizenData.balanceOf(_msgSender()) > 0 || identityData.balanceOf(_msgSender()) > 0)
        {
            return true;
        }
        return false;
    }

    function burnBytes(uint256 amount) public nonReentrant
    {
        require(burnActive, "Burning is not currently active");
        require(block.timestamp < (timeToBurn + beginBurn), "Burn auction has ended");
        require(addressHasReserved[_msgSender()], "You did not enter the auction");
        uint256 burnAmount = amount * 10 ** 18;
        IByteContract iBytes = IByteContract(bytesContract);
        iBytes.burn(_msgSender(), burnAmount);
        uint256 currentBurned = bytesBurned[_msgSender()] + amount;
        bytesBurned[_msgSender()] = currentBurned;

        if(currentBurned > mostBytesBurned)
        {
            mostBytesBurned = currentBurned;
        }
    }

    function whitelistClaim(uint256 tokenId, uint256 spotInWhitelist, bytes32[] memory proof) public nonReentrant {
        require(whitelistActive, "The whitelist is not active yet");
        require(!_exists(tokenId), "Token ID already exists");
        require(whitelistValidated(_msgSender(), spotInWhitelist, tokenId, proof), "You're not on the whitelist");
        require(_previousMinters[_msgSender()] < 1, "You've already minted");

        //Set the previousMinter value to 1 for this address as it will now mint
        _previousMinters[_msgSender()] = 1;

        _safeMint(_msgSender(), tokenId);
    }
    
    function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
        require(!_exists(tokenId), "Token ID already exists");
        _safeMint(owner(), tokenId);
    }


    function whitelistValidated(address wallet, uint256 index, uint256 spotInLeaderboard, bytes32[] memory proof) internal view returns (bool) {

        // Compute the merkle root
        bytes32 node = keccak256(abi.encodePacked(index, wallet, spotInLeaderboard));
        uint256 path = index;
        for (uint16 i = 0; i < proof.length; i++) {
            if ((path & 0x01) == 1) {
                node = keccak256(abi.encodePacked(proof[i], node));
            } else {
                node = keccak256(abi.encodePacked(node, proof[i]));
            }
            path /= 2;
        }

         // Check the merkle proof against the root hash array
        for(uint i = 0; i < _rootHash.length; i++)
        {
            if (node == _rootHash[i])
            {
                return true;
            }
        }

        return false;
    }

    function setOuterIdentityMintContract(address contractAddress) public onlyOwner {
        outerIdentityMint = contractAddress;
    }    

    function setWithdrawalAddress(address _address) external onlyOwner
    {
        withdrawalAddress = _address;
    }

    function withdraw() external onlyOwner
    {
        require(withdrawalAddress != address(0), "Withdrawal address must be set");
        payable(withdrawalAddress).transfer(address(this).balance);
    }
    
    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }
    
    constructor() ERC721("Neo Tokyo: Outer Identities", "NEOTOI") Ownable() {

        maxMints = 1;
        outerIdentityMint = 0xB0605041b92e66E8834675Ff63AEa0253BdCBC3c;
        identityContract = 0x86357A19E5537A8Fba9A004E555713BC943a66C0;
        citizenContract = 0xb668beB1Fa440F6cF2Da0399f8C28caB993Bdd65;
        bytesContract = 0x7d647b1A0dcD5525e9C6B3D14BE58f27674f8c95;
        withdrawalAddress = 0xb616945250CCEF6135006a869D0c7f5b1406854C;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"addRootHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressHasReserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnBytes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bytesBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"changeTimeToBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAbility","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"getAttractiveness","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getClass","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCool","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getExpression","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getEyes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHair","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMostBytesBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getNose","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRace","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStrength","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTechSkill","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"joinedBytesAuction","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveIdentity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"setBurnState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setCitizenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setIdentityContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMaxMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setOuterIdentityMintContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setWhitelistState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setWithdrawalAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeUntilBytesAuctionEnds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeUntilPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMembersInBytesAuction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"spotInWhitelist","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052611194600c55670de0b6b3a7640000600d55610e10600e5561012c600f553480156200002f57600080fd5b50604080518082018252601b81527f4e656f20546f6b796f3a204f75746572204964656e74697469657300000000006020808301918252835180850190945260068452654e454f544f4960d01b9084015281519192916200009391600091620001cb565b508051620000a9906001906020840190620001cb565b50506001600a5550620000bc3362000179565b60016010556015805476b0605041b92e66e8834675ff63aea0253bdcbc3c0000006301000000600160b81b0319909116179055601980546001600160a01b03199081167386357a19e5537a8fba9a004e555713bc943a66c01790915560188054821673b668beb1fa440f6cf2da0399f8c28cab993bdd65179055601680548216737d647b1a0dcd5525e9c6b3d14be58f27674f8c951790556017805490911673b616945250ccef6135006a869d0c7f5b1406854c179055620002ae565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001d99062000271565b90600052602060002090601f016020900481019282620001fd576000855562000248565b82601f106200021857805160ff191683800117855562000248565b8280016001018555821562000248579182015b82811115620002485782518255916020019190600101906200022b565b50620002569291506200025a565b5090565b5b808211156200025657600081556001016200025b565b600181811c908216806200028657607f821691505b60208210811415620002a857634e487b7160e01b600052602260045260246000fd5b50919050565b61362e80620002be6000396000f3fe60806040526004361061036b5760003560e01c80637aa3fe96116101c6578063c4d30bfa116100f7578063e6d5864b11610095578063e985e9c51161006f578063e985e9c5146109a4578063ef9dc668146109ed578063f2498c9e14610a0d578063f2fde38b14610a2d57600080fd5b8063e6d5864b1461094f578063e84a860f1461096f578063e960662b1461098f57600080fd5b8063ce383e70116100d1578063ce383e70146108cf578063d0d2a9e8146108ef578063d5523f771461090f578063e53fbda61461092f57600080fd5b8063c4d30bfa1461087a578063c7ab94fd1461089a578063c87b56dd146108af57600080fd5b80639c64ea8311610164578063b20bdf421161013e578063b20bdf4214610805578063b88d4fde14610825578063ba69f34e14610845578063bcc1e5011461085a57600080fd5b80639c64ea83146107af578063a22cb465146107c5578063a5c18ca6146107e557600080fd5b8063864ef3e5116101a0578063864ef3e5146107475780638d2ab3ed146107675780638da5cb5b1461077c57806395d89b411461079a57600080fd5b80637aa3fe96146106e75780637bc5fa671461070757806382b1168d1461072757600080fd5b806342842e0e116102a05780636352211e1161023e57806370a082311161021857806370a0823114610662578063715018a61461068257806379c9cb7b1461069757806379f703db146106b757600080fd5b80636352211e1461061357806368428a1b14610633578063708aa3dc1461064d57600080fd5b80634f8580ef1161027a5780634f8580ef14610591578063512d62df146105a657806352628f08146105c657806361afe5c9146105e657600080fd5b806342842e0e14610531578063434f48c4146105515780634f6ccce71461057157600080fd5b806318160ddd1161030d578063261f5a97116102e7578063261f5a97146104c75780632f728eb3146104dc5780632f745c59146104fc5780633ccfd60b1461051c57600080fd5b806318160ddd1461046857806321b8092e1461048757806323b872dd146104a757600080fd5b8063081812fc11610349578063081812fc146103e65780630881bb451461041e578063095ea7b3146104285780630d71aba51461044857600080fd5b806301ffc9a71461037057806302ce5813146103a557806306fdde03146103c4575b600080fd5b34801561037c57600080fd5b5061039061038b3660046130b7565b610a4d565b60405190151581526020015b60405180910390f35b3480156103b157600080fd5b5060155461039090610100900460ff1681565b3480156103d057600080fd5b506103d9610a78565b60405161039c91906132ac565b3480156103f257600080fd5b5061040661040136600461309e565b610b0a565b6040516001600160a01b03909116815260200161039c565b610426610b97565b005b34801561043457600080fd5b50610426610443366004613074565b610df0565b34801561045457600080fd5b506103d961046336600461309e565b610f06565b34801561047457600080fd5b506008545b60405190815260200161039c565b34801561049357600080fd5b506104266104a2366004612efc565b610fc0565b3480156104b357600080fd5b506104266104c2366004612f51565b61100c565b3480156104d357600080fd5b5061042661103d565b3480156104e857600080fd5b506103d96104f736600461309e565b6110c6565b34801561050857600080fd5b50610479610517366004613074565b611128565b34801561052857600080fd5b506104266111be565b34801561053d57600080fd5b5061042661054c366004612f51565b61127c565b34801561055d57600080fd5b5061042661056c36600461309e565b611297565b34801561057d57600080fd5b5061047961058c36600461309e565b61135c565b34801561059d57600080fd5b50601354610479565b3480156105b257600080fd5b506103d96105c136600461309e565b6113ef565b3480156105d257600080fd5b506104066105e136600461309e565b611451565b3480156105f257600080fd5b50610479610601366004612efc565b601d6020526000908152604090205481565b34801561061f57600080fd5b5061040661062e36600461309e565b61147b565b34801561063f57600080fd5b506015546103909060ff1681565b34801561065957600080fd5b506104266114f2565b34801561066e57600080fd5b5061047961067d366004612efc565b611539565b34801561068e57600080fd5b506104266115c0565b3480156106a357600080fd5b506104266106b236600461309e565b6115f6565b3480156106c357600080fd5b506103906106d2366004612efc565b601e6020526000908152604090205460ff1681565b3480156106f357600080fd5b5061042661070236600461309e565b611625565b34801561071357600080fd5b5061042661072236600461309e565b611684565b34801561073357600080fd5b50610426610742366004612efc565b6116fd565b34801561075357600080fd5b506015546103909062010000900460ff1681565b34801561077357600080fd5b50610479611749565b34801561078857600080fd5b50600b546001600160a01b0316610406565b3480156107a657600080fd5b506103d9611815565b3480156107bb57600080fd5b5061047960145481565b3480156107d157600080fd5b506104266107e0366004613038565b611824565b3480156107f157600080fd5b506103d961080036600461309e565b6118e9565b34801561081157600080fd5b506103d961082036600461309e565b61194b565b34801561083157600080fd5b50610426610840366004612f8d565b6119ad565b34801561085157600080fd5b506104266119e5565b34801561086657600080fd5b506103d961087536600461309e565b611a2e565b34801561088657600080fd5b506103d961089536600461309e565b611a90565b3480156108a657600080fd5b50610479611af2565b3480156108bb57600080fd5b506103d96108ca36600461309e565b611ba8565b3480156108db57600080fd5b506103d96108ea36600461309e565b611c0a565b3480156108fb57600080fd5b5061042661090a36600461309e565b611c6c565b34801561091b57600080fd5b506103d961092a36600461309e565b611e95565b34801561093b57600080fd5b506103d961094a36600461309e565b611ef7565b34801561095b57600080fd5b5061042661096a366004612efc565b611f59565b34801561097b57600080fd5b5061042661098a366004612efc565b611fa5565b34801561099b57600080fd5b50610426611ffb565b3480156109b057600080fd5b506103906109bf366004612f1e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156109f957600080fd5b506103d9610a0836600461309e565b61208c565b348015610a1957600080fd5b50610426610a28366004613181565b6120ee565b348015610a3957600080fd5b50610426610a48366004612efc565b61229f565b60006001600160e01b0319821663780e9d6360e01b1480610a725750610a7282612337565b92915050565b606060008054610a8790613512565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab390613512565b8015610b005780601f10610ad557610100808354040283529160200191610b00565b820191906000526020600020905b815481529060010190602001808311610ae357829003601f168201915b5050505050905090565b6000610b1582612387565b610b7b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6002600a541415610bba5760405162461bcd60e51b8152600401610b72906133e6565b6002600a5560155460ff16610c115760405162461bcd60e51b815260206004820152601d60248201527f526573657276696e672069732063757272656e746c7920636c6f7365640000006044820152606401610b72565b600f54601254610c219190613476565b421180610c315750610c316123a4565b610c765760405162461bcd60e51b8152602060048201526016602482015275165bdd4818d85b9b9bdd081c995cd95c9d99481e595d60521b6044820152606401610b72565b600c5460145410610cc95760405162461bcd60e51b815260206004820152601d60248201527f416c6c20746f6b656e732068617665206265656e2072657365727665640000006044820152606401610b72565b336000908152601e602052604090205460ff1615610d295760405162461bcd60e51b815260206004820181905260248201527f546869732077616c6c65742068617320616c72656164792072657365727665646044820152606401610b72565b600d543414610d7a5760405162461bcd60e51b815260206004820152601960248201527f496e636f72726563742072657365727665207061796d656e74000000000000006044820152606401610b72565b336000818152601e60205260408120805460ff19166001908117909155601b8054918201815582527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc10180546001600160a01b0319169092179091556014805491610de48361356f565b90915550506001600a55565b6000610dfb8261147b565b9050806001600160a01b0316836001600160a01b03161415610e695760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b72565b336001600160a01b0382161480610e855750610e8581336109bf565b610ef75760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b72565b610f0183836124e2565b505050565b6060610f1182612387565b610f2d5760405162461bcd60e51b8152600401610b7290613346565b601554604051630d71aba560e01b815260048101849052606091630100000090046001600160a01b0316908190630d71aba5906024015b60006040518083038186803b158015610f7c57600080fd5b505afa158015610f90573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fb891908101906130f1565b949350505050565b600b546001600160a01b03163314610fea5760405162461bcd60e51b8152600401610b7290613311565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6110163382612550565b6110325760405162461bcd60e51b8152600401610b7290613395565b610f01838383612636565b600b546001600160a01b031633146110675760405162461bcd60e51b8152600401610b7290613311565b60155460ff16156110b35760405162461bcd60e51b815260206004820152601660248201527553616c6520697320616c72656164792061637469766560501b6044820152606401610b72565b6015805460ff1916600117905542601255565b60606110d182612387565b6110ed5760405162461bcd60e51b8152600401610b7290613346565b601554604051632f728eb360e01b815260048101849052606091630100000090046001600160a01b0316908190632f728eb390602401610f64565b600061113383611539565b82106111955760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b72565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b031633146111e85760405162461bcd60e51b8152600401610b7290613311565b6017546001600160a01b03166112405760405162461bcd60e51b815260206004820152601e60248201527f5769746864726177616c2061646472657373206d7573742062652073657400006044820152606401610b72565b6017546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611279573d6000803e3d6000fd5b50565b610f01838383604051806020016040528060008152506119ad565b6002600a5414156112ba5760405162461bcd60e51b8152600401610b72906133e6565b6002600a55600b546001600160a01b031633146112e95760405162461bcd60e51b8152600401610b7290613311565b6112f281612387565b156113395760405162461bcd60e51b8152602060048201526017602482015276546f6b656e20494420616c72656164792065786973747360481b6044820152606401610b72565b61135461134e600b546001600160a01b031690565b826127e1565b506001600a55565b600061136760085490565b82106113ca5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b72565b600882815481106113dd576113dd6135b6565b90600052602060002001549050919050565b60606113fa82612387565b6114165760405162461bcd60e51b8152600401610b7290613346565b60155460405163512d62df60e01b815260048101849052606091630100000090046001600160a01b031690819063512d62df90602401610f64565b601b818154811061146157600080fd5b6000918252602090912001546001600160a01b0316905081565b6000818152600260205260408120546001600160a01b031680610a725760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b72565b600b546001600160a01b0316331461151c5760405162461bcd60e51b8152600401610b7290613311565b6015805461ff001981166101009182900460ff1615909102179055565b60006001600160a01b0382166115a45760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b72565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146115ea5760405162461bcd60e51b8152600401610b7290613311565b6115f460006127ff565b565b600b546001600160a01b031633146116205760405162461bcd60e51b8152600401610b7290613311565b601055565b600b546001600160a01b0316331461164f5760405162461bcd60e51b8152600401610b7290613311565b601a80546001810182556000919091527f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e0155565b600b546001600160a01b031633146116ae5760405162461bcd60e51b8152600401610b7290613311565b60155462010000900460ff166116f85760405162461bcd60e51b815260206004820152600f60248201526e4275726e206e6f742061637469766560881b6044820152606401610b72565b600e55565b600b546001600160a01b031633146117275760405162461bcd60e51b8152600401610b7290613311565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b60155460009060ff1661179e5760405162461bcd60e51b815260206004820152601f60248201527f50726976617465206d696e74696e6720686173206e6f742073746172746564006044820152606401610b72565b600f546012546117ae9190613476565b42106117f55760405162461bcd60e51b8152602060048201526016602482015275283ab13634b19036b4b73a34b7339034b99037b832b760511b6044820152606401610b72565b42600f546012546118069190613476565b61181091906134cf565b905090565b606060018054610a8790613512565b6001600160a01b03821633141561187d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b72565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60606118f482612387565b6119105760405162461bcd60e51b8152600401610b7290613346565b6015546040516352e0c65360e11b815260048101849052606091630100000090046001600160a01b031690819063a5c18ca690602401610f64565b606061195682612387565b6119725760405162461bcd60e51b8152600401610b7290613346565b601554604051635905efa160e11b815260048101849052606091630100000090046001600160a01b031690819063b20bdf4290602401610f64565b6119b73383612550565b6119d35760405162461bcd60e51b8152600401610b7290613395565b6119df84848484612851565b50505050565b600b546001600160a01b03163314611a0f5760405162461bcd60e51b8152600401610b7290613311565b6015805462ff0000198116620100009182900460ff1615909102179055565b6060611a3982612387565b611a555760405162461bcd60e51b8152600401610b7290613346565b60155460405163bcc1e50160e01b815260048101849052606091630100000090046001600160a01b031690819063bcc1e50190602401610f64565b6060611a9b82612387565b611ab75760405162461bcd60e51b8152600401610b7290613346565b60155460405163626985fd60e11b815260048101849052606091630100000090046001600160a01b031690819063c4d30bfa90602401610f64565b60155460009062010000900460ff16611b455760405162461bcd60e51b81526020600482015260156024820152744275726e696e67206973206e6f742061637469766560581b6044820152606401610b72565b600e54601154611b559190613476565b4210611b975760405162461bcd60e51b8152602060048201526011602482015270109d5c9b9a5b99c81a185cc8195b991959607a1b6044820152606401610b72565b42600e546011546118069190613476565b6060611bb382612387565b611bcf5760405162461bcd60e51b8152600401610b7290613346565b60155460405163c87b56dd60e01b815260048101849052606091630100000090046001600160a01b031690819063c87b56dd90602401610f64565b6060611c1582612387565b611c315760405162461bcd60e51b8152600401610b7290613346565b601554604051630ce383e760e41b815260048101849052606091630100000090046001600160a01b031690819063ce383e7090602401610f64565b6002600a541415611c8f5760405162461bcd60e51b8152600401610b72906133e6565b6002600a5560155462010000900460ff16611cec5760405162461bcd60e51b815260206004820152601f60248201527f4275726e696e67206973206e6f742063757272656e746c7920616374697665006044820152606401610b72565b601154600e54611cfc9190613476565b4210611d435760405162461bcd60e51b8152602060048201526016602482015275109d5c9b88185d58dd1a5bdb881a185cc8195b99195960521b6044820152606401610b72565b336000908152601e602052604090205460ff16611da25760405162461bcd60e51b815260206004820152601d60248201527f596f7520646964206e6f7420656e746572207468652061756374696f6e0000006044820152606401610b72565b6000611db682670de0b6b3a76400006134b0565b6016549091506001600160a01b031680639dc29fac336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401600060405180830381600087803b158015611e1457600080fd5b505af1158015611e28573d6000803e3d6000fd5b50505050600083601d6000611e3a3390565b6001600160a01b03166001600160a01b0316815260200190815260200160002054611e659190613476565b336000908152601d60205260409020819055601354909150811115611e8a5760138190555b50506001600a555050565b6060611ea082612387565b611ebc5760405162461bcd60e51b8152600401610b7290613346565b60155460405163d5523f7760e01b815260048101849052606091630100000090046001600160a01b031690819063d5523f7790602401610f64565b6060611f0282612387565b611f1e5760405162461bcd60e51b8152600401610b7290613346565b60155460405163729fded360e11b815260048101849052606091630100000090046001600160a01b031690819063e53fbda690602401610f64565b600b546001600160a01b03163314611f835760405162461bcd60e51b8152600401610b7290613311565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b03163314611fcf5760405162461bcd60e51b8152600401610b7290613311565b601580546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b600b546001600160a01b031633146120255760405162461bcd60e51b8152600401610b7290613311565b60155462010000900460ff16156120755760405162461bcd60e51b8152602060048201526014602482015273109d5c9b88185b1c9958591e481cdd185c9d195960621b6044820152606401610b72565b6015805462ff000019166201000017905542601155565b606061209782612387565b6120b35760405162461bcd60e51b8152600401610b7290613346565b601554604051631df3b8cd60e31b815260048101849052606091630100000090046001600160a01b031690819063ef9dc66890602401610f64565b6002600a5414156121115760405162461bcd60e51b8152600401610b72906133e6565b6002600a55601554610100900460ff1661216d5760405162461bcd60e51b815260206004820152601f60248201527f5468652077686974656c697374206973206e6f742061637469766520796574006044820152606401610b72565b61217683612387565b156121bd5760405162461bcd60e51b8152602060048201526017602482015276546f6b656e20494420616c72656164792065786973747360481b6044820152606401610b72565b6121c933838584612884565b6122155760405162461bcd60e51b815260206004820152601b60248201527f596f75277265206e6f74206f6e207468652077686974656c69737400000000006044820152606401610b72565b336000908152601c6020526040902054600160ff909116106122715760405162461bcd60e51b8152602060048201526015602482015274165bdd49dd9948185b1c9958591e481b5a5b9d1959605a1b6044820152606401610b72565b336000818152601c60205260409020805460ff1916600117905561229590846127e1565b50506001600a5550565b600b546001600160a01b031633146122c95760405162461bcd60e51b8152600401610b7290613311565b6001600160a01b03811661232e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b72565b611279816127ff565b60006001600160e01b031982166380ac58cd60e01b148061236857506001600160e01b03198216635b5e139f60e01b145b80610a7257506301ffc9a760e01b6001600160e01b0319831614610a72565b6000908152600260205260409020546001600160a01b0316151590565b6018546019546000916001600160a01b03908116911682826370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561240157600080fd5b505afa158015612415573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124399190613168565b11806124cb575060006001600160a01b0382166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561249157600080fd5b505afa1580156124a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c99190613168565b115b156124d95760019250505090565b60009250505090565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906125178261147b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061255b82612387565b6125bc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b72565b60006125c78361147b565b9050806001600160a01b0316846001600160a01b031614806126025750836001600160a01b03166125f784610b0a565b6001600160a01b0316145b80610fb857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16610fb8565b826001600160a01b03166126498261147b565b6001600160a01b0316146126b15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b72565b6001600160a01b0382166127135760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b72565b61271e838383612a1c565b6127296000826124e2565b6001600160a01b03831660009081526003602052604081208054600192906127529084906134cf565b90915550506001600160a01b0382166000908152600360205260408120805460019290612780908490613476565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6127fb828260405180602001604052806000815250612ad4565b5050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61285c848484612636565b61286884848484612b07565b6119df5760405162461bcd60e51b8152600401610b72906132bf565b6000808486856040516020016128bf9392919092835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b60408051601f19818403018152919052805160209091012090508460005b84518161ffff1610156129bd57816001166001141561294c57848161ffff168151811061290c5761290c6135b6565b60200260200101518360405160200161292f929190918252602082015260400190565b60405160208183030381529060405280519060200120925061299e565b82858261ffff1681518110612963576129636135b6565b6020026020010151604051602001612985929190918252602082015260400190565b6040516020818303038152906040528051906020012092505b6129a960028361348e565b9150806129b58161354d565b9150506128dd565b5060005b601a54811015612a0e57601a81815481106129de576129de6135b6565b90600052602060002001548314156129fc5760019350505050610fb8565b80612a068161356f565b9150506129c1565b506000979650505050505050565b6001600160a01b038316612a7757612a7281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612a9a565b816001600160a01b0316836001600160a01b031614612a9a57612a9a8382612c11565b6001600160a01b038216612ab157610f0181612cae565b826001600160a01b0316826001600160a01b031614610f0157610f018282612d5d565b612ade8383612da1565b612aeb6000848484612b07565b610f015760405162461bcd60e51b8152600401610b72906132bf565b60006001600160a01b0384163b15612c0957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b4b90339089908890889060040161326f565b602060405180830381600087803b158015612b6557600080fd5b505af1925050508015612b95575060408051601f3d908101601f19168201909252612b92918101906130d4565b60015b612bef573d808015612bc3576040519150601f19603f3d011682016040523d82523d6000602084013e612bc8565b606091505b508051612be75760405162461bcd60e51b8152600401610b72906132bf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610fb8565b506001610fb8565b60006001612c1e84611539565b612c2891906134cf565b600083815260076020526040902054909150808214612c7b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612cc0906001906134cf565b60008381526009602052604081205460088054939450909284908110612ce857612ce86135b6565b906000526020600020015490508060088381548110612d0957612d096135b6565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612d4157612d416135a0565b6001900381819060005260206000200160009055905550505050565b6000612d6883611539565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612df75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b72565b612e0081612387565b15612e4d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b72565b612e5960008383612a1c565b6001600160a01b0382166000908152600360205260408120805460019290612e82908490613476565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b0381168114612ef757600080fd5b919050565b600060208284031215612f0e57600080fd5b612f1782612ee0565b9392505050565b60008060408385031215612f3157600080fd5b612f3a83612ee0565b9150612f4860208401612ee0565b90509250929050565b600080600060608486031215612f6657600080fd5b612f6f84612ee0565b9250612f7d60208501612ee0565b9150604084013590509250925092565b60008060008060808587031215612fa357600080fd5b612fac85612ee0565b9350612fba60208601612ee0565b925060408501359150606085013567ffffffffffffffff811115612fdd57600080fd5b8501601f81018713612fee57600080fd5b8035613001612ffc8261344e565b61341d565b81815288602083850101111561301657600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561304b57600080fd5b61305483612ee0565b91506020830135801515811461306957600080fd5b809150509250929050565b6000806040838503121561308757600080fd5b61309083612ee0565b946020939093013593505050565b6000602082840312156130b057600080fd5b5035919050565b6000602082840312156130c957600080fd5b8135612f17816135e2565b6000602082840312156130e657600080fd5b8151612f17816135e2565b60006020828403121561310357600080fd5b815167ffffffffffffffff81111561311a57600080fd5b8201601f8101841361312b57600080fd5b8051613139612ffc8261344e565b81815285602083850101111561314e57600080fd5b61315f8260208301602086016134e6565b95945050505050565b60006020828403121561317a57600080fd5b5051919050565b60008060006060848603121561319657600080fd5b833592506020808501359250604085013567ffffffffffffffff808211156131bd57600080fd5b818701915087601f8301126131d157600080fd5b8135818111156131e3576131e36135cc565b8060051b91506131f484830161341d565b8181528481019084860184860187018c101561320f57600080fd5b600095505b83861015613232578035835260019590950194918601918601613214565b508096505050505050509250925092565b6000815180845261325b8160208601602086016134e6565b601f01601f19169290920160200192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906132a290830184613243565b9695505050505050565b602081526000612f176020830184613243565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613446576134466135cc565b604052919050565b600067ffffffffffffffff821115613468576134686135cc565b50601f01601f191660200190565b600082198211156134895761348961358a565b500190565b6000826134ab57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156134ca576134ca61358a565b500290565b6000828210156134e1576134e161358a565b500390565b60005b838110156135015781810151838201526020016134e9565b838111156119df5750506000910152565b600181811c9082168061352657607f821691505b6020821081141561354757634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff808316818114156135655761356561358a565b6001019392505050565b60006000198214156135835761358361358a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461127957600080fdfea264697066735822122056c314c037ca4376ffff6ff593b1e6c00c9ada58b374567063ff7d1fec15616464736f6c63430008060033

Deployed Bytecode

0x60806040526004361061036b5760003560e01c80637aa3fe96116101c6578063c4d30bfa116100f7578063e6d5864b11610095578063e985e9c51161006f578063e985e9c5146109a4578063ef9dc668146109ed578063f2498c9e14610a0d578063f2fde38b14610a2d57600080fd5b8063e6d5864b1461094f578063e84a860f1461096f578063e960662b1461098f57600080fd5b8063ce383e70116100d1578063ce383e70146108cf578063d0d2a9e8146108ef578063d5523f771461090f578063e53fbda61461092f57600080fd5b8063c4d30bfa1461087a578063c7ab94fd1461089a578063c87b56dd146108af57600080fd5b80639c64ea8311610164578063b20bdf421161013e578063b20bdf4214610805578063b88d4fde14610825578063ba69f34e14610845578063bcc1e5011461085a57600080fd5b80639c64ea83146107af578063a22cb465146107c5578063a5c18ca6146107e557600080fd5b8063864ef3e5116101a0578063864ef3e5146107475780638d2ab3ed146107675780638da5cb5b1461077c57806395d89b411461079a57600080fd5b80637aa3fe96146106e75780637bc5fa671461070757806382b1168d1461072757600080fd5b806342842e0e116102a05780636352211e1161023e57806370a082311161021857806370a0823114610662578063715018a61461068257806379c9cb7b1461069757806379f703db146106b757600080fd5b80636352211e1461061357806368428a1b14610633578063708aa3dc1461064d57600080fd5b80634f8580ef1161027a5780634f8580ef14610591578063512d62df146105a657806352628f08146105c657806361afe5c9146105e657600080fd5b806342842e0e14610531578063434f48c4146105515780634f6ccce71461057157600080fd5b806318160ddd1161030d578063261f5a97116102e7578063261f5a97146104c75780632f728eb3146104dc5780632f745c59146104fc5780633ccfd60b1461051c57600080fd5b806318160ddd1461046857806321b8092e1461048757806323b872dd146104a757600080fd5b8063081812fc11610349578063081812fc146103e65780630881bb451461041e578063095ea7b3146104285780630d71aba51461044857600080fd5b806301ffc9a71461037057806302ce5813146103a557806306fdde03146103c4575b600080fd5b34801561037c57600080fd5b5061039061038b3660046130b7565b610a4d565b60405190151581526020015b60405180910390f35b3480156103b157600080fd5b5060155461039090610100900460ff1681565b3480156103d057600080fd5b506103d9610a78565b60405161039c91906132ac565b3480156103f257600080fd5b5061040661040136600461309e565b610b0a565b6040516001600160a01b03909116815260200161039c565b610426610b97565b005b34801561043457600080fd5b50610426610443366004613074565b610df0565b34801561045457600080fd5b506103d961046336600461309e565b610f06565b34801561047457600080fd5b506008545b60405190815260200161039c565b34801561049357600080fd5b506104266104a2366004612efc565b610fc0565b3480156104b357600080fd5b506104266104c2366004612f51565b61100c565b3480156104d357600080fd5b5061042661103d565b3480156104e857600080fd5b506103d96104f736600461309e565b6110c6565b34801561050857600080fd5b50610479610517366004613074565b611128565b34801561052857600080fd5b506104266111be565b34801561053d57600080fd5b5061042661054c366004612f51565b61127c565b34801561055d57600080fd5b5061042661056c36600461309e565b611297565b34801561057d57600080fd5b5061047961058c36600461309e565b61135c565b34801561059d57600080fd5b50601354610479565b3480156105b257600080fd5b506103d96105c136600461309e565b6113ef565b3480156105d257600080fd5b506104066105e136600461309e565b611451565b3480156105f257600080fd5b50610479610601366004612efc565b601d6020526000908152604090205481565b34801561061f57600080fd5b5061040661062e36600461309e565b61147b565b34801561063f57600080fd5b506015546103909060ff1681565b34801561065957600080fd5b506104266114f2565b34801561066e57600080fd5b5061047961067d366004612efc565b611539565b34801561068e57600080fd5b506104266115c0565b3480156106a357600080fd5b506104266106b236600461309e565b6115f6565b3480156106c357600080fd5b506103906106d2366004612efc565b601e6020526000908152604090205460ff1681565b3480156106f357600080fd5b5061042661070236600461309e565b611625565b34801561071357600080fd5b5061042661072236600461309e565b611684565b34801561073357600080fd5b50610426610742366004612efc565b6116fd565b34801561075357600080fd5b506015546103909062010000900460ff1681565b34801561077357600080fd5b50610479611749565b34801561078857600080fd5b50600b546001600160a01b0316610406565b3480156107a657600080fd5b506103d9611815565b3480156107bb57600080fd5b5061047960145481565b3480156107d157600080fd5b506104266107e0366004613038565b611824565b3480156107f157600080fd5b506103d961080036600461309e565b6118e9565b34801561081157600080fd5b506103d961082036600461309e565b61194b565b34801561083157600080fd5b50610426610840366004612f8d565b6119ad565b34801561085157600080fd5b506104266119e5565b34801561086657600080fd5b506103d961087536600461309e565b611a2e565b34801561088657600080fd5b506103d961089536600461309e565b611a90565b3480156108a657600080fd5b50610479611af2565b3480156108bb57600080fd5b506103d96108ca36600461309e565b611ba8565b3480156108db57600080fd5b506103d96108ea36600461309e565b611c0a565b3480156108fb57600080fd5b5061042661090a36600461309e565b611c6c565b34801561091b57600080fd5b506103d961092a36600461309e565b611e95565b34801561093b57600080fd5b506103d961094a36600461309e565b611ef7565b34801561095b57600080fd5b5061042661096a366004612efc565b611f59565b34801561097b57600080fd5b5061042661098a366004612efc565b611fa5565b34801561099b57600080fd5b50610426611ffb565b3480156109b057600080fd5b506103906109bf366004612f1e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156109f957600080fd5b506103d9610a0836600461309e565b61208c565b348015610a1957600080fd5b50610426610a28366004613181565b6120ee565b348015610a3957600080fd5b50610426610a48366004612efc565b61229f565b60006001600160e01b0319821663780e9d6360e01b1480610a725750610a7282612337565b92915050565b606060008054610a8790613512565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab390613512565b8015610b005780601f10610ad557610100808354040283529160200191610b00565b820191906000526020600020905b815481529060010190602001808311610ae357829003601f168201915b5050505050905090565b6000610b1582612387565b610b7b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6002600a541415610bba5760405162461bcd60e51b8152600401610b72906133e6565b6002600a5560155460ff16610c115760405162461bcd60e51b815260206004820152601d60248201527f526573657276696e672069732063757272656e746c7920636c6f7365640000006044820152606401610b72565b600f54601254610c219190613476565b421180610c315750610c316123a4565b610c765760405162461bcd60e51b8152602060048201526016602482015275165bdd4818d85b9b9bdd081c995cd95c9d99481e595d60521b6044820152606401610b72565b600c5460145410610cc95760405162461bcd60e51b815260206004820152601d60248201527f416c6c20746f6b656e732068617665206265656e2072657365727665640000006044820152606401610b72565b336000908152601e602052604090205460ff1615610d295760405162461bcd60e51b815260206004820181905260248201527f546869732077616c6c65742068617320616c72656164792072657365727665646044820152606401610b72565b600d543414610d7a5760405162461bcd60e51b815260206004820152601960248201527f496e636f72726563742072657365727665207061796d656e74000000000000006044820152606401610b72565b336000818152601e60205260408120805460ff19166001908117909155601b8054918201815582527f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc10180546001600160a01b0319169092179091556014805491610de48361356f565b90915550506001600a55565b6000610dfb8261147b565b9050806001600160a01b0316836001600160a01b03161415610e695760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b72565b336001600160a01b0382161480610e855750610e8581336109bf565b610ef75760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b72565b610f0183836124e2565b505050565b6060610f1182612387565b610f2d5760405162461bcd60e51b8152600401610b7290613346565b601554604051630d71aba560e01b815260048101849052606091630100000090046001600160a01b0316908190630d71aba5906024015b60006040518083038186803b158015610f7c57600080fd5b505afa158015610f90573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fb891908101906130f1565b949350505050565b600b546001600160a01b03163314610fea5760405162461bcd60e51b8152600401610b7290613311565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6110163382612550565b6110325760405162461bcd60e51b8152600401610b7290613395565b610f01838383612636565b600b546001600160a01b031633146110675760405162461bcd60e51b8152600401610b7290613311565b60155460ff16156110b35760405162461bcd60e51b815260206004820152601660248201527553616c6520697320616c72656164792061637469766560501b6044820152606401610b72565b6015805460ff1916600117905542601255565b60606110d182612387565b6110ed5760405162461bcd60e51b8152600401610b7290613346565b601554604051632f728eb360e01b815260048101849052606091630100000090046001600160a01b0316908190632f728eb390602401610f64565b600061113383611539565b82106111955760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b72565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b031633146111e85760405162461bcd60e51b8152600401610b7290613311565b6017546001600160a01b03166112405760405162461bcd60e51b815260206004820152601e60248201527f5769746864726177616c2061646472657373206d7573742062652073657400006044820152606401610b72565b6017546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611279573d6000803e3d6000fd5b50565b610f01838383604051806020016040528060008152506119ad565b6002600a5414156112ba5760405162461bcd60e51b8152600401610b72906133e6565b6002600a55600b546001600160a01b031633146112e95760405162461bcd60e51b8152600401610b7290613311565b6112f281612387565b156113395760405162461bcd60e51b8152602060048201526017602482015276546f6b656e20494420616c72656164792065786973747360481b6044820152606401610b72565b61135461134e600b546001600160a01b031690565b826127e1565b506001600a55565b600061136760085490565b82106113ca5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b72565b600882815481106113dd576113dd6135b6565b90600052602060002001549050919050565b60606113fa82612387565b6114165760405162461bcd60e51b8152600401610b7290613346565b60155460405163512d62df60e01b815260048101849052606091630100000090046001600160a01b031690819063512d62df90602401610f64565b601b818154811061146157600080fd5b6000918252602090912001546001600160a01b0316905081565b6000818152600260205260408120546001600160a01b031680610a725760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b72565b600b546001600160a01b0316331461151c5760405162461bcd60e51b8152600401610b7290613311565b6015805461ff001981166101009182900460ff1615909102179055565b60006001600160a01b0382166115a45760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b72565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146115ea5760405162461bcd60e51b8152600401610b7290613311565b6115f460006127ff565b565b600b546001600160a01b031633146116205760405162461bcd60e51b8152600401610b7290613311565b601055565b600b546001600160a01b0316331461164f5760405162461bcd60e51b8152600401610b7290613311565b601a80546001810182556000919091527f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e0155565b600b546001600160a01b031633146116ae5760405162461bcd60e51b8152600401610b7290613311565b60155462010000900460ff166116f85760405162461bcd60e51b815260206004820152600f60248201526e4275726e206e6f742061637469766560881b6044820152606401610b72565b600e55565b600b546001600160a01b031633146117275760405162461bcd60e51b8152600401610b7290613311565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b60155460009060ff1661179e5760405162461bcd60e51b815260206004820152601f60248201527f50726976617465206d696e74696e6720686173206e6f742073746172746564006044820152606401610b72565b600f546012546117ae9190613476565b42106117f55760405162461bcd60e51b8152602060048201526016602482015275283ab13634b19036b4b73a34b7339034b99037b832b760511b6044820152606401610b72565b42600f546012546118069190613476565b61181091906134cf565b905090565b606060018054610a8790613512565b6001600160a01b03821633141561187d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b72565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60606118f482612387565b6119105760405162461bcd60e51b8152600401610b7290613346565b6015546040516352e0c65360e11b815260048101849052606091630100000090046001600160a01b031690819063a5c18ca690602401610f64565b606061195682612387565b6119725760405162461bcd60e51b8152600401610b7290613346565b601554604051635905efa160e11b815260048101849052606091630100000090046001600160a01b031690819063b20bdf4290602401610f64565b6119b73383612550565b6119d35760405162461bcd60e51b8152600401610b7290613395565b6119df84848484612851565b50505050565b600b546001600160a01b03163314611a0f5760405162461bcd60e51b8152600401610b7290613311565b6015805462ff0000198116620100009182900460ff1615909102179055565b6060611a3982612387565b611a555760405162461bcd60e51b8152600401610b7290613346565b60155460405163bcc1e50160e01b815260048101849052606091630100000090046001600160a01b031690819063bcc1e50190602401610f64565b6060611a9b82612387565b611ab75760405162461bcd60e51b8152600401610b7290613346565b60155460405163626985fd60e11b815260048101849052606091630100000090046001600160a01b031690819063c4d30bfa90602401610f64565b60155460009062010000900460ff16611b455760405162461bcd60e51b81526020600482015260156024820152744275726e696e67206973206e6f742061637469766560581b6044820152606401610b72565b600e54601154611b559190613476565b4210611b975760405162461bcd60e51b8152602060048201526011602482015270109d5c9b9a5b99c81a185cc8195b991959607a1b6044820152606401610b72565b42600e546011546118069190613476565b6060611bb382612387565b611bcf5760405162461bcd60e51b8152600401610b7290613346565b60155460405163c87b56dd60e01b815260048101849052606091630100000090046001600160a01b031690819063c87b56dd90602401610f64565b6060611c1582612387565b611c315760405162461bcd60e51b8152600401610b7290613346565b601554604051630ce383e760e41b815260048101849052606091630100000090046001600160a01b031690819063ce383e7090602401610f64565b6002600a541415611c8f5760405162461bcd60e51b8152600401610b72906133e6565b6002600a5560155462010000900460ff16611cec5760405162461bcd60e51b815260206004820152601f60248201527f4275726e696e67206973206e6f742063757272656e746c7920616374697665006044820152606401610b72565b601154600e54611cfc9190613476565b4210611d435760405162461bcd60e51b8152602060048201526016602482015275109d5c9b88185d58dd1a5bdb881a185cc8195b99195960521b6044820152606401610b72565b336000908152601e602052604090205460ff16611da25760405162461bcd60e51b815260206004820152601d60248201527f596f7520646964206e6f7420656e746572207468652061756374696f6e0000006044820152606401610b72565b6000611db682670de0b6b3a76400006134b0565b6016549091506001600160a01b031680639dc29fac336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401600060405180830381600087803b158015611e1457600080fd5b505af1158015611e28573d6000803e3d6000fd5b50505050600083601d6000611e3a3390565b6001600160a01b03166001600160a01b0316815260200190815260200160002054611e659190613476565b336000908152601d60205260409020819055601354909150811115611e8a5760138190555b50506001600a555050565b6060611ea082612387565b611ebc5760405162461bcd60e51b8152600401610b7290613346565b60155460405163d5523f7760e01b815260048101849052606091630100000090046001600160a01b031690819063d5523f7790602401610f64565b6060611f0282612387565b611f1e5760405162461bcd60e51b8152600401610b7290613346565b60155460405163729fded360e11b815260048101849052606091630100000090046001600160a01b031690819063e53fbda690602401610f64565b600b546001600160a01b03163314611f835760405162461bcd60e51b8152600401610b7290613311565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b03163314611fcf5760405162461bcd60e51b8152600401610b7290613311565b601580546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b600b546001600160a01b031633146120255760405162461bcd60e51b8152600401610b7290613311565b60155462010000900460ff16156120755760405162461bcd60e51b8152602060048201526014602482015273109d5c9b88185b1c9958591e481cdd185c9d195960621b6044820152606401610b72565b6015805462ff000019166201000017905542601155565b606061209782612387565b6120b35760405162461bcd60e51b8152600401610b7290613346565b601554604051631df3b8cd60e31b815260048101849052606091630100000090046001600160a01b031690819063ef9dc66890602401610f64565b6002600a5414156121115760405162461bcd60e51b8152600401610b72906133e6565b6002600a55601554610100900460ff1661216d5760405162461bcd60e51b815260206004820152601f60248201527f5468652077686974656c697374206973206e6f742061637469766520796574006044820152606401610b72565b61217683612387565b156121bd5760405162461bcd60e51b8152602060048201526017602482015276546f6b656e20494420616c72656164792065786973747360481b6044820152606401610b72565b6121c933838584612884565b6122155760405162461bcd60e51b815260206004820152601b60248201527f596f75277265206e6f74206f6e207468652077686974656c69737400000000006044820152606401610b72565b336000908152601c6020526040902054600160ff909116106122715760405162461bcd60e51b8152602060048201526015602482015274165bdd49dd9948185b1c9958591e481b5a5b9d1959605a1b6044820152606401610b72565b336000818152601c60205260409020805460ff1916600117905561229590846127e1565b50506001600a5550565b600b546001600160a01b031633146122c95760405162461bcd60e51b8152600401610b7290613311565b6001600160a01b03811661232e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b72565b611279816127ff565b60006001600160e01b031982166380ac58cd60e01b148061236857506001600160e01b03198216635b5e139f60e01b145b80610a7257506301ffc9a760e01b6001600160e01b0319831614610a72565b6000908152600260205260409020546001600160a01b0316151590565b6018546019546000916001600160a01b03908116911682826370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561240157600080fd5b505afa158015612415573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124399190613168565b11806124cb575060006001600160a01b0382166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561249157600080fd5b505afa1580156124a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c99190613168565b115b156124d95760019250505090565b60009250505090565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906125178261147b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061255b82612387565b6125bc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b72565b60006125c78361147b565b9050806001600160a01b0316846001600160a01b031614806126025750836001600160a01b03166125f784610b0a565b6001600160a01b0316145b80610fb857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16610fb8565b826001600160a01b03166126498261147b565b6001600160a01b0316146126b15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b72565b6001600160a01b0382166127135760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b72565b61271e838383612a1c565b6127296000826124e2565b6001600160a01b03831660009081526003602052604081208054600192906127529084906134cf565b90915550506001600160a01b0382166000908152600360205260408120805460019290612780908490613476565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6127fb828260405180602001604052806000815250612ad4565b5050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61285c848484612636565b61286884848484612b07565b6119df5760405162461bcd60e51b8152600401610b72906132bf565b6000808486856040516020016128bf9392919092835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b60408051601f19818403018152919052805160209091012090508460005b84518161ffff1610156129bd57816001166001141561294c57848161ffff168151811061290c5761290c6135b6565b60200260200101518360405160200161292f929190918252602082015260400190565b60405160208183030381529060405280519060200120925061299e565b82858261ffff1681518110612963576129636135b6565b6020026020010151604051602001612985929190918252602082015260400190565b6040516020818303038152906040528051906020012092505b6129a960028361348e565b9150806129b58161354d565b9150506128dd565b5060005b601a54811015612a0e57601a81815481106129de576129de6135b6565b90600052602060002001548314156129fc5760019350505050610fb8565b80612a068161356f565b9150506129c1565b506000979650505050505050565b6001600160a01b038316612a7757612a7281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612a9a565b816001600160a01b0316836001600160a01b031614612a9a57612a9a8382612c11565b6001600160a01b038216612ab157610f0181612cae565b826001600160a01b0316826001600160a01b031614610f0157610f018282612d5d565b612ade8383612da1565b612aeb6000848484612b07565b610f015760405162461bcd60e51b8152600401610b72906132bf565b60006001600160a01b0384163b15612c0957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b4b90339089908890889060040161326f565b602060405180830381600087803b158015612b6557600080fd5b505af1925050508015612b95575060408051601f3d908101601f19168201909252612b92918101906130d4565b60015b612bef573d808015612bc3576040519150601f19603f3d011682016040523d82523d6000602084013e612bc8565b606091505b508051612be75760405162461bcd60e51b8152600401610b72906132bf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610fb8565b506001610fb8565b60006001612c1e84611539565b612c2891906134cf565b600083815260076020526040902054909150808214612c7b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612cc0906001906134cf565b60008381526009602052604081205460088054939450909284908110612ce857612ce86135b6565b906000526020600020015490508060088381548110612d0957612d096135b6565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612d4157612d416135a0565b6001900381819060005260206000200160009055905550505050565b6000612d6883611539565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612df75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b72565b612e0081612387565b15612e4d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b72565b612e5960008383612a1c565b6001600160a01b0382166000908152600360205260408120805460019290612e82908490613476565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b0381168114612ef757600080fd5b919050565b600060208284031215612f0e57600080fd5b612f1782612ee0565b9392505050565b60008060408385031215612f3157600080fd5b612f3a83612ee0565b9150612f4860208401612ee0565b90509250929050565b600080600060608486031215612f6657600080fd5b612f6f84612ee0565b9250612f7d60208501612ee0565b9150604084013590509250925092565b60008060008060808587031215612fa357600080fd5b612fac85612ee0565b9350612fba60208601612ee0565b925060408501359150606085013567ffffffffffffffff811115612fdd57600080fd5b8501601f81018713612fee57600080fd5b8035613001612ffc8261344e565b61341d565b81815288602083850101111561301657600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561304b57600080fd5b61305483612ee0565b91506020830135801515811461306957600080fd5b809150509250929050565b6000806040838503121561308757600080fd5b61309083612ee0565b946020939093013593505050565b6000602082840312156130b057600080fd5b5035919050565b6000602082840312156130c957600080fd5b8135612f17816135e2565b6000602082840312156130e657600080fd5b8151612f17816135e2565b60006020828403121561310357600080fd5b815167ffffffffffffffff81111561311a57600080fd5b8201601f8101841361312b57600080fd5b8051613139612ffc8261344e565b81815285602083850101111561314e57600080fd5b61315f8260208301602086016134e6565b95945050505050565b60006020828403121561317a57600080fd5b5051919050565b60008060006060848603121561319657600080fd5b833592506020808501359250604085013567ffffffffffffffff808211156131bd57600080fd5b818701915087601f8301126131d157600080fd5b8135818111156131e3576131e36135cc565b8060051b91506131f484830161341d565b8181528481019084860184860187018c101561320f57600080fd5b600095505b83861015613232578035835260019590950194918601918601613214565b508096505050505050509250925092565b6000815180845261325b8160208601602086016134e6565b601f01601f19169290920160200192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906132a290830184613243565b9695505050505050565b602081526000612f176020830184613243565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613446576134466135cc565b604052919050565b600067ffffffffffffffff821115613468576134686135cc565b50601f01601f191660200190565b600082198211156134895761348961358a565b500190565b6000826134ab57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156134ca576134ca61358a565b500290565b6000828210156134e1576134e161358a565b500390565b60005b838110156135015781810151838201526020016134e9565b838111156119df5750506000910152565b600181811c9082168061352657607f821691505b6020821081141561354757634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff808316818114156135655761356561358a565b6001019392505050565b60006000198214156135835761358361358a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461127957600080fdfea264697066735822122056c314c037ca4376ffff6ff593b1e6c00c9ada58b374567063ff7d1fec15616464736f6c63430008060033

Deployed Bytecode Sourcemap

44571:12406:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38421:224;;;;;;;;;;-1:-1:-1;38421:224:0;;;;;:::i;:::-;;:::i;:::-;;;7309:14:1;;7302:22;7284:41;;7272:2;7257:18;38421:224:0;;;;;;;;44984:27;;;;;;;;;;-1:-1:-1;44984:27:0;;;;;;;;;;;25543:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27102:221::-;;;;;;;;;;-1:-1:-1;27102:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6328:32:1;;;6310:51;;6298:2;6283:18;27102:221:0;6265:102:1;51884:644:0;;;:::i;:::-;;26625:411;;;;;;;;;;-1:-1:-1;26625:411:0;;;;;:::i;:::-;;:::i;47203:357::-;;;;;;;;;;-1:-1:-1;47203:357:0;;;;;:::i;:::-;;:::i;39061:113::-;;;;;;;;;;-1:-1:-1;39149:10:0;:17;39061:113;;;22352:25:1;;;22340:2;22325:18;39061:113:0;22307:76:1;55439:119:0;;;;;;;;;;-1:-1:-1;55439:119:0;;;;;:::i;:::-;;:::i;27992:339::-;;;;;;;;;;-1:-1:-1;27992:339:0;;;;;:::i;:::-;;:::i;45509:183::-;;;;;;;;;;;;;:::i;49445:359::-;;;;;;;;;;-1:-1:-1;49445:359:0;;;;;:::i;:::-;;:::i;38729:256::-;;;;;;;;;;-1:-1:-1;38729:256:0;;;;;:::i;:::-;;:::i;55566:206::-;;;;;;;;;;;;;:::i;28402:185::-;;;;;;;;;;-1:-1:-1;28402:185:0;;;;;:::i;:::-;;:::i;54229:177::-;;;;;;;;;;-1:-1:-1;54229:177:0;;;;;:::i;:::-;;:::i;39251:233::-;;;;;;;;;;-1:-1:-1;39251:233:0;;;;;:::i;:::-;;:::i;46374:105::-;;;;;;;;;;-1:-1:-1;46456:15:0;;46374:105;;46832:359;;;;;;;;;;-1:-1:-1;46832:359:0;;;;;:::i;:::-;;:::i;45226:35::-;;;;;;;;;;-1:-1:-1;45226:35:0;;;;;:::i;:::-;;:::i;45395:46::-;;;;;;;;;;-1:-1:-1;45395:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;25237:239;;;;;;;;;;-1:-1:-1;25237:239:0;;;;;:::i;:::-;;:::i;44955:22::-;;;;;;;;;;-1:-1:-1;44955:22:0;;;;;;;;45700:106;;;;;;;;;;;;;:::i;24967:208::-;;;;;;;;;;-1:-1:-1;24967:208:0;;;;;:::i;:::-;;:::i;9989:94::-;;;;;;;;;;;;;:::i;46021:97::-;;;;;;;;;;-1:-1:-1;46021:97:0;;;;;:::i;:::-;;:::i;45450:50::-;;;;;;;;;;-1:-1:-1;45450:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;45913:100;;;;;;;;;;-1:-1:-1;45913:100:0;;;;;:::i;:::-;;:::i;46669:151::-;;;;;;;;;;-1:-1:-1;46669:151:0;;;;;:::i;:::-;;:::i;46126:115::-;;;;;;;;;;-1:-1:-1;46126:115:0;;;;;:::i;:::-;;:::i;45018:22::-;;;;;;;;;;-1:-1:-1;45018:22:0;;;;;;;;;;;51566:310;;;;;;;;;;;;;:::i;9338:87::-;;;;;;;;;;-1:-1:-1;9411:6:0;;-1:-1:-1;;;;;9411:6:0;9338:87;;25712:104;;;;;;;;;;;;;:::i;44907:41::-;;;;;;;;;;;;;;;;27395:295;;;;;;;;;;-1:-1:-1;27395:295:0;;;;;:::i;:::-;;:::i;47933:357::-;;;;;;;;;;-1:-1:-1;47933:357:0;;;;;:::i;:::-;;:::i;47568:::-;;;;;;;;;;-1:-1:-1;47568:357:0;;;;;:::i;:::-;;:::i;28658:328::-;;;;;;;;;;-1:-1:-1;28658:328:0;;;;;:::i;:::-;;:::i;45814:91::-;;;;;;;;;;;;;:::i;48298:369::-;;;;;;;;;;-1:-1:-1;48298:369:0;;;;;:::i;:::-;;:::i;50173:349::-;;;;;;;;;;-1:-1:-1;50173:349:0;;;;;:::i;:::-;;:::i;51279:279::-;;;;;;;;;;;;;:::i;50901:370::-;;;;;;;;;;-1:-1:-1;50901:370:0;;;;;:::i;:::-;;:::i;49056:377::-;;;;;;;;;;-1:-1:-1;49056:377:0;;;;;:::i;:::-;;:::i;52887:701::-;;;;;;;;;;-1:-1:-1;52887:701:0;;;;;:::i;:::-;;:::i;50530:363::-;;;;;;;;;;-1:-1:-1;50530:363:0;;;;;:::i;:::-;;:::i;48679:365::-;;;;;;;;;;-1:-1:-1;48679:365:0;;;;;:::i;:::-;;:::i;46249:117::-;;;;;;;;;;-1:-1:-1;46249:117:0;;;;;:::i;:::-;;:::i;55293:134::-;;;;;;;;;;-1:-1:-1;55293:134:0;;;;;:::i;:::-;;:::i;46487:174::-;;;;;;;;;;;;;:::i;27761:164::-;;;;;;;;;;-1:-1:-1;27761:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;27882:25:0;;;27858:4;27882:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27761:164;49816:349;;;;;;;;;;-1:-1:-1;49816:349:0;;;;;:::i;:::-;;:::i;53596:621::-;;;;;;;;;;-1:-1:-1;53596:621:0;;;;;:::i;:::-;;:::i;10238:192::-;;;;;;;;;;-1:-1:-1;10238:192:0;;;;;:::i;:::-;;:::i;38421:224::-;38523:4;-1:-1:-1;;;;;;38547:50:0;;-1:-1:-1;;;38547:50:0;;:90;;;38601:36;38625:11;38601:23;:36::i;:::-;38540:97;38421:224;-1:-1:-1;;38421:224:0:o;25543:100::-;25597:13;25630:5;25623:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25543:100;:::o;27102:221::-;27178:7;27206:16;27214:7;27206;:16::i;:::-;27198:73;;;;-1:-1:-1;;;27198:73:0;;17086:2:1;27198:73:0;;;17068:21:1;17125:2;17105:18;;;17098:30;17164:34;17144:18;;;17137:62;-1:-1:-1;;;17215:18:1;;;17208:42;17267:19;;27198:73:0;;;;;;;;;-1:-1:-1;27291:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27291:24:0;;27102:221::o;51884:644::-;12271:1;12867:7;;:19;;12859:63;;;;-1:-1:-1;;;12859:63:0;;;;;;;:::i;:::-;12271:1;13000:7;:18;51958:10:::1;::::0;::::1;;51950:52;;;::::0;-1:-1:-1;;;51950:52:0;;11131:2:1;51950:52:0::1;::::0;::::1;11113:21:1::0;11170:2;11150:18;;;11143:30;11209:31;11189:18;;;11182:59;11258:18;;51950:52:0::1;11103:179:1::0;51950:52:0::1;52055:18;;52040:12;;:33;;;;:::i;:::-;52021:15;:53;:74;;;;52078:17;:15;:17::i;:::-;52013:109;;;::::0;-1:-1:-1;;;52013:109:0;;21000:2:1;52013:109:0::1;::::0;::::1;20982:21:1::0;21039:2;21019:18;;;21012:30;-1:-1:-1;;;21058:18:1;;;21051:52;21120:18;;52013:109:0::1;20972:172:1::0;52013:109:0::1;52170:9;;52141:26;;:38;52133:80;;;::::0;-1:-1:-1;;;52133:80:0;;10773:2:1;52133:80:0::1;::::0;::::1;10755:21:1::0;10812:2;10792:18;;;10785:30;10851:31;10831:18;;;10824:59;10900:18;;52133:80:0::1;10745:179:1::0;52133:80:0::1;8292:10:::0;52233:32:::1;::::0;;;:18:::1;:32;::::0;;;;;::::1;;52232:33;52224:78;;;::::0;-1:-1:-1;;;52224:78:0;;19448:2:1;52224:78:0::1;::::0;::::1;19430:21:1::0;;;19467:18;;;19460:30;19526:34;19506:18;;;19499:62;19578:18;;52224:78:0::1;19420:182:1::0;52224:78:0::1;52334:13;;52321:9;:26;52313:64;;;::::0;-1:-1:-1;;;52313:64:0;;22054:2:1;52313:64:0::1;::::0;::::1;22036:21:1::0;22093:2;22073:18;;;22066:30;22132:27;22112:18;;;22105:55;22177:18;;52313:64:0::1;22026:175:1::0;52313:64:0::1;8292:10:::0;52390:32:::1;::::0;;;:18:::1;:32;::::0;;;;:39;;-1:-1:-1;;52390:39:0::1;52425:4;52390:39:::0;;::::1;::::0;;;52442:18:::1;:37:::0;;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;52442:37:0::1;::::0;;::::1;::::0;;;52492:26:::1;:28:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;12227:1:0;13179:7;:22;51884:644::o;26625:411::-;26706:13;26722:23;26737:7;26722:14;:23::i;:::-;26706:39;;26770:5;-1:-1:-1;;;;;26764:11:0;:2;-1:-1:-1;;;;;26764:11:0;;;26756:57;;;;-1:-1:-1;;;26756:57:0;;19046:2:1;26756:57:0;;;19028:21:1;19085:2;19065:18;;;19058:30;19124:34;19104:18;;;19097:62;-1:-1:-1;;;19175:18:1;;;19168:31;19216:19;;26756:57:0;19018:223:1;26756:57:0;8292:10;-1:-1:-1;;;;;26848:21:0;;;;:62;;-1:-1:-1;26873:37:0;26890:5;8292:10;27761:164;:::i;26873:37::-;26826:168;;;;-1:-1:-1;;;26826:168:0;;14073:2:1;26826:168:0;;;14055:21:1;14112:2;14092:18;;;14085:30;14151:34;14131:18;;;14124:62;14222:26;14202:18;;;14195:54;14266:19;;26826:168:0;14045:246:1;26826:168:0;27007:21;27016:2;27020:7;27007:8;:21::i;:::-;26695:341;26625:411;;:::o;47203:357::-;47258:13;47292:16;47300:7;47292;:16::i;:::-;47284:76;;;;-1:-1:-1;;;47284:76:0;;;;;;;:::i;:::-;47459:17;;47497:29;;-1:-1:-1;;;47497:29:0;;;;;22352:25:1;;;47371:20:0;;47459:17;;;-1:-1:-1;;;;;47459:17:0;;;;47497:20;;22325:18:1;;47497:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47497:29:0;;;;;;;;;;;;:::i;:::-;47488:38;47203:357;-1:-1:-1;;;;47203:357:0:o;55439:119::-;9411:6;;-1:-1:-1;;;;;9411:6:0;8292:10;9558:23;9550:68;;;;-1:-1:-1;;;9550:68:0;;;;;;;:::i;:::-;55522:17:::1;:28:::0;;-1:-1:-1;;;;;;55522:28:0::1;-1:-1:-1::0;;;;;55522:28:0;;;::::1;::::0;;;::::1;::::0;;55439:119::o;27992:339::-;28187:41;8292:10;28220:7;28187:18;:41::i;:::-;28179:103;;;;-1:-1:-1;;;28179:103:0;;;;;;;:::i;:::-;28295:28;28305:4;28311:2;28315:7;28295:9;:28::i;45509:183::-;9411:6;;-1:-1:-1;;;;;9411:6:0;8292:10;9558:23;9550:68;;;;-1:-1:-1;;;9550:68:0;;;;;;;:::i;:::-;45578:10:::1;::::0;::::1;;45577:11;45569:46;;;::::0;-1:-1:-1;;;45569:46:0;;8122:2:1;45569:46:0::1;::::0;::::1;8104:21:1::0;8161:2;8141:18;;;8134:30;-1:-1:-1;;;8180:18:1;;;8173:52;8242:18;;45569:46:0::1;8094:172:1::0;45569:46:0::1;45626:10;:17:::0;;-1:-1:-1;;45626:17:0::1;45639:4;45626:17;::::0;;45669:15:::1;45654:12;:30:::0;45509:183::o;49445:359::-;49505:13;49539:16;49547:7;49539;:16::i;:::-;49531:76;;;;-1:-1:-1;;;49531:76:0;;;;;;;:::i;:::-;49698:17;;49736:34;;-1:-1:-1;;;49736:34:0;;;;;22352:25:1;;;49618:20:0;;49698:17;;;-1:-1:-1;;;;;49698:17:0;;;;49736:25;;22325:18:1;;49736:34:0;22307:76:1;38729:256:0;38826:7;38862:23;38879:5;38862:16;:23::i;:::-;38854:5;:31;38846:87;;;;-1:-1:-1;;;38846:87:0;;8473:2:1;38846:87:0;;;8455:21:1;8512:2;8492:18;;;8485:30;8551:34;8531:18;;;8524:62;-1:-1:-1;;;8602:18:1;;;8595:41;8653:19;;38846:87:0;8445:233:1;38846:87:0;-1:-1:-1;;;;;;38951:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;38729:256::o;55566:206::-;9411:6;;-1:-1:-1;;;;;9411:6:0;8292:10;9558:23;9550:68;;;;-1:-1:-1;;;9550:68:0;;;;;;;:::i;:::-;55629:17:::1;::::0;-1:-1:-1;;;;;55629:17:0::1;55621:74;;;::::0;-1:-1:-1;;;55621:74:0;;12943:2:1;55621:74:0::1;::::0;::::1;12925:21:1::0;12982:2;12962:18;;;12955:30;13021:32;13001:18;;;12994:60;13071:18;;55621:74:0::1;12915:180:1::0;55621:74:0::1;55714:17;::::0;55706:58:::1;::::0;-1:-1:-1;;;;;55714:17:0;;::::1;::::0;55742:21:::1;55706:58:::0;::::1;;;::::0;55714:17:::1;55706:58:::0;55714:17;55706:58;55742:21;55714:17;55706:58;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;55566:206::o:0;28402:185::-;28540:39;28557:4;28563:2;28567:7;28540:39;;;;;;;;;;;;:16;:39::i;54229:177::-;12271:1;12867:7;;:19;;12859:63;;;;-1:-1:-1;;;12859:63:0;;;;;;;:::i;:::-;12271:1;13000:7;:18;9411:6;;-1:-1:-1;;;;;9411:6:0;8292:10;9558:23:::1;9550:68;;;;-1:-1:-1::0;;;9550:68:0::1;;;;;;;:::i;:::-;54316:16:::2;54324:7;54316;:16::i;:::-;54315:17;54307:53;;;::::0;-1:-1:-1;;;54307:53:0;;21702:2:1;54307:53:0::2;::::0;::::2;21684:21:1::0;21741:2;21721:18;;;21714:30;-1:-1:-1;;;21760:18:1;;;21753:53;21823:18;;54307:53:0::2;21674:173:1::0;54307:53:0::2;54371:27;54381:7;9411:6:::0;;-1:-1:-1;;;;;9411:6:0;;9338:87;54381:7:::2;54390;54371:9;:27::i;:::-;-1:-1:-1::0;12227:1:0;13179:7;:22;54229:177::o;39251:233::-;39326:7;39362:30;39149:10;:17;;39061:113;39362:30;39354:5;:38;39346:95;;;;-1:-1:-1;;;39346:95:0;;20227:2:1;39346:95:0;;;20209:21:1;20266:2;20246:18;;;20239:30;20305:34;20285:18;;;20278:62;-1:-1:-1;;;20356:18:1;;;20349:42;20408:19;;39346:95:0;20199:234:1;39346:95:0;39459:10;39470:5;39459:17;;;;;;;;:::i;:::-;;;;;;;;;39452:24;;39251:233;;;:::o;46832:359::-;46888:13;46922:16;46930:7;46922;:16::i;:::-;46914:76;;;;-1:-1:-1;;;46914:76:0;;;;;;;:::i;:::-;47089:17;;47127:30;;-1:-1:-1;;;47127:30:0;;;;;22352:25:1;;;47001:20:0;;47089:17;;;-1:-1:-1;;;;;47089:17:0;;;;47127:21;;22325:18:1;;47127:30:0;22307:76:1;45226:35:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45226:35:0;;-1:-1:-1;45226:35:0;:::o;25237:239::-;25309:7;25345:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25345:16:0;25380:19;25372:73;;;;-1:-1:-1;;;25372:73:0;;15259:2:1;25372:73:0;;;15241:21:1;15298:2;15278:18;;;15271:30;15337:34;15317:18;;;15310:62;-1:-1:-1;;;15388:18:1;;;15381:39;15437:19;;25372:73:0;15231:231:1;45700:106:0;9411:6;;-1:-1:-1;;;;;9411:6:0;8292:10;9558:23;9550:68;;;;-1:-1:-1;;;9550:68:0;;;;;;;:::i;:::-;45783:15:::1;::::0;;-1:-1:-1;;45764:34:0;::::1;45783:15;::::0;;;::::1;;;45782:16;45764:34:::0;;::::1;;::::0;;45700:106::o;24967:208::-;25039:7;-1:-1:-1;;;;;25067:19:0;;25059:74;;;;-1:-1:-1;;;25059:74:0;;14848:2:1;25059:74:0;;;14830:21:1;14887:2;14867:18;;;14860:30;14926:34;14906:18;;;14899:62;-1:-1:-1;;;14977:18:1;;;14970:40;15027:19;;25059:74:0;14820:232:1;25059:74:0;-1:-1:-1;;;;;;25151:16:0;;;;;:9;:16;;;;;;;24967:208::o;9989:94::-;9411:6;;-1:-1:-1;;;;;9411:6:0;8292:10;9558:23;9550:68;;;;-1:-1:-1;;;9550:68:0;;;;;;;:::i;:::-;10054:21:::1;10072:1;10054:9;:21::i;:::-;9989:94::o:0;46021:97::-;9411:6;;-1:-1:-1;;;;;9411:6:0;8292:10;9558:23;9550:68;;;;-1:-1:-1;;;9550:68:0;;;;;;;:::i;:::-;46093:8:::1;:17:::0;46021:97::o;45913:100::-;9411:6;;-1:-1:-1;;;;;9411:6:0;8292:10;9558:23;9550:68;;;;-1:-1:-1;;;9550:68:0;;;;;;;:::i;:::-;45984:9:::1;:21:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;45984:21:0;;;;;::::1;::::0;45913:100::o;46669:151::-;9411:6;;-1:-1:-1;;;;;9411:6:0;8292:10;9558:23;9550:68;;;;-1:-1:-1;;;9550:68:0;;;;;;;:::i;:::-;46753:10:::1;::::0;;;::::1;;;46745:38;;;::::0;-1:-1:-1;;;46745:38:0;;12599:2:1;46745:38:0::1;::::0;::::1;12581:21:1::0;12638:2;12618:18;;;12611:30;-1:-1:-1;;;12657:18:1;;;12650:45;12712:18;;46745:38:0::1;12571:165:1::0;46745:38:0::1;46794:10;:18:::0;46669:151::o;46126:115::-;9411:6;;-1:-1:-1;;;;;9411:6:0;8292:10;9558:23;9550:68;;;;-1:-1:-1;;;9550:68:0;;;;;;;:::i;:::-;46207:15:::1;:26:::0;;-1:-1:-1;;;;;;46207:26:0::1;-1:-1:-1::0;;;;;46207:26:0;;;::::1;::::0;;;::::1;::::0;;46126:115::o;51566:310::-;51652:10;;51619:7;;51652:10;;51644:54;;;;-1:-1:-1;;;51644:54:0;;16019:2:1;51644:54:0;;;16001:21:1;16058:2;16038:18;;;16031:30;16097:33;16077:18;;;16070:61;16148:18;;51644:54:0;15991:181:1;51644:54:0;51751:18;;51736:12;;:33;;;;:::i;:::-;51717:15;:53;51709:88;;;;-1:-1:-1;;;51709:88:0;;11489:2:1;51709:88:0;;;11471:21:1;11528:2;11508:18;;;11501:30;-1:-1:-1;;;11547:18:1;;;11540:52;11609:18;;51709:88:0;11461:172:1;51709:88:0;51853:15;51831:18;;51816:12;;:33;;;;:::i;:::-;51815:53;;;;:::i;:::-;51808:60;;51566:310;:::o;25712:104::-;25768:13;25801:7;25794:14;;;;;:::i;27395:295::-;-1:-1:-1;;;;;27498:24:0;;8292:10;27498:24;;27490:62;;;;-1:-1:-1;;;27490:62:0;;12245:2:1;27490:62:0;;;12227:21:1;12284:2;12264:18;;;12257:30;12323:27;12303:18;;;12296:55;12368:18;;27490:62:0;12217:175:1;27490:62:0;8292:10;27565:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;27565:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;27565:53:0;;;;;;;;;;27634:48;;7284:41:1;;;27565:42:0;;8292:10;27634:48;;7257:18:1;27634:48:0;;;;;;;27395:295;;:::o;47933:357::-;47988:13;48022:16;48030:7;48022;:16::i;:::-;48014:76;;;;-1:-1:-1;;;48014:76:0;;;;;;;:::i;:::-;48189:17;;48227:29;;-1:-1:-1;;;48227:29:0;;;;;22352:25:1;;;48101:20:0;;48189:17;;;-1:-1:-1;;;;;48189:17:0;;;;48227:20;;22325:18:1;;48227:29:0;22307:76:1;47568:357:0;47623:13;47657:16;47665:7;47657;:16::i;:::-;47649:76;;;;-1:-1:-1;;;47649:76:0;;;;;;;:::i;:::-;47824:17;;47862:29;;-1:-1:-1;;;47862:29:0;;;;;22352:25:1;;;47736:20:0;;47824:17;;;-1:-1:-1;;;;;47824:17:0;;;;47862:20;;22325:18:1;;47862:29:0;22307:76:1;28658:328:0;28833:41;8292:10;28866:7;28833:18;:41::i;:::-;28825:103;;;;-1:-1:-1;;;28825:103:0;;;;;;;:::i;:::-;28939:39;28953:4;28959:2;28963:7;28972:5;28939:13;:39::i;:::-;28658:328;;;;:::o;45814:91::-;9411:6;;-1:-1:-1;;;;;9411:6:0;8292:10;9558:23;9550:68;;;;-1:-1:-1;;;9550:68:0;;;;;;;:::i;:::-;45887:10:::1;::::0;;-1:-1:-1;;45873:24:0;::::1;45887:10:::0;;;;::::1;;;45886:11;45873:24:::0;;::::1;;::::0;;45814:91::o;48298:369::-;48359:13;48393:16;48401:7;48393;:16::i;:::-;48385:76;;;;-1:-1:-1;;;48385:76:0;;;;;;;:::i;:::-;48560:17;;48598:35;;-1:-1:-1;;;48598:35:0;;;;;22352:25:1;;;48472:20:0;;48560:17;;;-1:-1:-1;;;;;48560:17:0;;;;48598:26;;22325:18:1;;48598:35:0;22307:76:1;50173:349:0;50228:13;50262:16;50270:7;50262;:16::i;:::-;50254:76;;;;-1:-1:-1;;;50254:76:0;;;;;;;:::i;:::-;50421:17;;50459:29;;-1:-1:-1;;;50459:29:0;;;;;22352:25:1;;;50341:20:0;;50421:17;;;-1:-1:-1;;;;;50421:17:0;;;;50459:20;;22325:18:1;;50459:29:0;22307:76:1;51279:279:0;51371:10;;51338:7;;51371:10;;;;;51363:44;;;;-1:-1:-1;;;51363:44:0;;15669:2:1;51363:44:0;;;15651:21:1;15708:2;15688:18;;;15681:30;-1:-1:-1;;;15727:18:1;;;15720:51;15788:18;;51363:44:0;15641:171:1;51363:44:0;51457:10;;51445:9;;:22;;;;:::i;:::-;51426:15;:42;51418:72;;;;-1:-1:-1;;;51418:72:0;;16740:2:1;51418:72:0;;;16722:21:1;16779:2;16759:18;;;16752:30;-1:-1:-1;;;16798:18:1;;;16791:47;16855:18;;51418:72:0;16712:167:1;51418:72:0;51535:15;51521:10;;51509:9;;:22;;;;:::i;50901:370::-;50966:13;51000:16;51008:7;51000;:16::i;:::-;50992:76;;;;-1:-1:-1;;;50992:76:0;;;;;;;:::i;:::-;51169:17;;51207:30;;-1:-1:-1;;;51207:30:0;;;;;22352:25:1;;;51089:20:0;;51169:17;;;-1:-1:-1;;;;;51169:17:0;;;;51207:21;;22325:18:1;;51207:30:0;22307:76:1;49056:377:0;49121:13;49155:16;49163:7;49155;:16::i;:::-;49147:76;;;;-1:-1:-1;;;49147:76:0;;;;;;;:::i;:::-;49322:17;;49360:39;;-1:-1:-1;;;49360:39:0;;;;;22352:25:1;;;49234:20:0;;49322:17;;;-1:-1:-1;;;;;49322:17:0;;;;49360:30;;22325:18:1;;49360:39:0;22307:76:1;52887:701:0;12271:1;12867:7;;:19;;12859:63;;;;-1:-1:-1;;;12859:63:0;;;;;;;:::i;:::-;12271:1;13000:7;:18;52966:10:::1;::::0;;;::::1;;;52958:54;;;::::0;-1:-1:-1;;;52958:54:0;;18686:2:1;52958:54:0::1;::::0;::::1;18668:21:1::0;18725:2;18705:18;;;18698:30;18764:33;18744:18;;;18737:61;18815:18;;52958:54:0::1;18658:181:1::0;52958:54:0::1;53063:9;;53050:10;;:22;;;;:::i;:::-;53031:15;:42;53023:77;;;::::0;-1:-1:-1;;;53023:77:0;;21351:2:1;53023:77:0::1;::::0;::::1;21333:21:1::0;21390:2;21370:18;;;21363:30;-1:-1:-1;;;21409:18:1;;;21402:52;21471:18;;53023:77:0::1;21323:172:1::0;53023:77:0::1;8292:10:::0;53119:32:::1;::::0;;;:18:::1;:32;::::0;;;;;::::1;;53111:74;;;::::0;-1:-1:-1;;;53111:74:0;;13302:2:1;53111:74:0::1;::::0;::::1;13284:21:1::0;13341:2;13321:18;;;13314:30;13380:31;13360:18;;;13353:59;13429:18;;53111:74:0::1;13274:179:1::0;53111:74:0::1;53196:18;53217:17;:6:::0;53226:8:::1;53217:17;:::i;:::-;53282:13;::::0;53196:38;;-1:-1:-1;;;;;;53282:13:0::1;::::0;53307:11:::1;8292:10:::0;53307:37:::1;::::0;-1:-1:-1;;;;;;53307:37:0::1;::::0;;;;;;-1:-1:-1;;;;;7057:32:1;;;53307:37:0::1;::::0;::::1;7039:51:1::0;7106:18;;;7099:34;;;7012:18;;53307:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;53355:21;53407:6;53379:11;:25;53391:12;8292:10:::0;;8212:98;53391:12:::1;-1:-1:-1::0;;;;;53379:25:0::1;-1:-1:-1::0;;;;;53379:25:0::1;;;;;;;;;;;;;:34;;;;:::i;:::-;8292:10:::0;53424:25:::1;::::0;;;:11:::1;:25;::::0;;;;:41;;;53497:15:::1;::::0;53355:58;;-1:-1:-1;53481:31:0;::::1;53478:103;;;53538:15;:31:::0;;;53478:103:::1;-1:-1:-1::0;;12227:1:0;13179:7;:22;-1:-1:-1;;52887:701:0:o;50530:363::-;50588:13;50622:16;50630:7;50622;:16::i;:::-;50614:76;;;;-1:-1:-1;;;50614:76:0;;;;;;;:::i;:::-;50789:17;;50827:32;;-1:-1:-1;;;50827:32:0;;;;;22352:25:1;;;50701:20:0;;50789:17;;;-1:-1:-1;;;;;50789:17:0;;;;50827:23;;22325:18:1;;50827:32:0;22307:76:1;48679:365:0;48738:13;48772:16;48780:7;48772;:16::i;:::-;48764:76;;;;-1:-1:-1;;;48764:76:0;;;;;;;:::i;:::-;48939:17;;48977:33;;-1:-1:-1;;;48977:33:0;;;;;22352:25:1;;;48851:20:0;;48939:17;;;-1:-1:-1;;;;;48939:17:0;;;;48977:24;;22325:18:1;;48977:33:0;22307:76:1;46249:117:0;9411:6;;-1:-1:-1;;;;;9411:6:0;8292:10;9558:23;9550:68;;;;-1:-1:-1;;;9550:68:0;;;;;;;:::i;:::-;46331:16:::1;:27:::0;;-1:-1:-1;;;;;;46331:27:0::1;-1:-1:-1::0;;;;;46331:27:0;;;::::1;::::0;;;::::1;::::0;;46249:117::o;55293:134::-;9411:6;;-1:-1:-1;;;;;9411:6:0;8292:10;9558:23;9550:68;;;;-1:-1:-1;;;9550:68:0;;;;;;;:::i;:::-;55384:17:::1;:35:::0;;-1:-1:-1;;;;;55384:35:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;55384:35:0;;::::1;::::0;;;::::1;::::0;;55293:134::o;46487:174::-;9411:6;;-1:-1:-1;;;;;9411:6:0;8292:10;9558:23;9550:68;;;;-1:-1:-1;;;9550:68:0;;;;;;;:::i;:::-;46552:10:::1;::::0;;;::::1;;;46551:11;46543:44;;;::::0;-1:-1:-1;;;46543:44:0;;10424:2:1;46543:44:0::1;::::0;::::1;10406:21:1::0;10463:2;10443:18;;;10436:30;-1:-1:-1;;;10482:18:1;;;10475:50;10542:18;;46543:44:0::1;10396:170:1::0;46543:44:0::1;46598:10;:17:::0;;-1:-1:-1;;46598:17:0::1;::::0;::::1;::::0;;46638:15:::1;46626:9;:27:::0;46487:174::o;49816:349::-;49871:13;49905:16;49913:7;49905;:16::i;:::-;49897:76;;;;-1:-1:-1;;;49897:76:0;;;;;;;:::i;:::-;50064:17;;50102:29;;-1:-1:-1;;;50102:29:0;;;;;22352:25:1;;;49984:20:0;;50064:17;;;-1:-1:-1;;;;;50064:17:0;;;;50102:20;;22325:18:1;;50102:29:0;22307:76:1;53596:621:0;12271:1;12867:7;;:19;;12859:63;;;;-1:-1:-1;;;12859:63:0;;;;;;;:::i;:::-;12271:1;13000:7;:18;53725:15:::1;::::0;::::1;::::0;::::1;;;53717:59;;;::::0;-1:-1:-1;;;53717:59:0;;7762:2:1;53717:59:0::1;::::0;::::1;7744:21:1::0;7801:2;7781:18;;;7774:30;7840:33;7820:18;;;7813:61;7891:18;;53717:59:0::1;7734:181:1::0;53717:59:0::1;53796:16;53804:7;53796;:16::i;:::-;53795:17;53787:53;;;::::0;-1:-1:-1;;;53787:53:0;;21702:2:1;53787:53:0::1;::::0;::::1;21684:21:1::0;21741:2;21721:18;;;21714:30;-1:-1:-1;;;21760:18:1;;;21753:53;21823:18;;53787:53:0::1;21674:173:1::0;53787:53:0::1;53859:65;8292:10:::0;53892:15:::1;53909:7;53918:5;53859:18;:65::i;:::-;53851:105;;;::::0;-1:-1:-1;;;53851:105:0;;10068:2:1;53851:105:0::1;::::0;::::1;10050:21:1::0;10107:2;10087:18;;;10080:30;10146:29;10126:18;;;10119:57;10193:18;;53851:105:0::1;10040:177:1::0;53851:105:0::1;8292:10:::0;53975:30:::1;::::0;;;:16:::1;:30;::::0;;;;;54008:1:::1;53975:30;::::0;;::::1;:34;53967:68;;;::::0;-1:-1:-1;;;53967:68:0;;14498:2:1;53967:68:0::1;::::0;::::1;14480:21:1::0;14537:2;14517:18;;;14510:30;-1:-1:-1;;;14556:18:1;;;14549:51;14617:18;;53967:68:0::1;14470:171:1::0;53967:68:0::1;8292:10:::0;54130:30:::1;::::0;;;:16:::1;:30;::::0;;;;:34;;-1:-1:-1;;54130:34:0::1;54163:1;54130:34;::::0;;54177:32:::1;::::0;54201:7;54177:9:::1;:32::i;:::-;-1:-1:-1::0;;12227:1:0;13179:7;:22;-1:-1:-1;53596:621:0:o;10238:192::-;9411:6;;-1:-1:-1;;;;;9411:6:0;8292:10;9558:23;9550:68;;;;-1:-1:-1;;;9550:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10327:22:0;::::1;10319:73;;;::::0;-1:-1:-1;;;10319:73:0;;9304:2:1;10319:73:0::1;::::0;::::1;9286:21:1::0;9343:2;9323:18;;;9316:30;9382:34;9362:18;;;9355:62;-1:-1:-1;;;9433:18:1;;;9426:36;9479:19;;10319:73:0::1;9276:228:1::0;10319:73:0::1;10403:19;10413:8;10403:9;:19::i;24598:305::-:0;24700:4;-1:-1:-1;;;;;;24737:40:0;;-1:-1:-1;;;24737:40:0;;:105;;-1:-1:-1;;;;;;;24794:48:0;;-1:-1:-1;;;24794:48:0;24737:105;:158;;;-1:-1:-1;;;;;;;;;;23314:40:0;;;24859:36;23205:157;30496:127;30561:4;30585:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30585:16:0;:30;;;30496:127::o;52536:343::-;52630:15;;52686:16;;52585:4;;-1:-1:-1;;;;;52630:15:0;;;;52686:16;52585:4;52630:15;52717:21;8292:10;52717:35;;-1:-1:-1;;;;;;52717:35:0;;;;;;;-1:-1:-1;;;;;6328:32:1;;;52717:35:0;;;6310:51:1;6283:18;;52717:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;:83;;;-1:-1:-1;52799:1:0;-1:-1:-1;;;;;52760:22:0;;;8292:10;52760:36;;-1:-1:-1;;;;;;52760:36:0;;;;;;;-1:-1:-1;;;;;6328:32:1;;;52760:36:0;;;6310:51:1;6283:18;;52760:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;52717:83;52714:135;;;52833:4;52826:11;;;;52536:343;:::o;52714:135::-;52866:5;52859:12;;;;52536:343;:::o;34478:174::-;34553:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34553:29:0;-1:-1:-1;;;;;34553:29:0;;;;;;;;:24;;34607:23;34553:24;34607:14;:23::i;:::-;-1:-1:-1;;;;;34598:46:0;;;;;;;;;;;34478:174;;:::o;30790:348::-;30883:4;30908:16;30916:7;30908;:16::i;:::-;30900:73;;;;-1:-1:-1;;;30900:73:0;;13660:2:1;30900:73:0;;;13642:21:1;13699:2;13679:18;;;13672:30;13738:34;13718:18;;;13711:62;-1:-1:-1;;;13789:18:1;;;13782:42;13841:19;;30900:73:0;13632:234:1;30900:73:0;30984:13;31000:23;31015:7;31000:14;:23::i;:::-;30984:39;;31053:5;-1:-1:-1;;;;;31042:16:0;:7;-1:-1:-1;;;;;31042:16:0;;:51;;;;31086:7;-1:-1:-1;;;;;31062:31:0;:20;31074:7;31062:11;:20::i;:::-;-1:-1:-1;;;;;31062:31:0;;31042:51;:87;;;-1:-1:-1;;;;;;27882:25:0;;;27858:4;27882:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;31097:32;27761:164;33782:578;33941:4;-1:-1:-1;;;;;33914:31:0;:23;33929:7;33914:14;:23::i;:::-;-1:-1:-1;;;;;33914:31:0;;33906:85;;;;-1:-1:-1;;;33906:85:0;;17860:2:1;33906:85:0;;;17842:21:1;17899:2;17879:18;;;17872:30;17938:34;17918:18;;;17911:62;-1:-1:-1;;;17989:18:1;;;17982:39;18038:19;;33906:85:0;17832:231:1;33906:85:0;-1:-1:-1;;;;;34010:16:0;;34002:65;;;;-1:-1:-1;;;34002:65:0;;11840:2:1;34002:65:0;;;11822:21:1;11879:2;11859:18;;;11852:30;11918:34;11898:18;;;11891:62;-1:-1:-1;;;11969:18:1;;;11962:34;12013:19;;34002:65:0;11812:226:1;34002:65:0;34080:39;34101:4;34107:2;34111:7;34080:20;:39::i;:::-;34184:29;34201:1;34205:7;34184:8;:29::i;:::-;-1:-1:-1;;;;;34226:15:0;;;;;;:9;:15;;;;;:20;;34245:1;;34226:15;:20;;34245:1;;34226:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34257:13:0;;;;;;:9;:13;;;;;:18;;34274:1;;34257:13;:18;;34274:1;;34257:18;:::i;:::-;;;;-1:-1:-1;;34286:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34286:21:0;-1:-1:-1;;;;;34286:21:0;;;;;;;;;34325:27;;34286:16;;34325:27;;;;;;;33782:578;;;:::o;31480:110::-;31556:26;31566:2;31570:7;31556:26;;;;;;;;;;;;:9;:26::i;:::-;31480:110;;:::o;10438:173::-;10513:6;;;-1:-1:-1;;;;;10530:17:0;;;-1:-1:-1;;;;;;10530:17:0;;;;;;;10563:40;;10513:6;;;10530:17;10513:6;;10563:40;;10494:16;;10563:40;10483:128;10438:173;:::o;29868:315::-;30025:28;30035:4;30041:2;30045:7;30025:9;:28::i;:::-;30072:48;30095:4;30101:2;30105:7;30114:5;30072:22;:48::i;:::-;30064:111;;;;-1:-1:-1;;;30064:111:0;;;;;;;:::i;54416:869::-;54549:4;54604:12;54646:5;54653:6;54661:17;54629:50;;;;;;;;;5985:19:1;;;6042:2;6038:15;;;;-1:-1:-1;;6034:53:1;6029:2;6020:12;;6013:75;6113:2;6104:12;;6097:28;6150:2;6141:12;;5975:184;54629:50:0;;;;-1:-1:-1;;54629:50:0;;;;;;;;;54619:61;;54629:50;54619:61;;;;;-1:-1:-1;54706:5:0;54691:12;54722:292;54745:5;:12;54741:1;:16;;;54722:292;;;54784:4;54791;54784:11;54800:1;54783:18;54779:200;;;54856:5;54862:1;54856:8;;;;;;;;;;:::i;:::-;;;;;;;54866:4;54839:32;;;;;;;;5705:19:1;;;5749:2;5740:12;;5733:28;5786:2;5777:12;;5695:100;54839:32:0;;;;;;;;;;;;;54829:43;;;;;;54822:50;;54779:200;;;54947:4;54953:5;54959:1;54953:8;;;;;;;;;;:::i;:::-;;;;;;;54930:32;;;;;;;;5705:19:1;;;5749:2;5740:12;;5733:28;5786:2;5777:12;;5695:100;54930:32:0;;;;;;;;;;;;;54920:43;;;;;;54913:50;;54779:200;54993:9;55001:1;54993:9;;:::i;:::-;;-1:-1:-1;54759:3:0;;;;:::i;:::-;;;;54722:292;;;;55094:6;55090:163;55110:9;:16;55106:20;;55090:163;;;55169:9;55179:1;55169:12;;;;;;;;:::i;:::-;;;;;;;;;55161:4;:20;55157:85;;;55222:4;55215:11;;;;;;;55157:85;55128:3;;;;:::i;:::-;;;;55090:163;;;-1:-1:-1;55272:5:0;;54416:869;-1:-1:-1;;;;;;;54416:869:0:o;40097:589::-;-1:-1:-1;;;;;40303:18:0;;40299:187;;40338:40;40370:7;41513:10;:17;;41486:24;;;;:15;:24;;;;;:44;;;41541:24;;;;;;;;;;;;41409:164;40338:40;40299:187;;;40408:2;-1:-1:-1;;;;;40400:10:0;:4;-1:-1:-1;;;;;40400:10:0;;40396:90;;40427:47;40460:4;40466:7;40427:32;:47::i;:::-;-1:-1:-1;;;;;40500:16:0;;40496:183;;40533:45;40570:7;40533:36;:45::i;40496:183::-;40606:4;-1:-1:-1;;;;;40600:10:0;:2;-1:-1:-1;;;;;40600:10:0;;40596:83;;40627:40;40655:2;40659:7;40627:27;:40::i;31817:321::-;31947:18;31953:2;31957:7;31947:5;:18::i;:::-;31998:54;32029:1;32033:2;32037:7;32046:5;31998:22;:54::i;:::-;31976:154;;;;-1:-1:-1;;;31976:154:0;;;;;;;:::i;35217:803::-;35372:4;-1:-1:-1;;;;;35393:13:0;;15710:20;15758:8;35389:624;;35429:72;;-1:-1:-1;;;35429:72:0;;-1:-1:-1;;;;;35429:36:0;;;;;:72;;8292:10;;35480:4;;35486:7;;35495:5;;35429:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35429:72:0;;;;;;;;-1:-1:-1;;35429:72:0;;;;;;;;;;;;:::i;:::-;;;35425:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35675:13:0;;35671:272;;35718:60;;-1:-1:-1;;;35718:60:0;;;;;;;:::i;35671:272::-;35893:6;35887:13;35878:6;35874:2;35870:15;35863:38;35425:533;-1:-1:-1;;;;;;35552:55:0;-1:-1:-1;;;35552:55:0;;-1:-1:-1;35545:62:0;;35389:624;-1:-1:-1;35997:4:0;35990:11;;42200:988;42466:22;42516:1;42491:22;42508:4;42491:16;:22::i;:::-;:26;;;;:::i;:::-;42528:18;42549:26;;;:17;:26;;;;;;42466:51;;-1:-1:-1;42682:28:0;;;42678:328;;-1:-1:-1;;;;;42749:18:0;;42727:19;42749:18;;;:12;:18;;;;;;;;:34;;;;;;;;;42800:30;;;;;;:44;;;42917:30;;:17;:30;;;;;:43;;;42678:328;-1:-1:-1;43102:26:0;;;;:17;:26;;;;;;;;43095:33;;;-1:-1:-1;;;;;43146:18:0;;;;;:12;:18;;;;;:34;;;;;;;43139:41;42200:988::o;43483:1079::-;43761:10;:17;43736:22;;43761:21;;43781:1;;43761:21;:::i;:::-;43793:18;43814:24;;;:15;:24;;;;;;44187:10;:26;;43736:46;;-1:-1:-1;43814:24:0;;43736:46;;44187:26;;;;;;:::i;:::-;;;;;;;;;44165:48;;44251:11;44226:10;44237;44226:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;44331:28;;;:15;:28;;;;;;;:41;;;44503:24;;;;;44496:31;44538:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43554:1008;;;43483:1079;:::o;40987:221::-;41072:14;41089:20;41106:2;41089:16;:20::i;:::-;-1:-1:-1;;;;;41120:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;41165:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;40987:221:0:o;32474:382::-;-1:-1:-1;;;;;32554:16:0;;32546:61;;;;-1:-1:-1;;;32546:61:0;;16379:2:1;32546:61:0;;;16361:21:1;;;16398:18;;;16391:30;16457:34;16437:18;;;16430:62;16509:18;;32546:61:0;16351:182:1;32546:61:0;32627:16;32635:7;32627;:16::i;:::-;32626:17;32618:58;;;;-1:-1:-1;;;32618:58:0;;9711:2:1;32618:58:0;;;9693:21:1;9750:2;9730:18;;;9723:30;9789;9769:18;;;9762:58;9837:18;;32618:58:0;9683:178:1;32618:58:0;32689:45;32718:1;32722:2;32726:7;32689:20;:45::i;:::-;-1:-1:-1;;;;;32747:13:0;;;;;;:9;:13;;;;;:18;;32764:1;;32747:13;:18;;32764:1;;32747:18;:::i;:::-;;;;-1:-1:-1;;32776:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32776:21:0;-1:-1:-1;;;;;32776:21:0;;;;;;;;32815:33;;32776:16;;;32815:33;;32776:16;;32815:33;32474:382;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;320:1;317;310:12;272:2;343:29;362:9;343:29;:::i;:::-;333:39;262:116;-1:-1:-1;;;262:116:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:2;;;528:1;525;518:12;480:2;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;470:173;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:2;;;810:1;807;800:12;762:2;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;752:224;;;;;:::o;981:888::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:2;;;1170:1;1167;1160:12;1121:2;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1408:18;1400:6;1397:30;1394:2;;;1440:1;1437;1430:12;1394:2;1463:22;;1516:4;1508:13;;1504:27;-1:-1:-1;1494:2:1;;1545:1;1542;1535:12;1494:2;1581;1568:16;1606:48;1622:31;1650:2;1622:31;:::i;:::-;1606:48;:::i;:::-;1677:2;1670:5;1663:17;1717:7;1712:2;1707;1703;1699:11;1695:20;1692:33;1689:2;;;1738:1;1735;1728:12;1689:2;1793;1788;1784;1780:11;1775:2;1768:5;1764:14;1751:45;1837:1;1832:2;1827;1820:5;1816:14;1812:23;1805:34;1858:5;1848:15;;;;;1111:758;;;;;;;:::o;1874:347::-;1939:6;1947;2000:2;1988:9;1979:7;1975:23;1971:32;1968:2;;;2016:1;2013;2006:12;1968:2;2039:29;2058:9;2039:29;:::i;:::-;2029:39;;2118:2;2107:9;2103:18;2090:32;2165:5;2158:13;2151:21;2144:5;2141:32;2131:2;;2187:1;2184;2177:12;2131:2;2210:5;2200:15;;;1958:263;;;;;:::o;2226:254::-;2294:6;2302;2355:2;2343:9;2334:7;2330:23;2326:32;2323:2;;;2371:1;2368;2361:12;2323:2;2394:29;2413:9;2394:29;:::i;:::-;2384:39;2470:2;2455:18;;;;2442:32;;-1:-1:-1;;;2313:167:1:o;2485:180::-;2544:6;2597:2;2585:9;2576:7;2572:23;2568:32;2565:2;;;2613:1;2610;2603:12;2565:2;-1:-1:-1;2636:23:1;;2555:110;-1:-1:-1;2555:110:1:o;2670:245::-;2728:6;2781:2;2769:9;2760:7;2756:23;2752:32;2749:2;;;2797:1;2794;2787:12;2749:2;2836:9;2823:23;2855:30;2879:5;2855:30;:::i;2920:249::-;2989:6;3042:2;3030:9;3021:7;3017:23;3013:32;3010:2;;;3058:1;3055;3048:12;3010:2;3090:9;3084:16;3109:30;3133:5;3109:30;:::i;3174:635::-;3254:6;3307:2;3295:9;3286:7;3282:23;3278:32;3275:2;;;3323:1;3320;3313:12;3275:2;3356:9;3350:16;3389:18;3381:6;3378:30;3375:2;;;3421:1;3418;3411:12;3375:2;3444:22;;3497:4;3489:13;;3485:27;-1:-1:-1;3475:2:1;;3526:1;3523;3516:12;3475:2;3555;3549:9;3580:48;3596:31;3624:2;3596:31;:::i;3580:48::-;3651:2;3644:5;3637:17;3691:7;3686:2;3681;3677;3673:11;3669:20;3666:33;3663:2;;;3712:1;3709;3702:12;3663:2;3725:54;3776:2;3771;3764:5;3760:14;3755:2;3751;3747:11;3725:54;:::i;:::-;3798:5;3265:544;-1:-1:-1;;;;;3265:544:1:o;3999:184::-;4069:6;4122:2;4110:9;4101:7;4097:23;4093:32;4090:2;;;4138:1;4135;4128:12;4090:2;-1:-1:-1;4161:16:1;;4080:103;-1:-1:-1;4080:103:1:o;4188:1093::-;4290:6;4298;4306;4359:2;4347:9;4338:7;4334:23;4330:32;4327:2;;;4375:1;4372;4365:12;4327:2;4411:9;4398:23;4388:33;;4440:2;4489;4478:9;4474:18;4461:32;4451:42;;4544:2;4533:9;4529:18;4516:32;4567:18;4608:2;4600:6;4597:14;4594:2;;;4624:1;4621;4614:12;4594:2;4662:6;4651:9;4647:22;4637:32;;4707:7;4700:4;4696:2;4692:13;4688:27;4678:2;;4729:1;4726;4719:12;4678:2;4765;4752:16;4787:2;4783;4780:10;4777:2;;;4793:18;;:::i;:::-;4839:2;4836:1;4832:10;4822:20;;4862:28;4886:2;4882;4878:11;4862:28;:::i;:::-;4924:15;;;4955:12;;;;4987:11;;;5017;;;5013:20;;5010:33;-1:-1:-1;5007:2:1;;;5056:1;5053;5046:12;5007:2;5078:1;5069:10;;5088:163;5102:2;5099:1;5096:9;5088:163;;;5159:17;;5147:30;;5120:1;5113:9;;;;;5197:12;;;;5229;;5088:163;;;5092:3;5270:5;5260:15;;;;;;;;4317:964;;;;;:::o;5286:257::-;5327:3;5365:5;5359:12;5392:6;5387:3;5380:19;5408:63;5464:6;5457:4;5452:3;5448:14;5441:4;5434:5;5430:16;5408:63;:::i;:::-;5525:2;5504:15;-1:-1:-1;;5500:29:1;5491:39;;;;5532:4;5487:50;;5335:208;-1:-1:-1;;5335:208:1:o;6372:488::-;-1:-1:-1;;;;;6641:15:1;;;6623:34;;6693:15;;6688:2;6673:18;;6666:43;6740:2;6725:18;;6718:34;;;6788:3;6783:2;6768:18;;6761:31;;;6566:4;;6809:45;;6834:19;;6826:6;6809:45;:::i;:::-;6801:53;6575:285;-1:-1:-1;;;;;;6575:285:1:o;7336:219::-;7485:2;7474:9;7467:21;7448:4;7505:44;7545:2;7534:9;7530:18;7522:6;7505:44;:::i;8683:414::-;8885:2;8867:21;;;8924:2;8904:18;;;8897:30;8963:34;8958:2;8943:18;;8936:62;-1:-1:-1;;;9029:2:1;9014:18;;9007:48;9087:3;9072:19;;8857:240::o;17297:356::-;17499:2;17481:21;;;17518:18;;;17511:30;17577:34;17572:2;17557:18;;17550:62;17644:2;17629:18;;17471:182::o;18068:411::-;18270:2;18252:21;;;18309:2;18289:18;;;18282:30;18348:34;18343:2;18328:18;;18321:62;-1:-1:-1;;;18414:2:1;18399:18;;18392:45;18469:3;18454:19;;18242:237::o;19607:413::-;19809:2;19791:21;;;19848:2;19828:18;;;19821:30;19887:34;19882:2;19867:18;;19860:62;-1:-1:-1;;;19953:2:1;19938:18;;19931:47;20010:3;19995:19;;19781:239::o;20438:355::-;20640:2;20622:21;;;20679:2;20659:18;;;20652:30;20718:33;20713:2;20698:18;;20691:61;20784:2;20769:18;;20612:181::o;22388:275::-;22459:2;22453:9;22524:2;22505:13;;-1:-1:-1;;22501:27:1;22489:40;;22559:18;22544:34;;22580:22;;;22541:62;22538:2;;;22606:18;;:::i;:::-;22642:2;22635:22;22433:230;;-1:-1:-1;22433:230:1:o;22668:186::-;22716:4;22749:18;22741:6;22738:30;22735:2;;;22771:18;;:::i;:::-;-1:-1:-1;22837:2:1;22816:15;-1:-1:-1;;22812:29:1;22843:4;22808:40;;22725:129::o;22859:128::-;22899:3;22930:1;22926:6;22923:1;22920:13;22917:2;;;22936:18;;:::i;:::-;-1:-1:-1;22972:9:1;;22907:80::o;22992:217::-;23032:1;23058;23048:2;;23102:10;23097:3;23093:20;23090:1;23083:31;23137:4;23134:1;23127:15;23165:4;23162:1;23155:15;23048:2;-1:-1:-1;23194:9:1;;23038:171::o;23214:168::-;23254:7;23320:1;23316;23312:6;23308:14;23305:1;23302:21;23297:1;23290:9;23283:17;23279:45;23276:2;;;23327:18;;:::i;:::-;-1:-1:-1;23367:9:1;;23266:116::o;23387:125::-;23427:4;23455:1;23452;23449:8;23446:2;;;23460:18;;:::i;:::-;-1:-1:-1;23497:9:1;;23436:76::o;23517:258::-;23589:1;23599:113;23613:6;23610:1;23607:13;23599:113;;;23689:11;;;23683:18;23670:11;;;23663:39;23635:2;23628:10;23599:113;;;23730:6;23727:1;23724:13;23721:2;;;-1:-1:-1;;23765:1:1;23747:16;;23740:27;23570:205::o;23780:380::-;23859:1;23855:12;;;;23902;;;23923:2;;23977:4;23969:6;23965:17;23955:27;;23923:2;24030;24022:6;24019:14;23999:18;23996:38;23993:2;;;24076:10;24071:3;24067:20;24064:1;24057:31;24111:4;24108:1;24101:15;24139:4;24136:1;24129:15;23993:2;;23835:325;;;:::o;24165:197::-;24203:3;24231:6;24272:2;24265:5;24261:14;24299:2;24290:7;24287:15;24284:2;;;24305:18;;:::i;:::-;24354:1;24341:15;;24211:151;-1:-1:-1;;;24211:151:1:o;24367:135::-;24406:3;-1:-1:-1;;24427:17:1;;24424:2;;;24447:18;;:::i;:::-;-1:-1:-1;24494:1:1;24483:13;;24414:88::o;24507:127::-;24568:10;24563:3;24559:20;24556:1;24549:31;24599:4;24596:1;24589:15;24623:4;24620:1;24613:15;24639:127;24700:10;24695:3;24691:20;24688:1;24681:31;24731:4;24728:1;24721:15;24755:4;24752:1;24745:15;24771:127;24832:10;24827:3;24823:20;24820:1;24813:31;24863:4;24860:1;24853:15;24887:4;24884:1;24877:15;24903:127;24964:10;24959:3;24955:20;24952:1;24945:31;24995:4;24992:1;24985:15;25019:4;25016:1;25009:15;25035:131;-1:-1:-1;;;;;;25109:32:1;;25099:43;;25089:2;;25156:1;25153;25146:12

Swarm Source

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