ETH Price: $3,081.03 (-0.73%)

Token

Luminal Universe (LUMINALUNIVERSE)
 

Overview

Max Total Supply

1,444 LUMINALUNIVERSE

Holders

497

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 LUMINALUNIVERSE
0xcd78E9f53a42ee0878CF7829df17310Eb8375627
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
LuminalUniverse

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-16
*/

// SPDX-License-Identifier: MIT

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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;
}

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

pragma solidity ^0.8.0;

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

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

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

// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.6;

library Address {
    function isContract(address account) internal view returns (bool) {
        uint size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

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

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPIs 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);
    }
}

pragma solidity ^0.8.7;

abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    string private _name;
    string private _symbol;

    // Mapping from token ID to owner address
    address[] internal _owners;

    mapping(uint256 => address) private _tokenApprovals;
    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 (uint)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );

        uint count;
        for (uint i; i < _owners.length; ++i) {
            if (owner == _owners[i]) ++count;
        }
        return count;
    }

    /**
     * @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 {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 tokenId < _owners.length && _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);
        _owners.push(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);
        _owners[tokenId] = address(0);

        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);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

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

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

pragma solidity ^0.8.7;

/**
 * @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 but rips out the core of the gas-wasting processing that comes from OpenZeppelin.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    /**
     * @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-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _owners.length;
    }

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

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

        uint count;
        for (uint i; i < _owners.length; i++) {
            if (owner == _owners[i]) {
                if (count == index) return i;
                else count++;
            }
        }

        revert("ERC721Enumerable: owner index out of bounds");
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf)
        internal
        pure
        returns (bytes32)
    {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(
                    abi.encodePacked(computedHash, proofElement)
                );
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(
                    abi.encodePacked(proofElement, computedHash)
                );
            }
        }
        return computedHash;
    }
}

pragma solidity ^0.8.11;
pragma abicoder v2;

contract LuminalUniverse is ERC721Enumerable, Ownable {
    using MerkleProof for bytes32[];
    string public baseURI;

    mapping(address => bool) public whitelistAllowance;
    mapping(address => uint256)public  genesisFreeClaimed;
    mapping(address => uint256) public genesisAllowance;
    mapping(address => uint256) public publicAllowance;

    bytes32 public allowlistMerkleRoot;
    bytes32 public genesisMerkleRoot;

    bool public whitelistSaleIsActive;
    bool public genesisSaleIsActive;
    bool public publicSaleIsActive;

    uint public constant MAX_TOKENS = 1445;
    uint public constant MAX_TOKEN_PER_TXN = 2;
    uint public constant TOKEN_PRICE = 0.04 ether;

    uint public constant maxAllowListSupply = 1001;
    uint public constant maxGenesisSupply = 445;
    uint public allowListMinted = 0;
    uint public genesisClaimMinted = 0;

    modifier blockContracts() {
        require(tx.origin == msg.sender, "No smart contracts are allowed");
        _;
    }

    constructor() ERC721("Luminal Universe", "LUMINALUNIVERSE") {
        setAllowListRoot(
            0x3435f0bb641e0f7bce96bd6096693a5e349d7ed4f3afe056f686639b0ecdfbea
        );
        setGenesisRoot(
            0xfe4954196fa78174190adcdc10c6d6bac285a4a4edefbd1823c878e174512264
        );
        setBaseURI(
          "ipfs://QmfYtu5ASZnfYdghiJTqYYN3maCVpuJPrvJRHbu3ZbkvZL/"
        );
    }

    //withdraw function
    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "Your balance is zero");
        address localOwner = payable(msg.sender);
        (bool ownerSuccess, ) = localOwner.call{value: balance}("");
        require(ownerSuccess, "Failed to send to Owner");
    }

    //setBaseURI
    function setBaseURI(string memory _baseURI) public onlyOwner {
        baseURI = _baseURI;
    }

    //flipWhitelistSale
    function flipWhiteListSaleState() external onlyOwner {
        whitelistSaleIsActive = !whitelistSaleIsActive;
    }

    //flipGenesisSale
    function flipGenesisSaleState() external onlyOwner {
        genesisSaleIsActive = !genesisSaleIsActive;
    }

    //flipPublicSale
    function flipPublicSaleState() external onlyOwner {
        publicSaleIsActive = !publicSaleIsActive;
    }

    //setAllowListRoot for allowlist
    function setAllowListRoot(bytes32 _root) public onlyOwner {
        allowlistMerkleRoot = _root;
    }

    //setGenesisRoot for genesis holder
    function setGenesisRoot(bytes32 _root) public onlyOwner {
        genesisMerkleRoot = _root;
    }

    //leaf for allowlist merkle root
    function _allowlistLeaf(address account) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(account));
    }

    //leaf for genesis merkle root
    function _genesisLeaf(address account, uint numberOfFreeClaims)
        internal
        pure
        returns (bytes32)
    {
        return keccak256(abi.encodePacked(account, numberOfFreeClaims));
    }

    //verify function for merkle root
    function _verify(
        bytes32 _leaf,
        bytes32[] memory _proof,
        bytes32 root
    ) internal pure returns (bool) {
        return MerkleProof.verify(_proof, root, _leaf);
    }

    //airdrop
    function airdrop(address _to, uint256 numberOfTokens) external onlyOwner {
        uint256 supply = totalSupply();
        require(
            supply + numberOfTokens < MAX_TOKENS,
            "Purchase would exceed the max supply"
        );
        for (uint256 i; i < numberOfTokens; i++) {
            _safeMint(_to, supply + i);
        }
    }

    //whitelistMint
    function whitelistMint(bytes32[] memory _proof)
        external
        payable
        blockContracts
    {
        uint supply = totalSupply();
        require(whitelistSaleIsActive, "Whitelist sale is not active");
        require(
            _verify(_allowlistLeaf(msg.sender), _proof, allowlistMerkleRoot),
            "You are not whitelisted"
        );
        require(
            !whitelistAllowance[msg.sender],
            "You can only mint one for WL"
        );
        require(allowListMinted + 1 < maxAllowListSupply, "Exceeds allowlist supply");
        require(msg.value == TOKEN_PRICE, "Ether sent is not correct");
        allowListMinted += 1;
        whitelistAllowance[msg.sender] = true;
        _mint(msg.sender, supply);
    }

    function genesisFreeClaim(
        uint _numberOfTokens,
        uint _numberOfFreeClaims,
        bytes32[] memory _proof
    ) external blockContracts {
        uint supply = totalSupply();
        require(
            whitelistSaleIsActive,
            "Free uinverse claim for genesis is not active"
        );
        require(
            _verify(
                _genesisLeaf(msg.sender, _numberOfFreeClaims),
                _proof,
                genesisMerkleRoot
            ),
            "You are not allowed to claim free universe"
        );
        require(
            genesisFreeClaimed[msg.sender] + _numberOfTokens <=
                _numberOfFreeClaims,
            "Exceeds claim allowance"
        );
        require(
            genesisClaimMinted + _numberOfTokens < maxGenesisSupply,
            "Claim would exceed max supply"
        );
        genesisClaimMinted += _numberOfTokens;
        genesisFreeClaimed[msg.sender] += _numberOfTokens;
        for (uint i; i < _numberOfTokens; i++) {
            _mint(msg.sender, supply + i);
        }
    }

    function genesisMint(
        uint _numberOfTokens,
        uint _numberOfFreeClaims,
        bytes32[] memory _proof
    ) external payable blockContracts {
        uint supply = totalSupply();
        require(
            genesisSaleIsActive,
            "Genesis sale to mint universe is not active"
        );
        require(
            _verify(
                _genesisLeaf(msg.sender, _numberOfFreeClaims),
                _proof,
                genesisMerkleRoot
            ),
            "You are not allowed to mint for Stage 2"
        );
        require(
            genesisAllowance[msg.sender] + _numberOfTokens <= MAX_TOKEN_PER_TXN,
            "Genesis holder can only mint 2 Universe per address"
        );
        require(
            supply + _numberOfTokens < MAX_TOKENS,
            "Purchase would exceed max supply"
        );
        require(
            msg.value == TOKEN_PRICE * _numberOfTokens,
            "Ether sent is not correct"
        );
        genesisAllowance[msg.sender] += _numberOfTokens;
        for (uint i; i < _numberOfTokens; i++) {
            _mint(msg.sender, supply + i);
        }
    }

    function publicMint(uint _numberOfTokens) external payable blockContracts {
        uint supply = totalSupply();
        require(
            publicSaleIsActive,
            "Public sale to mint uinverse is not active"
        );
        require(
            _numberOfTokens <= MAX_TOKEN_PER_TXN,
            "For public mint only 2 token per transaction are allowed"
        );
        require(
            publicAllowance[msg.sender] < MAX_TOKEN_PER_TXN,
            "You can only mint 2 max per wallet per address"
        );
        require(
            supply + _numberOfTokens < MAX_TOKENS,
            "Purchase would exceed max supply"
        );
        require(
            msg.value == TOKEN_PRICE * _numberOfTokens,
            "Ether sent is not correct"
        );
        publicAllowance[msg.sender] += _numberOfTokens;
        for (uint i; i < _numberOfTokens; i++) {
            _mint(msg.sender, supply + i);
        }
    }

    //tokenURI for nft
    function tokenURI(uint256 _tokenId) external view returns (string memory) {
        require(_exists(_tokenId), "Token does not exist");
        return string(abi.encodePacked(baseURI, Strings.toString(_tokenId)));
    }
}

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":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKEN_PER_TXN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipGenesisSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPublicSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhiteListSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"genesisAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisClaimMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"_numberOfFreeClaims","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"genesisFreeClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"genesisFreeClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"_numberOfFreeClaims","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"genesisMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"genesisSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAllowListSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGenesisSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfTokens","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setAllowListRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setGenesisRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"tokenId","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":"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":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600e556000600f553480156200001b57600080fd5b50604080518082018252601081526f4c756d696e616c20556e69766572736560801b60208083019182528351808501909452600f84526e4c554d494e414c554e49564552534560881b9084015281519192916200007b916000916200028c565b508051620000919060019060208401906200028c565b505050620000ae620000a86200012e60201b60201c565b62000132565b620000d97f3435f0bb641e0f7bce96bd6096693a5e349d7ed4f3afe056f686639b0ecdfbea62000184565b620001047ffe4954196fa78174190adcdc10c6d6bac285a4a4edefbd1823c878e174512264620001d8565b620001286040518060600160405280603681526020016200318b6036913962000228565b6200036f565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620001d35760405162461bcd60e51b815260206004820181905260248201526000805160206200316b83398151915260448201526064015b60405180910390fd5b600b55565b6005546001600160a01b03163314620002235760405162461bcd60e51b815260206004820181905260248201526000805160206200316b8339815191526044820152606401620001ca565b600c55565b6005546001600160a01b03163314620002735760405162461bcd60e51b815260206004820181905260248201526000805160206200316b8339815191526044820152606401620001ca565b8051620002889060069060208401906200028c565b5050565b8280546200029a9062000332565b90600052602060002090601f016020900481019282620002be576000855562000309565b82601f10620002d957805160ff191683800117855562000309565b8280016001018555821562000309579182015b8281111562000309578251825591602001919060010190620002ec565b50620003179291506200031b565b5090565b5b808211156200031757600081556001016200031c565b600181811c908216806200034757607f821691505b602082108114156200036957634e487b7160e01b600052602260045260246000fd5b50919050565b612dec806200037f6000396000f3fe6080604052600436106102935760003560e01c80636c0360eb1161015a578063b88d4fde116100c1578063d2d8cb671161007a578063d2d8cb6714610792578063e985e9c5146107ad578063ed62900f146107f6578063f2fde38b1461080c578063f41c01001461082c578063f47c84c51461083f57600080fd5b8063b88d4fde146106cf578063bdeb7a85146106ef578063c6210e551461070f578063c87b56dd1461073c578063ca406bee1461075c578063cf5a13f61461077c57600080fd5b80638da5cb5b116101135780638da5cb5b1461063257806395d89b41146106505780639fd2076e14610665578063a10866ef1461067b578063a22cb46514610690578063a51068a7146106b057600080fd5b80636c0360eb1461058557806370a082311461059a578063715018a6146105ba578063842b83fa146105cf5780638ba4cc3c146105e55780638d1e2f9d1461060557600080fd5b80632db11544116101fe5780634f6ccce7116101b75780634f6ccce7146104e557806355f804b314610505578063634da63a146105255780636352211e1461053a57806363ed880a1461055a578063662111ae1461056f57600080fd5b80632db115441461043d5780632f745c5914610450578063372f657c146104705780633ccfd60b146104835780634089c7781461049857806342842e0e146104c557600080fd5b80630fcf2e75116102505780630fcf2e751461038e57806310b5454d146103ae578063162c2e42146103c857806318160ddd146103e857806323b872dd14610407578063293108e01461042757600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063084ec67c14610327578063095ea7b3146103575780630acc857414610379575b600080fd5b3480156102a457600080fd5b506102b86102b33660046125dd565b610855565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e2610880565b6040516102c49190612659565b3480156102fb57600080fd5b5061030f61030a36600461266c565b610912565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b506102b86103423660046126a1565b60076020526000908152604090205460ff1681565b34801561036357600080fd5b506103776103723660046126bc565b61099f565b005b34801561038557600080fd5b50610377610ab5565b34801561039a57600080fd5b50600d546102b89062010000900460ff1681565b3480156103ba57600080fd5b50600d546102b89060ff1681565b3480156103d457600080fd5b506103776103e33660046127ad565b610af3565b3480156103f457600080fd5b506002545b6040519081526020016102c4565b34801561041357600080fd5b506103776104223660046127fd565b610d39565b34801561043357600080fd5b506103f9600b5481565b61037761044b36600461266c565b610d6a565b34801561045c57600080fd5b506103f961046b3660046126bc565b610fc8565b61037761047e366004612839565b61107b565b34801561048f57600080fd5b506103776112af565b3480156104a457600080fd5b506103f96104b33660046126a1565b60086020526000908152604090205481565b3480156104d157600080fd5b506103776104e03660046127fd565b6113b8565b3480156104f157600080fd5b506103f961050036600461266c565b6113d3565b34801561051157600080fd5b506103776105203660046128c6565b611440565b34801561053157600080fd5b506103f9600281565b34801561054657600080fd5b5061030f61055536600461266c565b61147d565b34801561056657600080fd5b50610377611509565b34801561057b57600080fd5b506103f9600c5481565b34801561059157600080fd5b506102e2611550565b3480156105a657600080fd5b506103f96105b53660046126a1565b6115de565b3480156105c657600080fd5b506103776116ac565b3480156105db57600080fd5b506103f96101bd81565b3480156105f157600080fd5b506103776106003660046126bc565b6116e2565b34801561061157600080fd5b506103f96106203660046126a1565b600a6020526000908152604090205481565b34801561063e57600080fd5b506005546001600160a01b031661030f565b34801561065c57600080fd5b506102e26117b5565b34801561067157600080fd5b506103f9600f5481565b34801561068757600080fd5b506103776117c4565b34801561069c57600080fd5b506103776106ab36600461290f565b61180d565b3480156106bc57600080fd5b50600d546102b890610100900460ff1681565b3480156106db57600080fd5b506103776106ea36600461294b565b6118d2565b3480156106fb57600080fd5b5061037761070a36600461266c565b611904565b34801561071b57600080fd5b506103f961072a3660046126a1565b60096020526000908152604090205481565b34801561074857600080fd5b506102e261075736600461266c565b611933565b34801561076857600080fd5b5061037761077736600461266c565b6119b3565b34801561078857600080fd5b506103f9600e5481565b34801561079e57600080fd5b506103f9668e1bc9bf04000081565b3480156107b957600080fd5b506102b86107c83660046129c7565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b34801561080257600080fd5b506103f96103e981565b34801561081857600080fd5b506103776108273660046126a1565b6119e2565b61037761083a3660046127ad565b611a7d565b34801561084b57600080fd5b506103f96105a581565b60006001600160e01b0319821663780e9d6360e01b148061087a575061087a82611cdf565b92915050565b60606000805461088f906129fa565b80601f01602080910402602001604051908101604052809291908181526020018280546108bb906129fa565b80156109085780601f106108dd57610100808354040283529160200191610908565b820191906000526020600020905b8154815290600101906020018083116108eb57829003601f168201915b5050505050905090565b600061091d82611d2f565b6109835760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b60006109aa8261147d565b9050806001600160a01b0316836001600160a01b03161415610a185760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161097a565b336001600160a01b0382161480610a345750610a3481336107c8565b610aa65760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161097a565b610ab08383611d79565b505050565b6005546001600160a01b03163314610adf5760405162461bcd60e51b815260040161097a90612a35565b600d805460ff19811660ff90911615179055565b323314610b125760405162461bcd60e51b815260040161097a90612a6a565b6000610b1d60025490565b600d5490915060ff16610b885760405162461bcd60e51b815260206004820152602d60248201527f467265652075696e766572736520636c61696d20666f722067656e657369732060448201526c6973206e6f742061637469766560981b606482015260840161097a565b610b9e610b953385611de7565b83600c54611e2e565b610bfd5760405162461bcd60e51b815260206004820152602a60248201527f596f7520617265206e6f7420616c6c6f77656420746f20636c61696d206672656044820152696520756e69766572736560b01b606482015260840161097a565b336000908152600860205260409020548390610c1a908690612ab7565b1115610c685760405162461bcd60e51b815260206004820152601760248201527f4578636565647320636c61696d20616c6c6f77616e6365000000000000000000604482015260640161097a565b6101bd84600f54610c799190612ab7565b10610cc65760405162461bcd60e51b815260206004820152601d60248201527f436c61696d20776f756c6420657863656564206d617820737570706c79000000604482015260640161097a565b83600f6000828254610cd89190612ab7565b90915550503360009081526008602052604081208054869290610cfc908490612ab7565b90915550600090505b84811015610d3257610d2033610d1b8385612ab7565b611e43565b80610d2a81612acf565b915050610d05565b5050505050565b610d433382611f6b565b610d5f5760405162461bcd60e51b815260040161097a90612aea565b610ab0838383612051565b323314610d895760405162461bcd60e51b815260040161097a90612a6a565b6000610d9460025490565b600d5490915062010000900460ff16610e025760405162461bcd60e51b815260206004820152602a60248201527f5075626c69632073616c6520746f206d696e742075696e7665727365206973206044820152696e6f742061637469766560b01b606482015260840161097a565b6002821115610e795760405162461bcd60e51b815260206004820152603860248201527f466f72207075626c6963206d696e74206f6e6c79203220746f6b656e2070657260448201527f207472616e73616374696f6e2061726520616c6c6f7765640000000000000000606482015260840161097a565b336000908152600a6020526040902054600211610eef5760405162461bcd60e51b815260206004820152602e60248201527f596f752063616e206f6e6c79206d696e742032206d6178207065722077616c6c60448201526d657420706572206164647265737360901b606482015260840161097a565b6105a5610efc8383612ab7565b10610f495760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c79604482015260640161097a565b610f5a82668e1bc9bf040000612b3b565b3414610f785760405162461bcd60e51b815260040161097a90612b5a565b336000908152600a602052604081208054849290610f97908490612ab7565b90915550600090505b82811015610ab057610fb633610d1b8385612ab7565b80610fc081612acf565b915050610fa0565b6000610fd3836115de565b8210610ff15760405162461bcd60e51b815260040161097a90612b91565b6000805b600254811015611062576002818154811061101257611012612bdc565b6000918252602090912001546001600160a01b0386811691161415611050578382141561104257915061087a9050565b8161104c81612acf565b9250505b8061105a81612acf565b915050610ff5565b5060405162461bcd60e51b815260040161097a90612b91565b32331461109a5760405162461bcd60e51b815260040161097a90612a6a565b60006110a560025490565b600d5490915060ff166110fa5760405162461bcd60e51b815260206004820152601c60248201527f57686974656c6973742073616c65206973206e6f742061637469766500000000604482015260640161097a565b604080513360601b6bffffffffffffffffffffffff1916602080830191909152825160148184030181526034909201909252805191012061113e9083600b54611e2e565b61118a5760405162461bcd60e51b815260206004820152601760248201527f596f7520617265206e6f742077686974656c6973746564000000000000000000604482015260640161097a565b3360009081526007602052604090205460ff16156111ea5760405162461bcd60e51b815260206004820152601c60248201527f596f752063616e206f6e6c79206d696e74206f6e6520666f7220574c00000000604482015260640161097a565b6103e9600e5460016111fc9190612ab7565b106112495760405162461bcd60e51b815260206004820152601860248201527f4578636565647320616c6c6f776c69737420737570706c790000000000000000604482015260640161097a565b668e1bc9bf040000341461126f5760405162461bcd60e51b815260040161097a90612b5a565b6001600e60008282546112829190612ab7565b9091555050336000818152600760205260409020805460ff191660011790556112ab9082611e43565b5050565b6005546001600160a01b031633146112d95760405162461bcd60e51b815260040161097a90612a35565b478061131e5760405162461bcd60e51b8152602060048201526014602482015273596f75722062616c616e6365206973207a65726f60601b604482015260640161097a565b6040513390600090829084908381818185875af1925050503d8060008114611362576040519150601f19603f3d011682016040523d82523d6000602084013e611367565b606091505b5050905080610ab05760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f2073656e6420746f204f776e6572000000000000000000604482015260640161097a565b610ab0838383604051806020016040528060008152506118d2565b600254600090821061143c5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161097a565b5090565b6005546001600160a01b0316331461146a5760405162461bcd60e51b815260040161097a90612a35565b80516112ab906006906020840190612537565b6000806002838154811061149357611493612bdc565b6000918252602090912001546001600160a01b031690508061087a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161097a565b6005546001600160a01b031633146115335760405162461bcd60e51b815260040161097a90612a35565b600d805461ff001981166101009182900460ff1615909102179055565b6006805461155d906129fa565b80601f0160208091040260200160405190810160405280929190818152602001828054611589906129fa565b80156115d65780601f106115ab576101008083540402835291602001916115d6565b820191906000526020600020905b8154815290600101906020018083116115b957829003601f168201915b505050505081565b60006001600160a01b0382166116495760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161097a565b6000805b6002548110156116a5576002818154811061166a5761166a612bdc565b6000918252602090912001546001600160a01b03858116911614156116955761169282612acf565b91505b61169e81612acf565b905061164d565b5092915050565b6005546001600160a01b031633146116d65760405162461bcd60e51b815260040161097a90612a35565b6116e060006121a7565b565b6005546001600160a01b0316331461170c5760405162461bcd60e51b815260040161097a90612a35565b600061171760025490565b90506105a56117268383612ab7565b1061177f5760405162461bcd60e51b8152602060048201526024808201527f507572636861736520776f756c642065786365656420746865206d617820737560448201526370706c7960e01b606482015260840161097a565b60005b828110156117af5761179d846117988385612ab7565b6121f9565b806117a781612acf565b915050611782565b50505050565b60606001805461088f906129fa565b6005546001600160a01b031633146117ee5760405162461bcd60e51b815260040161097a90612a35565b600d805462ff0000198116620100009182900460ff1615909102179055565b6001600160a01b0382163314156118665760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161097a565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6118dc3383611f6b565b6118f85760405162461bcd60e51b815260040161097a90612aea565b6117af84848484612213565b6005546001600160a01b0316331461192e5760405162461bcd60e51b815260040161097a90612a35565b600b55565b606061193e82611d2f565b6119815760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015260640161097a565b600661198c83612246565b60405160200161199d929190612c0e565b6040516020818303038152906040529050919050565b6005546001600160a01b031633146119dd5760405162461bcd60e51b815260040161097a90612a35565b600c55565b6005546001600160a01b03163314611a0c5760405162461bcd60e51b815260040161097a90612a35565b6001600160a01b038116611a715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161097a565b611a7a816121a7565b50565b323314611a9c5760405162461bcd60e51b815260040161097a90612a6a565b6000611aa760025490565b600d54909150610100900460ff16611b155760405162461bcd60e51b815260206004820152602b60248201527f47656e657369732073616c6520746f206d696e7420756e69766572736520697360448201526a206e6f742061637469766560a81b606482015260840161097a565b611b22610b953385611de7565b611b7e5760405162461bcd60e51b815260206004820152602760248201527f596f7520617265206e6f7420616c6c6f77656420746f206d696e7420666f722060448201526629ba30b3b2901960c91b606482015260840161097a565b33600090815260096020526040902054600290611b9c908690612ab7565b1115611c065760405162461bcd60e51b815260206004820152603360248201527f47656e6573697320686f6c6465722063616e206f6e6c79206d696e74203220556044820152726e69766572736520706572206164647265737360681b606482015260840161097a565b6105a5611c138583612ab7565b10611c605760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c79604482015260640161097a565b611c7184668e1bc9bf040000612b3b565b3414611c8f5760405162461bcd60e51b815260040161097a90612b5a565b3360009081526009602052604081208054869290611cae908490612ab7565b90915550600090505b84811015610d3257611ccd33610d1b8385612ab7565b80611cd781612acf565b915050611cb7565b60006001600160e01b031982166380ac58cd60e01b1480611d1057506001600160e01b03198216635b5e139f60e01b145b8061087a57506301ffc9a760e01b6001600160e01b031983161461087a565b6002546000908210801561087a575060006001600160a01b031660028381548110611d5c57611d5c612bdc565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611dae8261147d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b6000611e3b838386612344565b949350505050565b6001600160a01b038216611e995760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161097a565b611ea281611d2f565b15611eef5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161097a565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000611f7682611d2f565b611fd75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161097a565b6000611fe28361147d565b9050806001600160a01b0316846001600160a01b0316148061201d5750836001600160a01b031661201284610912565b6001600160a01b0316145b80611e3b57506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff16611e3b565b826001600160a01b03166120648261147d565b6001600160a01b0316146120cc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161097a565b6001600160a01b03821661212e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161097a565b612139600082611d79565b816002828154811061214d5761214d612bdc565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6112ab82826040518060200160405280600081525061235a565b61221e848484612051565b61222a8484848461238d565b6117af5760405162461bcd60e51b815260040161097a90612cb5565b60608161226a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612294578061227e81612acf565b915061228d9050600a83612d1d565b915061226e565b60008167ffffffffffffffff8111156122af576122af6126e6565b6040519080825280601f01601f1916602001820160405280156122d9576020820181803683370190505b5090505b8415611e3b576122ee600183612d31565b91506122fb600a86612d48565b612306906030612ab7565b60f81b81838151811061231b5761231b612bdc565b60200101906001600160f81b031916908160001a90535061233d600a86612d1d565b94506122dd565b600082612351858461248b565b14949350505050565b6123648383611e43565b612371600084848461238d565b610ab05760405162461bcd60e51b815260040161097a90612cb5565b60006001600160a01b0384163b1561248057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123d1903390899088908890600401612d5c565b6020604051808303816000875af192505050801561240c575060408051601f3d908101601f1916820190925261240991810190612d99565b60015b612466573d80801561243a576040519150601f19603f3d011682016040523d82523d6000602084013e61243f565b606091505b50805161245e5760405162461bcd60e51b815260040161097a90612cb5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e3b565b506001949350505050565b600081815b845181101561252f5760008582815181106124ad576124ad612bdc565b602002602001015190508083116124ef57604080516020810185905290810182905260600160405160208183030381529060405280519060200120925061251c565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061252781612acf565b915050612490565b509392505050565b828054612543906129fa565b90600052602060002090601f01602090048101928261256557600085556125ab565b82601f1061257e57805160ff19168380011785556125ab565b828001600101855582156125ab579182015b828111156125ab578251825591602001919060010190612590565b5061143c9291505b8082111561143c57600081556001016125b3565b6001600160e01b031981168114611a7a57600080fd5b6000602082840312156125ef57600080fd5b81356125fa816125c7565b9392505050565b60005b8381101561261c578181015183820152602001612604565b838111156117af5750506000910152565b60008151808452612645816020860160208601612601565b601f01601f19169290920160200192915050565b6020815260006125fa602083018461262d565b60006020828403121561267e57600080fd5b5035919050565b80356001600160a01b038116811461269c57600080fd5b919050565b6000602082840312156126b357600080fd5b6125fa82612685565b600080604083850312156126cf57600080fd5b6126d883612685565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612725576127256126e6565b604052919050565b600082601f83011261273e57600080fd5b8135602067ffffffffffffffff82111561275a5761275a6126e6565b8160051b6127698282016126fc565b928352848101820192828101908785111561278357600080fd5b83870192505b848310156127a257823582529183019190830190612789565b979650505050505050565b6000806000606084860312156127c257600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156127e757600080fd5b6127f38682870161272d565b9150509250925092565b60008060006060848603121561281257600080fd5b61281b84612685565b925061282960208501612685565b9150604084013590509250925092565b60006020828403121561284b57600080fd5b813567ffffffffffffffff81111561286257600080fd5b611e3b8482850161272d565b600067ffffffffffffffff831115612888576128886126e6565b61289b601f8401601f19166020016126fc565b90508281528383830111156128af57600080fd5b828260208301376000602084830101529392505050565b6000602082840312156128d857600080fd5b813567ffffffffffffffff8111156128ef57600080fd5b8201601f8101841361290057600080fd5b611e3b8482356020840161286e565b6000806040838503121561292257600080fd5b61292b83612685565b91506020830135801515811461294057600080fd5b809150509250929050565b6000806000806080858703121561296157600080fd5b61296a85612685565b935061297860208601612685565b925060408501359150606085013567ffffffffffffffff81111561299b57600080fd5b8501601f810187136129ac57600080fd5b6129bb8782356020840161286e565b91505092959194509250565b600080604083850312156129da57600080fd5b6129e383612685565b91506129f160208401612685565b90509250929050565b600181811c90821680612a0e57607f821691505b60208210811415612a2f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601e908201527f4e6f20736d61727420636f6e7472616374732061726520616c6c6f7765640000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612aca57612aca612aa1565b500190565b6000600019821415612ae357612ae3612aa1565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000816000190483118215151615612b5557612b55612aa1565b500290565b60208082526019908201527f45746865722073656e74206973206e6f7420636f727265637400000000000000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60008151612c04818560208601612601565b9290920192915050565b600080845481600182811c915080831680612c2a57607f831692505b6020808410821415612c4a57634e487b7160e01b86526022600452602486fd5b818015612c5e5760018114612c6f57612c9c565b60ff19861689528489019650612c9c565b60008b81526020902060005b86811015612c945781548b820152908501908301612c7b565b505084890196505b505050505050612cac8185612bf2565b95945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612d2c57612d2c612d07565b500490565b600082821015612d4357612d43612aa1565b500390565b600082612d5757612d57612d07565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d8f9083018461262d565b9695505050505050565b600060208284031215612dab57600080fd5b81516125fa816125c756fea264697066735822122020b0e994b7a562204581b33a6dbedd27a9cfac74fd4abcae33a6f2741ea2411564736f6c634300080b00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572697066733a2f2f516d665974753541535a6e6659646768694a547159594e336d61435670754a5072764a52486275335a626b765a4c2f

Deployed Bytecode

0x6080604052600436106102935760003560e01c80636c0360eb1161015a578063b88d4fde116100c1578063d2d8cb671161007a578063d2d8cb6714610792578063e985e9c5146107ad578063ed62900f146107f6578063f2fde38b1461080c578063f41c01001461082c578063f47c84c51461083f57600080fd5b8063b88d4fde146106cf578063bdeb7a85146106ef578063c6210e551461070f578063c87b56dd1461073c578063ca406bee1461075c578063cf5a13f61461077c57600080fd5b80638da5cb5b116101135780638da5cb5b1461063257806395d89b41146106505780639fd2076e14610665578063a10866ef1461067b578063a22cb46514610690578063a51068a7146106b057600080fd5b80636c0360eb1461058557806370a082311461059a578063715018a6146105ba578063842b83fa146105cf5780638ba4cc3c146105e55780638d1e2f9d1461060557600080fd5b80632db11544116101fe5780634f6ccce7116101b75780634f6ccce7146104e557806355f804b314610505578063634da63a146105255780636352211e1461053a57806363ed880a1461055a578063662111ae1461056f57600080fd5b80632db115441461043d5780632f745c5914610450578063372f657c146104705780633ccfd60b146104835780634089c7781461049857806342842e0e146104c557600080fd5b80630fcf2e75116102505780630fcf2e751461038e57806310b5454d146103ae578063162c2e42146103c857806318160ddd146103e857806323b872dd14610407578063293108e01461042757600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063084ec67c14610327578063095ea7b3146103575780630acc857414610379575b600080fd5b3480156102a457600080fd5b506102b86102b33660046125dd565b610855565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e2610880565b6040516102c49190612659565b3480156102fb57600080fd5b5061030f61030a36600461266c565b610912565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b506102b86103423660046126a1565b60076020526000908152604090205460ff1681565b34801561036357600080fd5b506103776103723660046126bc565b61099f565b005b34801561038557600080fd5b50610377610ab5565b34801561039a57600080fd5b50600d546102b89062010000900460ff1681565b3480156103ba57600080fd5b50600d546102b89060ff1681565b3480156103d457600080fd5b506103776103e33660046127ad565b610af3565b3480156103f457600080fd5b506002545b6040519081526020016102c4565b34801561041357600080fd5b506103776104223660046127fd565b610d39565b34801561043357600080fd5b506103f9600b5481565b61037761044b36600461266c565b610d6a565b34801561045c57600080fd5b506103f961046b3660046126bc565b610fc8565b61037761047e366004612839565b61107b565b34801561048f57600080fd5b506103776112af565b3480156104a457600080fd5b506103f96104b33660046126a1565b60086020526000908152604090205481565b3480156104d157600080fd5b506103776104e03660046127fd565b6113b8565b3480156104f157600080fd5b506103f961050036600461266c565b6113d3565b34801561051157600080fd5b506103776105203660046128c6565b611440565b34801561053157600080fd5b506103f9600281565b34801561054657600080fd5b5061030f61055536600461266c565b61147d565b34801561056657600080fd5b50610377611509565b34801561057b57600080fd5b506103f9600c5481565b34801561059157600080fd5b506102e2611550565b3480156105a657600080fd5b506103f96105b53660046126a1565b6115de565b3480156105c657600080fd5b506103776116ac565b3480156105db57600080fd5b506103f96101bd81565b3480156105f157600080fd5b506103776106003660046126bc565b6116e2565b34801561061157600080fd5b506103f96106203660046126a1565b600a6020526000908152604090205481565b34801561063e57600080fd5b506005546001600160a01b031661030f565b34801561065c57600080fd5b506102e26117b5565b34801561067157600080fd5b506103f9600f5481565b34801561068757600080fd5b506103776117c4565b34801561069c57600080fd5b506103776106ab36600461290f565b61180d565b3480156106bc57600080fd5b50600d546102b890610100900460ff1681565b3480156106db57600080fd5b506103776106ea36600461294b565b6118d2565b3480156106fb57600080fd5b5061037761070a36600461266c565b611904565b34801561071b57600080fd5b506103f961072a3660046126a1565b60096020526000908152604090205481565b34801561074857600080fd5b506102e261075736600461266c565b611933565b34801561076857600080fd5b5061037761077736600461266c565b6119b3565b34801561078857600080fd5b506103f9600e5481565b34801561079e57600080fd5b506103f9668e1bc9bf04000081565b3480156107b957600080fd5b506102b86107c83660046129c7565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b34801561080257600080fd5b506103f96103e981565b34801561081857600080fd5b506103776108273660046126a1565b6119e2565b61037761083a3660046127ad565b611a7d565b34801561084b57600080fd5b506103f96105a581565b60006001600160e01b0319821663780e9d6360e01b148061087a575061087a82611cdf565b92915050565b60606000805461088f906129fa565b80601f01602080910402602001604051908101604052809291908181526020018280546108bb906129fa565b80156109085780601f106108dd57610100808354040283529160200191610908565b820191906000526020600020905b8154815290600101906020018083116108eb57829003601f168201915b5050505050905090565b600061091d82611d2f565b6109835760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b60006109aa8261147d565b9050806001600160a01b0316836001600160a01b03161415610a185760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161097a565b336001600160a01b0382161480610a345750610a3481336107c8565b610aa65760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161097a565b610ab08383611d79565b505050565b6005546001600160a01b03163314610adf5760405162461bcd60e51b815260040161097a90612a35565b600d805460ff19811660ff90911615179055565b323314610b125760405162461bcd60e51b815260040161097a90612a6a565b6000610b1d60025490565b600d5490915060ff16610b885760405162461bcd60e51b815260206004820152602d60248201527f467265652075696e766572736520636c61696d20666f722067656e657369732060448201526c6973206e6f742061637469766560981b606482015260840161097a565b610b9e610b953385611de7565b83600c54611e2e565b610bfd5760405162461bcd60e51b815260206004820152602a60248201527f596f7520617265206e6f7420616c6c6f77656420746f20636c61696d206672656044820152696520756e69766572736560b01b606482015260840161097a565b336000908152600860205260409020548390610c1a908690612ab7565b1115610c685760405162461bcd60e51b815260206004820152601760248201527f4578636565647320636c61696d20616c6c6f77616e6365000000000000000000604482015260640161097a565b6101bd84600f54610c799190612ab7565b10610cc65760405162461bcd60e51b815260206004820152601d60248201527f436c61696d20776f756c6420657863656564206d617820737570706c79000000604482015260640161097a565b83600f6000828254610cd89190612ab7565b90915550503360009081526008602052604081208054869290610cfc908490612ab7565b90915550600090505b84811015610d3257610d2033610d1b8385612ab7565b611e43565b80610d2a81612acf565b915050610d05565b5050505050565b610d433382611f6b565b610d5f5760405162461bcd60e51b815260040161097a90612aea565b610ab0838383612051565b323314610d895760405162461bcd60e51b815260040161097a90612a6a565b6000610d9460025490565b600d5490915062010000900460ff16610e025760405162461bcd60e51b815260206004820152602a60248201527f5075626c69632073616c6520746f206d696e742075696e7665727365206973206044820152696e6f742061637469766560b01b606482015260840161097a565b6002821115610e795760405162461bcd60e51b815260206004820152603860248201527f466f72207075626c6963206d696e74206f6e6c79203220746f6b656e2070657260448201527f207472616e73616374696f6e2061726520616c6c6f7765640000000000000000606482015260840161097a565b336000908152600a6020526040902054600211610eef5760405162461bcd60e51b815260206004820152602e60248201527f596f752063616e206f6e6c79206d696e742032206d6178207065722077616c6c60448201526d657420706572206164647265737360901b606482015260840161097a565b6105a5610efc8383612ab7565b10610f495760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c79604482015260640161097a565b610f5a82668e1bc9bf040000612b3b565b3414610f785760405162461bcd60e51b815260040161097a90612b5a565b336000908152600a602052604081208054849290610f97908490612ab7565b90915550600090505b82811015610ab057610fb633610d1b8385612ab7565b80610fc081612acf565b915050610fa0565b6000610fd3836115de565b8210610ff15760405162461bcd60e51b815260040161097a90612b91565b6000805b600254811015611062576002818154811061101257611012612bdc565b6000918252602090912001546001600160a01b0386811691161415611050578382141561104257915061087a9050565b8161104c81612acf565b9250505b8061105a81612acf565b915050610ff5565b5060405162461bcd60e51b815260040161097a90612b91565b32331461109a5760405162461bcd60e51b815260040161097a90612a6a565b60006110a560025490565b600d5490915060ff166110fa5760405162461bcd60e51b815260206004820152601c60248201527f57686974656c6973742073616c65206973206e6f742061637469766500000000604482015260640161097a565b604080513360601b6bffffffffffffffffffffffff1916602080830191909152825160148184030181526034909201909252805191012061113e9083600b54611e2e565b61118a5760405162461bcd60e51b815260206004820152601760248201527f596f7520617265206e6f742077686974656c6973746564000000000000000000604482015260640161097a565b3360009081526007602052604090205460ff16156111ea5760405162461bcd60e51b815260206004820152601c60248201527f596f752063616e206f6e6c79206d696e74206f6e6520666f7220574c00000000604482015260640161097a565b6103e9600e5460016111fc9190612ab7565b106112495760405162461bcd60e51b815260206004820152601860248201527f4578636565647320616c6c6f776c69737420737570706c790000000000000000604482015260640161097a565b668e1bc9bf040000341461126f5760405162461bcd60e51b815260040161097a90612b5a565b6001600e60008282546112829190612ab7565b9091555050336000818152600760205260409020805460ff191660011790556112ab9082611e43565b5050565b6005546001600160a01b031633146112d95760405162461bcd60e51b815260040161097a90612a35565b478061131e5760405162461bcd60e51b8152602060048201526014602482015273596f75722062616c616e6365206973207a65726f60601b604482015260640161097a565b6040513390600090829084908381818185875af1925050503d8060008114611362576040519150601f19603f3d011682016040523d82523d6000602084013e611367565b606091505b5050905080610ab05760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f2073656e6420746f204f776e6572000000000000000000604482015260640161097a565b610ab0838383604051806020016040528060008152506118d2565b600254600090821061143c5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161097a565b5090565b6005546001600160a01b0316331461146a5760405162461bcd60e51b815260040161097a90612a35565b80516112ab906006906020840190612537565b6000806002838154811061149357611493612bdc565b6000918252602090912001546001600160a01b031690508061087a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161097a565b6005546001600160a01b031633146115335760405162461bcd60e51b815260040161097a90612a35565b600d805461ff001981166101009182900460ff1615909102179055565b6006805461155d906129fa565b80601f0160208091040260200160405190810160405280929190818152602001828054611589906129fa565b80156115d65780601f106115ab576101008083540402835291602001916115d6565b820191906000526020600020905b8154815290600101906020018083116115b957829003601f168201915b505050505081565b60006001600160a01b0382166116495760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161097a565b6000805b6002548110156116a5576002818154811061166a5761166a612bdc565b6000918252602090912001546001600160a01b03858116911614156116955761169282612acf565b91505b61169e81612acf565b905061164d565b5092915050565b6005546001600160a01b031633146116d65760405162461bcd60e51b815260040161097a90612a35565b6116e060006121a7565b565b6005546001600160a01b0316331461170c5760405162461bcd60e51b815260040161097a90612a35565b600061171760025490565b90506105a56117268383612ab7565b1061177f5760405162461bcd60e51b8152602060048201526024808201527f507572636861736520776f756c642065786365656420746865206d617820737560448201526370706c7960e01b606482015260840161097a565b60005b828110156117af5761179d846117988385612ab7565b6121f9565b806117a781612acf565b915050611782565b50505050565b60606001805461088f906129fa565b6005546001600160a01b031633146117ee5760405162461bcd60e51b815260040161097a90612a35565b600d805462ff0000198116620100009182900460ff1615909102179055565b6001600160a01b0382163314156118665760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161097a565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6118dc3383611f6b565b6118f85760405162461bcd60e51b815260040161097a90612aea565b6117af84848484612213565b6005546001600160a01b0316331461192e5760405162461bcd60e51b815260040161097a90612a35565b600b55565b606061193e82611d2f565b6119815760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015260640161097a565b600661198c83612246565b60405160200161199d929190612c0e565b6040516020818303038152906040529050919050565b6005546001600160a01b031633146119dd5760405162461bcd60e51b815260040161097a90612a35565b600c55565b6005546001600160a01b03163314611a0c5760405162461bcd60e51b815260040161097a90612a35565b6001600160a01b038116611a715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161097a565b611a7a816121a7565b50565b323314611a9c5760405162461bcd60e51b815260040161097a90612a6a565b6000611aa760025490565b600d54909150610100900460ff16611b155760405162461bcd60e51b815260206004820152602b60248201527f47656e657369732073616c6520746f206d696e7420756e69766572736520697360448201526a206e6f742061637469766560a81b606482015260840161097a565b611b22610b953385611de7565b611b7e5760405162461bcd60e51b815260206004820152602760248201527f596f7520617265206e6f7420616c6c6f77656420746f206d696e7420666f722060448201526629ba30b3b2901960c91b606482015260840161097a565b33600090815260096020526040902054600290611b9c908690612ab7565b1115611c065760405162461bcd60e51b815260206004820152603360248201527f47656e6573697320686f6c6465722063616e206f6e6c79206d696e74203220556044820152726e69766572736520706572206164647265737360681b606482015260840161097a565b6105a5611c138583612ab7565b10611c605760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c79604482015260640161097a565b611c7184668e1bc9bf040000612b3b565b3414611c8f5760405162461bcd60e51b815260040161097a90612b5a565b3360009081526009602052604081208054869290611cae908490612ab7565b90915550600090505b84811015610d3257611ccd33610d1b8385612ab7565b80611cd781612acf565b915050611cb7565b60006001600160e01b031982166380ac58cd60e01b1480611d1057506001600160e01b03198216635b5e139f60e01b145b8061087a57506301ffc9a760e01b6001600160e01b031983161461087a565b6002546000908210801561087a575060006001600160a01b031660028381548110611d5c57611d5c612bdc565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611dae8261147d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b6000611e3b838386612344565b949350505050565b6001600160a01b038216611e995760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161097a565b611ea281611d2f565b15611eef5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161097a565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000611f7682611d2f565b611fd75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161097a565b6000611fe28361147d565b9050806001600160a01b0316846001600160a01b0316148061201d5750836001600160a01b031661201284610912565b6001600160a01b0316145b80611e3b57506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff16611e3b565b826001600160a01b03166120648261147d565b6001600160a01b0316146120cc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161097a565b6001600160a01b03821661212e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161097a565b612139600082611d79565b816002828154811061214d5761214d612bdc565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6112ab82826040518060200160405280600081525061235a565b61221e848484612051565b61222a8484848461238d565b6117af5760405162461bcd60e51b815260040161097a90612cb5565b60608161226a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612294578061227e81612acf565b915061228d9050600a83612d1d565b915061226e565b60008167ffffffffffffffff8111156122af576122af6126e6565b6040519080825280601f01601f1916602001820160405280156122d9576020820181803683370190505b5090505b8415611e3b576122ee600183612d31565b91506122fb600a86612d48565b612306906030612ab7565b60f81b81838151811061231b5761231b612bdc565b60200101906001600160f81b031916908160001a90535061233d600a86612d1d565b94506122dd565b600082612351858461248b565b14949350505050565b6123648383611e43565b612371600084848461238d565b610ab05760405162461bcd60e51b815260040161097a90612cb5565b60006001600160a01b0384163b1561248057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123d1903390899088908890600401612d5c565b6020604051808303816000875af192505050801561240c575060408051601f3d908101601f1916820190925261240991810190612d99565b60015b612466573d80801561243a576040519150601f19603f3d011682016040523d82523d6000602084013e61243f565b606091505b50805161245e5760405162461bcd60e51b815260040161097a90612cb5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e3b565b506001949350505050565b600081815b845181101561252f5760008582815181106124ad576124ad612bdc565b602002602001015190508083116124ef57604080516020810185905290810182905260600160405160208183030381529060405280519060200120925061251c565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061252781612acf565b915050612490565b509392505050565b828054612543906129fa565b90600052602060002090601f01602090048101928261256557600085556125ab565b82601f1061257e57805160ff19168380011785556125ab565b828001600101855582156125ab579182015b828111156125ab578251825591602001919060010190612590565b5061143c9291505b8082111561143c57600081556001016125b3565b6001600160e01b031981168114611a7a57600080fd5b6000602082840312156125ef57600080fd5b81356125fa816125c7565b9392505050565b60005b8381101561261c578181015183820152602001612604565b838111156117af5750506000910152565b60008151808452612645816020860160208601612601565b601f01601f19169290920160200192915050565b6020815260006125fa602083018461262d565b60006020828403121561267e57600080fd5b5035919050565b80356001600160a01b038116811461269c57600080fd5b919050565b6000602082840312156126b357600080fd5b6125fa82612685565b600080604083850312156126cf57600080fd5b6126d883612685565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612725576127256126e6565b604052919050565b600082601f83011261273e57600080fd5b8135602067ffffffffffffffff82111561275a5761275a6126e6565b8160051b6127698282016126fc565b928352848101820192828101908785111561278357600080fd5b83870192505b848310156127a257823582529183019190830190612789565b979650505050505050565b6000806000606084860312156127c257600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156127e757600080fd5b6127f38682870161272d565b9150509250925092565b60008060006060848603121561281257600080fd5b61281b84612685565b925061282960208501612685565b9150604084013590509250925092565b60006020828403121561284b57600080fd5b813567ffffffffffffffff81111561286257600080fd5b611e3b8482850161272d565b600067ffffffffffffffff831115612888576128886126e6565b61289b601f8401601f19166020016126fc565b90508281528383830111156128af57600080fd5b828260208301376000602084830101529392505050565b6000602082840312156128d857600080fd5b813567ffffffffffffffff8111156128ef57600080fd5b8201601f8101841361290057600080fd5b611e3b8482356020840161286e565b6000806040838503121561292257600080fd5b61292b83612685565b91506020830135801515811461294057600080fd5b809150509250929050565b6000806000806080858703121561296157600080fd5b61296a85612685565b935061297860208601612685565b925060408501359150606085013567ffffffffffffffff81111561299b57600080fd5b8501601f810187136129ac57600080fd5b6129bb8782356020840161286e565b91505092959194509250565b600080604083850312156129da57600080fd5b6129e383612685565b91506129f160208401612685565b90509250929050565b600181811c90821680612a0e57607f821691505b60208210811415612a2f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601e908201527f4e6f20736d61727420636f6e7472616374732061726520616c6c6f7765640000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612aca57612aca612aa1565b500190565b6000600019821415612ae357612ae3612aa1565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000816000190483118215151615612b5557612b55612aa1565b500290565b60208082526019908201527f45746865722073656e74206973206e6f7420636f727265637400000000000000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60008151612c04818560208601612601565b9290920192915050565b600080845481600182811c915080831680612c2a57607f831692505b6020808410821415612c4a57634e487b7160e01b86526022600452602486fd5b818015612c5e5760018114612c6f57612c9c565b60ff19861689528489019650612c9c565b60008b81526020902060005b86811015612c945781548b820152908501908301612c7b565b505084890196505b505050505050612cac8185612bf2565b95945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612d2c57612d2c612d07565b500490565b600082821015612d4357612d43612aa1565b500390565b600082612d5757612d57612d07565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d8f9083018461262d565b9695505050505050565b600060208284031215612dab57600080fd5b81516125fa816125c756fea264697066735822122020b0e994b7a562204581b33a6dbedd27a9cfac74fd4abcae33a6f2741ea2411564736f6c634300080b0033

Deployed Bytecode Sourcemap

32465:8053:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26148:300;;;;;;;;;;-1:-1:-1;26148:300:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;26148:300:0;;;;;;;;14767:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;15579:308::-;;;;;;;;;;-1:-1:-1;15579:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;15579:308:0;1550:203:1;32594:50:0;;;;;;;;;;-1:-1:-1;32594:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;15102:411;;;;;;;;;;-1:-1:-1;15102:411:0;;;;;:::i;:::-;;:::i;:::-;;34417:118;;;;;;;;;;;;;:::i;32988:30::-;;;;;;;;;;-1:-1:-1;32988:30:0;;;;;;;;;;;32910:33;;;;;;;;;;-1:-1:-1;32910:33:0;;;;;;;;36991:1110;;;;;;;;;;-1:-1:-1;36991:1110:0;;;;;:::i;:::-;;:::i;26524:110::-;;;;;;;;;;-1:-1:-1;26612:7:0;:14;26524:110;;;4150:25:1;;;4138:2;4123:18;26524:110:0;4004:177:1;16638:376:0;;;;;;;;;;-1:-1:-1;16638:376:0;;;;;:::i;:::-;;:::i;32828:34::-;;;;;;;;;;;;;;;;39293:968;;;;;;:::i;:::-;;:::i;27087:582::-;;;;;;;;;;-1:-1:-1;27087:582:0;;;;;:::i;:::-;;:::i;36208:775::-;;;;;;:::i;:::-;;:::i;33928:332::-;;;;;;;;;;;;;:::i;32651:53::-;;;;;;;;;;-1:-1:-1;32651:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;17085:185;;;;;;;;;;-1:-1:-1;17085:185:0;;;;;:::i;:::-;;:::i;26711:292::-;;;;;;;;;;-1:-1:-1;26711:292:0;;;;;:::i;:::-;;:::i;34286:98::-;;;;;;;;;;-1:-1:-1;34286:98:0;;;;;:::i;:::-;;:::i;33072:42::-;;;;;;;;;;;;33113:1;33072:42;;14374:326;;;;;;;;;;-1:-1:-1;14374:326:0;;;;;:::i;:::-;;:::i;34566:112::-;;;;;;;;;;;;;:::i;32869:32::-;;;;;;;;;;;;;;;;32564:21;;;;;;;;;;;;;:::i;13901:411::-;;;;;;;;;;-1:-1:-1;13901:411:0;;;;;:::i;:::-;;:::i;29355:103::-;;;;;;;;;;;;;:::i;33228:43::-;;;;;;;;;;;;33268:3;33228:43;;35820:359;;;;;;;;;;-1:-1:-1;35820:359:0;;;;;:::i;:::-;;:::i;32769:50::-;;;;;;;;;;-1:-1:-1;32769:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;28704:87;;;;;;;;;;-1:-1:-1;28777:6:0;;-1:-1:-1;;;;;28777:6:0;28704:87;;14936:104;;;;;;;;;;;;;:::i;33316:34::-;;;;;;;;;;;;;;;;34708:109;;;;;;;;;;;;;:::i;15959:327::-;;;;;;;;;;-1:-1:-1;15959:327:0;;;;;:::i;:::-;;:::i;32950:31::-;;;;;;;;;;-1:-1:-1;32950:31:0;;;;;;;;;;;17341:365;;;;;;;;;;-1:-1:-1;17341:365:0;;;;;:::i;:::-;;:::i;34863:104::-;;;;;;;;;;-1:-1:-1;34863:104:0;;;;;:::i;:::-;;:::i;32711:51::-;;;;;;;;;;-1:-1:-1;32711:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;40293:222;;;;;;;;;;-1:-1:-1;40293:222:0;;;;;:::i;:::-;;:::i;35016:100::-;;;;;;;;;;-1:-1:-1;35016:100:0;;;;;:::i;:::-;;:::i;33278:31::-;;;;;;;;;;;;;;;;33121:45;;;;;;;;;;;;33156:10;33121:45;;16357:214;;;;;;;;;;-1:-1:-1;16357:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;16528:25:0;;;16499:4;16528:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;16357:214;33175:46;;;;;;;;;;;;33217:4;33175:46;;29613:238;;;;;;;;;;-1:-1:-1;29613:238:0;;;;;:::i;:::-;;:::i;38109:1176::-;;;;;;:::i;:::-;;:::i;33027:38::-;;;;;;;;;;;;33061:4;33027:38;;26148:300;26295:4;-1:-1:-1;;;;;;26337:50:0;;-1:-1:-1;;;26337:50:0;;:103;;;26404:36;26428:11;26404:23;:36::i;:::-;26317:123;26148:300;-1:-1:-1;;26148:300:0:o;14767:100::-;14821:13;14854:5;14847:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14767:100;:::o;15579:308::-;15700:7;15747:16;15755:7;15747;:16::i;:::-;15725:110;;;;-1:-1:-1;;;15725:110:0;;7983:2:1;15725:110:0;;;7965:21:1;8022:2;8002:18;;;7995:30;8061:34;8041:18;;;8034:62;-1:-1:-1;;;8112:18:1;;;8105:42;8164:19;;15725:110:0;;;;;;;;;-1:-1:-1;15855:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;15855:24:0;;15579:308::o;15102:411::-;15183:13;15199:23;15214:7;15199:14;:23::i;:::-;15183:39;;15247:5;-1:-1:-1;;;;;15241:11:0;:2;-1:-1:-1;;;;;15241:11:0;;;15233:57;;;;-1:-1:-1;;;15233:57:0;;8396:2:1;15233:57:0;;;8378:21:1;8435:2;8415:18;;;8408:30;8474:34;8454:18;;;8447:62;-1:-1:-1;;;8525:18:1;;;8518:31;8566:19;;15233:57:0;8194:397:1;15233:57:0;738:10;-1:-1:-1;;;;;15325:21:0;;;;:62;;-1:-1:-1;15350:37:0;15367:5;738:10;16357:214;:::i;15350:37::-;15303:168;;;;-1:-1:-1;;;15303:168:0;;8798:2:1;15303:168:0;;;8780:21:1;8837:2;8817:18;;;8810:30;8876:34;8856:18;;;8849:62;8947:26;8927:18;;;8920:54;8991:19;;15303:168:0;8596:420:1;15303:168:0;15484:21;15493:2;15497:7;15484:8;:21::i;:::-;15172:341;15102:411;;:::o;34417:118::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;34506:21:::1;::::0;;-1:-1:-1;;34481:46:0;::::1;34506:21;::::0;;::::1;34505:22;34481:46;::::0;;34417:118::o;36991:1110::-;33404:9;33417:10;33404:23;33396:66;;;;-1:-1:-1;;;33396:66:0;;;;;;;:::i;:::-;37159:11:::1;37173:13;26612:7:::0;:14;;26524:110;37173:13:::1;37219:21;::::0;37159:27;;-1:-1:-1;37219:21:0::1;;37197:116;;;::::0;-1:-1:-1;;;37197:116:0;;9943:2:1;37197:116:0::1;::::0;::::1;9925:21:1::0;9982:2;9962:18;;;9955:30;10021:34;10001:18;;;9994:62;-1:-1:-1;;;10072:18:1;;;10065:43;10125:19;;37197:116:0::1;9741:409:1::0;37197:116:0::1;37346:147;37372:45;37385:10;37397:19;37372:12;:45::i;:::-;37436:6;37461:17;;37346:7;:147::i;:::-;37324:239;;;::::0;-1:-1:-1;;;37324:239:0;;10357:2:1;37324:239:0::1;::::0;::::1;10339:21:1::0;10396:2;10376:18;;;10369:30;10435:34;10415:18;;;10408:62;-1:-1:-1;;;10486:18:1;;;10479:40;10536:19;;37324:239:0::1;10155:406:1::0;37324:239:0::1;37615:10;37596:30;::::0;;;:18:::1;:30;::::0;;;;;37665:19;;37596:48:::1;::::0;37629:15;;37596:48:::1;:::i;:::-;:88;;37574:161;;;::::0;-1:-1:-1;;;37574:161:0;;11033:2:1;37574:161:0::1;::::0;::::1;11015:21:1::0;11072:2;11052:18;;;11045:30;11111:25;11091:18;;;11084:53;11154:18;;37574:161:0::1;10831:347:1::0;37574:161:0::1;33268:3;37789:15;37768:18;;:36;;;;:::i;:::-;:55;37746:134;;;::::0;-1:-1:-1;;;37746:134:0;;11385:2:1;37746:134:0::1;::::0;::::1;11367:21:1::0;11424:2;11404:18;;;11397:30;11463:31;11443:18;;;11436:59;11512:18;;37746:134:0::1;11183:353:1::0;37746:134:0::1;37913:15;37891:18;;:37;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;37958:10:0::1;37939:30;::::0;;;:18:::1;:30;::::0;;;;:49;;37973:15;;37939:30;:49:::1;::::0;37973:15;;37939:49:::1;:::i;:::-;::::0;;;-1:-1:-1;38004:6:0::1;::::0;-1:-1:-1;37999:95:0::1;38016:15;38012:1;:19;37999:95;;;38053:29;38059:10;38071;38080:1:::0;38071:6;:10:::1;:::i;:::-;38053:5;:29::i;:::-;38033:3:::0;::::1;::::0;::::1;:::i;:::-;;;;37999:95;;;;37148:953;36991:1110:::0;;;:::o;16638:376::-;16847:41;738:10;16880:7;16847:18;:41::i;:::-;16825:140;;;;-1:-1:-1;;;16825:140:0;;;;;;;:::i;:::-;16978:28;16988:4;16994:2;16998:7;16978:9;:28::i;39293:968::-;33404:9;33417:10;33404:23;33396:66;;;;-1:-1:-1;;;33396:66:0;;;;;;;:::i;:::-;39378:11:::1;39392:13;26612:7:::0;:14;;26524:110;39392:13:::1;39438:18;::::0;39378:27;;-1:-1:-1;39438:18:0;;::::1;;;39416:110;;;::::0;-1:-1:-1;;;39416:110:0;;12301:2:1;39416:110:0::1;::::0;::::1;12283:21:1::0;12340:2;12320:18;;;12313:30;12379:34;12359:18;;;12352:62;-1:-1:-1;;;12430:18:1;;;12423:40;12480:19;;39416:110:0::1;12099:406:1::0;39416:110:0::1;33113:1;39559:15;:36;;39537:142;;;::::0;-1:-1:-1;;;39537:142:0;;12712:2:1;39537:142:0::1;::::0;::::1;12694:21:1::0;12751:2;12731:18;;;12724:30;12790:34;12770:18;;;12763:62;12861:26;12841:18;;;12834:54;12905:19;;39537:142:0::1;12510:420:1::0;39537:142:0::1;39728:10;39712:27;::::0;;;:15:::1;:27;::::0;;;;;33113:1:::1;-1:-1:-1::0;39690:143:0::1;;;::::0;-1:-1:-1;;;39690:143:0;;13137:2:1;39690:143:0::1;::::0;::::1;13119:21:1::0;13176:2;13156:18;;;13149:30;13215:34;13195:18;;;13188:62;-1:-1:-1;;;13266:18:1;;;13259:44;13320:19;;39690:143:0::1;12935:410:1::0;39690:143:0::1;33061:4;39866:24;39875:15:::0;39866:6;:24:::1;:::i;:::-;:37;39844:119;;;::::0;-1:-1:-1;;;39844:119:0;;13552:2:1;39844:119:0::1;::::0;::::1;13534:21:1::0;;;13571:18;;;13564:30;13630:34;13610:18;;;13603:62;13682:18;;39844:119:0::1;13350:356:1::0;39844:119:0::1;40009:29;40023:15:::0;33156:10:::1;40009:29;:::i;:::-;39996:9;:42;39974:117;;;;-1:-1:-1::0;;;39974:117:0::1;;;;;;;:::i;:::-;40118:10;40102:27;::::0;;;:15:::1;:27;::::0;;;;:46;;40133:15;;40102:27;:46:::1;::::0;40133:15;;40102:46:::1;:::i;:::-;::::0;;;-1:-1:-1;40164:6:0::1;::::0;-1:-1:-1;40159:95:0::1;40176:15;40172:1;:19;40159:95;;;40213:29;40219:10;40231;40240:1:::0;40231:6;:10:::1;:::i;40213:29::-;40193:3:::0;::::1;::::0;::::1;:::i;:::-;;;;40159:95;;27087:582:::0;27229:15;27292:16;27302:5;27292:9;:16::i;:::-;27284:5;:24;27262:117;;;;-1:-1:-1;;;27262:117:0;;;;;;;:::i;:::-;27392:10;27418:6;27413:183;27430:7;:14;27426:18;;27413:183;;;27479:7;27487:1;27479:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;27470:19:0;;;27479:10;;27470:19;27466:119;;;27523:5;27514;:14;27510:59;;;27537:1;-1:-1:-1;27530:8:0;;-1:-1:-1;27530:8:0;27510:59;27562:7;;;;:::i;:::-;;;;27510:59;27446:3;;;;:::i;:::-;;;;27413:183;;;;27608:53;;-1:-1:-1;;;27608:53:0;;;;;;;:::i;36208:775::-;33404:9;33417:10;33404:23;33396:66;;;;-1:-1:-1;;;33396:66:0;;;;;;;:::i;:::-;36331:11:::1;36345:13;26612:7:::0;:14;;26524:110;36345:13:::1;36377:21;::::0;36331:27;;-1:-1:-1;36377:21:0::1;;36369:62;;;::::0;-1:-1:-1;;;36369:62:0;;14984:2:1;36369:62:0::1;::::0;::::1;14966:21:1::0;15023:2;15003:18;;;14996:30;15062;15042:18;;;15035:58;15110:18;;36369:62:0::1;14782:352:1::0;36369:62:0::1;35263:25:::0;;;36487:10:::1;24990:2:1::0;24986:15;-1:-1:-1;;24982:53:1;35263:25:0;;;;24970:66:1;;;;35263:25:0;;;;;;;;;25052:12:1;;;;35263:25:0;;;35253:36;;;;;36464:64:::1;::::0;36500:6:::1;36508:19;;36464:7;:64::i;:::-;36442:137;;;::::0;-1:-1:-1;;;36442:137:0;;15341:2:1;36442:137:0::1;::::0;::::1;15323:21:1::0;15380:2;15360:18;;;15353:30;15419:25;15399:18;;;15392:53;15462:18;;36442:137:0::1;15139:347:1::0;36442:137:0::1;36632:10;36613:30;::::0;;;:18:::1;:30;::::0;;;;;::::1;;36612:31;36590:109;;;::::0;-1:-1:-1;;;36590:109:0;;15693:2:1;36590:109:0::1;::::0;::::1;15675:21:1::0;15732:2;15712:18;;;15705:30;15771;15751:18;;;15744:58;15819:18;;36590:109:0::1;15491:352:1::0;36590:109:0::1;33217:4;36718:15;;36736:1;36718:19;;;;:::i;:::-;:40;36710:77;;;::::0;-1:-1:-1;;;36710:77:0;;16050:2:1;36710:77:0::1;::::0;::::1;16032:21:1::0;16089:2;16069:18;;;16062:30;16128:26;16108:18;;;16101:54;16172:18;;36710:77:0::1;15848:348:1::0;36710:77:0::1;33156:10;36806:9;:24;36798:62;;;;-1:-1:-1::0;;;36798:62:0::1;;;;;;;:::i;:::-;36890:1;36871:15;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;36921:10:0::1;36902:30;::::0;;;:18:::1;:30;::::0;;;;:37;;-1:-1:-1;;36902:37:0::1;36935:4;36902:37;::::0;;36950:25:::1;::::0;36968:6;36950:5:::1;:25::i;:::-;36320:663;36208:775:::0;:::o;33928:332::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;33996:21:::1;34036:11:::0;34028:44:::1;;;::::0;-1:-1:-1;;;34028:44:0;;16403:2:1;34028:44:0::1;::::0;::::1;16385:21:1::0;16442:2;16422:18;;;16415:30;-1:-1:-1;;;16461:18:1;;;16454:50;16521:18;;34028:44:0::1;16201:344:1::0;34028:44:0::1;34158:35;::::0;34112:10:::1;::::0;34083:18:::1;::::0;34112:10;;34181:7;;34083:18;34158:35;34083:18;34158:35;34181:7;34112:10;34158:35:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34134:59;;;34212:12;34204:48;;;::::0;-1:-1:-1;;;34204:48:0;;16962:2:1;34204:48:0::1;::::0;::::1;16944:21:1::0;17001:2;16981:18;;;16974:30;17040:25;17020:18;;;17013:53;17083:18;;34204:48:0::1;16760:347:1::0;17085:185:0;17223:39;17240:4;17246:2;17250:7;17223:39;;;;;;;;;;;;:16;:39::i;26711:292::-;26886:7;:14;26831:7;;26878:22;;26856:116;;;;-1:-1:-1;;;26856:116:0;;17314:2:1;26856:116:0;;;17296:21:1;17353:2;17333:18;;;17326:30;17392:34;17372:18;;;17365:62;-1:-1:-1;;;17443:18:1;;;17436:42;17495:19;;26856:116:0;17112:408:1;26856:116:0;-1:-1:-1;26990:5:0;26711:292::o;34286:98::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;34358:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;14374:326::-:0;14491:7;14516:13;14532:7;14540;14532:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;14532:16:0;;-1:-1:-1;14581:19:0;14559:110;;;;-1:-1:-1;;;14559:110:0;;17727:2:1;14559:110:0;;;17709:21:1;17766:2;17746:18;;;17739:30;17805:34;17785:18;;;17778:62;-1:-1:-1;;;17856:18:1;;;17849:39;17905:19;;14559:110:0;17525:405:1;34566:112:0;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;34651:19:::1;::::0;;-1:-1:-1;;34628:42:0;::::1;34651:19;::::0;;;::::1;;;34650:20;34628:42:::0;;::::1;;::::0;;34566:112::o;32564:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13901:411::-;14018:4;-1:-1:-1;;;;;14062:19:0;;14040:111;;;;-1:-1:-1;;;14040:111:0;;18137:2:1;14040:111:0;;;18119:21:1;18176:2;18156:18;;;18149:30;18215:34;18195:18;;;18188:62;-1:-1:-1;;;18266:18:1;;;18259:40;18316:19;;14040:111:0;17935:406:1;14040:111:0;14164:10;14190:6;14185:97;14202:7;:14;14198:18;;14185:97;;;14251:7;14259:1;14251:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;14242:19:0;;;14251:10;;14242:19;14238:32;;;14263:7;;;:::i;:::-;;;14238:32;14218:3;;;:::i;:::-;;;14185:97;;;-1:-1:-1;14299:5:0;13901:411;-1:-1:-1;;13901:411:0:o;29355:103::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;29420:30:::1;29447:1;29420:18;:30::i;:::-;29355:103::o:0;35820:359::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;35904:14:::1;35921:13;26612:7:::0;:14;;26524:110;35921:13:::1;35904:30:::0;-1:-1:-1;33061:4:0::1;35967:23;35976:14:::0;35904:30;35967:23:::1;:::i;:::-;:36;35945:122;;;::::0;-1:-1:-1;;;35945:122:0;;18548:2:1;35945:122:0::1;::::0;::::1;18530:21:1::0;18587:2;18567:18;;;18560:30;18626:34;18606:18;;;18599:62;-1:-1:-1;;;18677:18:1;;;18670:34;18721:19;;35945:122:0::1;18346:400:1::0;35945:122:0::1;36083:9;36078:94;36098:14;36094:1;:18;36078:94;;;36134:26;36144:3:::0;36149:10:::1;36158:1:::0;36149:6;:10:::1;:::i;:::-;36134:9;:26::i;:::-;36114:3:::0;::::1;::::0;::::1;:::i;:::-;;;;36078:94;;;;35893:286;35820:359:::0;;:::o;14936:104::-;14992:13;15025:7;15018:14;;;;;:::i;34708:109::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;34791:18:::1;::::0;;-1:-1:-1;;34769:40:0;::::1;34791:18:::0;;;;::::1;;;34790:19;34769:40:::0;;::::1;;::::0;;34708:109::o;15959:327::-;-1:-1:-1;;;;;16094:24:0;;738:10;16094:24;;16086:62;;;;-1:-1:-1;;;16086:62:0;;18953:2:1;16086:62:0;;;18935:21:1;18992:2;18972:18;;;18965:30;19031:27;19011:18;;;19004:55;19076:18;;16086:62:0;18751:349:1;16086:62:0;738:10;16161:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;16161:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;16161:53:0;;;;;;;;;;16230:48;;540:41:1;;;16161:42:0;;738:10;16230:48;;513:18:1;16230:48:0;;;;;;;15959:327;;:::o;17341:365::-;17530:41;738:10;17563:7;17530:18;:41::i;:::-;17508:140;;;;-1:-1:-1;;;17508:140:0;;;;;;;:::i;:::-;17659:39;17673:4;17679:2;17683:7;17692:5;17659:13;:39::i;34863:104::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;34932:19:::1;:27:::0;34863:104::o;40293:222::-;40352:13;40386:17;40394:8;40386:7;:17::i;:::-;40378:50;;;;-1:-1:-1;;;40378:50:0;;19307:2:1;40378:50:0;;;19289:21:1;19346:2;19326:18;;;19319:30;-1:-1:-1;;;19365:18:1;;;19358:50;19425:18;;40378:50:0;19105:344:1;40378:50:0;40470:7;40479:26;40496:8;40479:16;:26::i;:::-;40453:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40439:68;;40293:222;;;:::o;35016:100::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;35083:17:::1;:25:::0;35016:100::o;29613:238::-;28777:6;;-1:-1:-1;;;;;28777:6:0;738:10;28924:23;28916:68;;;;-1:-1:-1;;;28916:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29716:22:0;::::1;29694:110;;;::::0;-1:-1:-1;;;29694:110:0;;21151:2:1;29694:110:0::1;::::0;::::1;21133:21:1::0;21190:2;21170:18;;;21163:30;21229:34;21209:18;;;21202:62;-1:-1:-1;;;21280:18:1;;;21273:36;21326:19;;29694:110:0::1;20949:402:1::0;29694:110:0::1;29815:28;29834:8;29815:18;:28::i;:::-;29613:238:::0;:::o;38109:1176::-;33404:9;33417:10;33404:23;33396:66;;;;-1:-1:-1;;;33396:66:0;;;;;;;:::i;:::-;38280:11:::1;38294:13;26612:7:::0;:14;;26524:110;38294:13:::1;38340:19;::::0;38280:27;;-1:-1:-1;38340:19:0::1;::::0;::::1;;;38318:112;;;::::0;-1:-1:-1;;;38318:112:0;;21558:2:1;38318:112:0::1;::::0;::::1;21540:21:1::0;21597:2;21577:18;;;21570:30;21636:34;21616:18;;;21609:62;-1:-1:-1;;;21687:18:1;;;21680:41;21738:19;;38318:112:0::1;21356:407:1::0;38318:112:0::1;38463:147;38489:45;38502:10;38514:19;38489:12;:45::i;38463:147::-;38441:236;;;::::0;-1:-1:-1;;;38441:236:0;;21970:2:1;38441:236:0::1;::::0;::::1;21952:21:1::0;22009:2;21989:18;;;21982:30;22048:34;22028:18;;;22021:62;-1:-1:-1;;;22099:18:1;;;22092:37;22146:19;;38441:236:0::1;21768:403:1::0;38441:236:0::1;38727:10;38710:28;::::0;;;:16:::1;:28;::::0;;;;;33113:1:::1;::::0;38710:46:::1;::::0;38741:15;;38710:46:::1;:::i;:::-;:67;;38688:168;;;::::0;-1:-1:-1;;;38688:168:0;;22378:2:1;38688:168:0::1;::::0;::::1;22360:21:1::0;22417:2;22397:18;;;22390:30;22456:34;22436:18;;;22429:62;-1:-1:-1;;;22507:18:1;;;22500:49;22566:19;;38688:168:0::1;22176:415:1::0;38688:168:0::1;33061:4;38889:24;38898:15:::0;38889:6;:24:::1;:::i;:::-;:37;38867:119;;;::::0;-1:-1:-1;;;38867:119:0;;13552:2:1;38867:119:0::1;::::0;::::1;13534:21:1::0;;;13571:18;;;13564:30;13630:34;13610:18;;;13603:62;13682:18;;38867:119:0::1;13350:356:1::0;38867:119:0::1;39032:29;39046:15:::0;33156:10:::1;39032:29;:::i;:::-;39019:9;:42;38997:117;;;;-1:-1:-1::0;;;38997:117:0::1;;;;;;;:::i;:::-;39142:10;39125:28;::::0;;;:16:::1;:28;::::0;;;;:47;;39157:15;;39125:28;:47:::1;::::0;39157:15;;39125:47:::1;:::i;:::-;::::0;;;-1:-1:-1;39188:6:0::1;::::0;-1:-1:-1;39183:95:0::1;39200:15;39196:1;:19;39183:95;;;39237:29;39243:10;39255;39264:1:::0;39255:6;:10:::1;:::i;39237:29::-;39217:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39183:95;;13482:355:::0;13629:4;-1:-1:-1;;;;;;13671:40:0;;-1:-1:-1;;;13671:40:0;;:105;;-1:-1:-1;;;;;;;13728:48:0;;-1:-1:-1;;;13728:48:0;13671:105;:158;;;-1:-1:-1;;;;;;;;;;10326:40:0;;;13793:36;10167:207;19253:155;19352:7;:14;19318:4;;19342:24;;:58;;;;;19398:1;-1:-1:-1;;;;;19370:30:0;:7;19378;19370:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;19370:16:0;:30;;19335:65;19253:155;-1:-1:-1;;19253:155:0:o;23278:174::-;23353:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;23353:29:0;-1:-1:-1;;;;;23353:29:0;;;;;;;;:24;;23407:23;23353:24;23407:14;:23::i;:::-;-1:-1:-1;;;;;23398:46:0;;;;;;;;;;;23278:174;;:::o;35341:210::-;35497:45;;-1:-1:-1;;22773:2:1;22769:15;;;22765:53;35497:45:0;;;22753:66:1;22835:12;;;22828:28;;;35455:7:0;;22872:12:1;;35497:45:0;;;;;;;;;;;;35487:56;;;;;;35480:63;;35341:210;;;;:::o;35598:199::-;35726:4;35750:39;35769:6;35777:4;35783:5;35750:18;:39::i;:::-;35743:46;35598:199;-1:-1:-1;;;;35598:199:0:o;21363:346::-;-1:-1:-1;;;;;21443:16:0;;21435:61;;;;-1:-1:-1;;;21435:61:0;;23097:2:1;21435:61:0;;;23079:21:1;;;23116:18;;;23109:30;23175:34;23155:18;;;23148:62;23227:18;;21435:61:0;22895:356:1;21435:61:0;21516:16;21524:7;21516;:16::i;:::-;21515:17;21507:58;;;;-1:-1:-1;;;21507:58:0;;23458:2:1;21507:58:0;;;23440:21:1;23497:2;23477:18;;;23470:30;23536;23516:18;;;23509:58;23584:18;;21507:58:0;23256:352:1;21507:58:0;21634:7;:16;;;;;;;-1:-1:-1;21634:16:0;;;;;;;-1:-1:-1;;;;;;21634:16:0;-1:-1:-1;;;;;21634:16:0;;;;;;;;21668:33;;21693:7;;-1:-1:-1;21668:33:0;;-1:-1:-1;;21668:33:0;21363:346;;:::o;19575:452::-;19704:4;19748:16;19756:7;19748;:16::i;:::-;19726:110;;;;-1:-1:-1;;;19726:110:0;;23815:2:1;19726:110:0;;;23797:21:1;23854:2;23834:18;;;23827:30;23893:34;23873:18;;;23866:62;-1:-1:-1;;;23944:18:1;;;23937:42;23996:19;;19726:110:0;23613:408:1;19726:110:0;19847:13;19863:23;19878:7;19863:14;:23::i;:::-;19847:39;;19916:5;-1:-1:-1;;;;;19905:16:0;:7;-1:-1:-1;;;;;19905:16:0;;:64;;;;19962:7;-1:-1:-1;;;;;19938:31:0;:20;19950:7;19938:11;:20::i;:::-;-1:-1:-1;;;;;19938:31:0;;19905:64;:113;;;-1:-1:-1;;;;;;16528:25:0;;;16499:4;16528:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;19986:32;16357:214;22607:553;22780:4;-1:-1:-1;;;;;22753:31:0;:23;22768:7;22753:14;:23::i;:::-;-1:-1:-1;;;;;22753:31:0;;22731:122;;;;-1:-1:-1;;;22731:122:0;;24228:2:1;22731:122:0;;;24210:21:1;24267:2;24247:18;;;24240:30;24306:34;24286:18;;;24279:62;-1:-1:-1;;;24357:18:1;;;24350:39;24406:19;;22731:122:0;24026:405:1;22731:122:0;-1:-1:-1;;;;;22872:16:0;;22864:65;;;;-1:-1:-1;;;22864:65:0;;24638:2:1;22864:65:0;;;24620:21:1;24677:2;24657:18;;;24650:30;24716:34;24696:18;;;24689:62;-1:-1:-1;;;24767:18:1;;;24760:34;24811:19;;22864:65:0;24436:400:1;22864:65:0;23046:29;23063:1;23067:7;23046:8;:29::i;:::-;23105:2;23086:7;23094;23086:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;23086:21:0;-1:-1:-1;;;;;23086:21:0;;;;;;23125:27;;23144:7;;23125:27;;;;;;;;;;23086:16;23125:27;22607:553;;;:::o;30011:191::-;30104:6;;;-1:-1:-1;;;;;30121:17:0;;;-1:-1:-1;;;;;;30121:17:0;;;;;;;30154:40;;30104:6;;;30121:17;30104:6;;30154:40;;30085:16;;30154:40;30074:128;30011:191;:::o;20369:110::-;20445:26;20455:2;20459:7;20445:26;;;;;;;;;;;;:9;:26::i;18588:352::-;18745:28;18755:4;18761:2;18765:7;18745:9;:28::i;:::-;18806:48;18829:4;18835:2;18839:7;18848:5;18806:22;:48::i;:::-;18784:148;;;;-1:-1:-1;;;18784:148:0;;;;;;;:::i;10940:722::-;10996:13;11216:10;11212:53;;-1:-1:-1;;11243:10:0;;;;;;;;;;;;-1:-1:-1;;;11243:10:0;;;;;10940:722::o;11212:53::-;11290:5;11275:12;11331:78;11338:9;;11331:78;;11364:8;;;;:::i;:::-;;-1:-1:-1;11387:10:0;;-1:-1:-1;11395:2:0;11387:10;;:::i;:::-;;;11331:78;;;11419:19;11451:6;11441:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11441:17:0;;11419:39;;11469:154;11476:10;;11469:154;;11503:11;11513:1;11503:11;;:::i;:::-;;-1:-1:-1;11572:10:0;11580:2;11572:5;:10;:::i;:::-;11559:24;;:2;:24;:::i;:::-;11546:39;;11529:6;11536;11529:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;11529:56:0;;;;;;;;-1:-1:-1;11600:11:0;11609:2;11600:11;;:::i;:::-;;;11469:154;;31044:190;31169:4;31222;31193:25;31206:5;31213:4;31193:12;:25::i;:::-;:33;;31044:190;-1:-1:-1;;;;31044:190:0:o;20706:321::-;20836:18;20842:2;20846:7;20836:5;:18::i;:::-;20887:54;20918:1;20922:2;20926:7;20935:5;20887:22;:54::i;:::-;20865:154;;;;-1:-1:-1;;;20865:154:0;;;;;;;:::i;24017:980::-;24172:4;-1:-1:-1;;;;;24193:13:0;;10560:20;10608:8;24189:801;;24246:175;;-1:-1:-1;;;24246:175:0;;-1:-1:-1;;;;;24246:36:0;;;;;:175;;738:10;;24340:4;;24367:7;;24397:5;;24246:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24246:175:0;;;;;;;;-1:-1:-1;;24246:175:0;;;;;;;;;;;;:::i;:::-;;;24225:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24604:13:0;;24600:320;;24647:108;;-1:-1:-1;;;24647:108:0;;;;;;;:::i;24600:320::-;24870:6;24864:13;24855:6;24851:2;24847:15;24840:38;24225:710;-1:-1:-1;;;;;;24485:51:0;-1:-1:-1;;;24485:51:0;;-1:-1:-1;24478:58:0;;24189:801;-1:-1:-1;24974:4:0;24017:980;;;;;;:::o;31596:813::-;31706:7;31754:4;31706:7;31769:603;31793:5;:12;31789:1;:16;31769:603;;;31827:20;31850:5;31856:1;31850:8;;;;;;;;:::i;:::-;;;;;;;31827:31;;31893:12;31877;:28;31873:488;;32052:44;;;;;;26914:19:1;;;26949:12;;;26942:28;;;26986:12;;32052:44:0;;;;;;;;;;;;32020:95;;;;;;32005:110;;31873:488;;;32282:44;;;;;;26914:19:1;;;26949:12;;;26942:28;;;26986:12;;32282:44:0;;;;;;;;;;;;32250:95;;;;;;32235:110;;31873:488;-1:-1:-1;31807:3:0;;;;:::i;:::-;;;;31769:603;;;-1:-1:-1;32389:12:0;31596:813;-1:-1:-1;;;31596:813:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1758:173::-;1826:20;;-1:-1:-1;;;;;1875:31:1;;1865:42;;1855:70;;1921:1;1918;1911:12;1855:70;1758:173;;;:::o;1936:186::-;1995:6;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;2127:254::-;2195:6;2203;2256:2;2244:9;2235:7;2231:23;2227:32;2224:52;;;2272:1;2269;2262:12;2224:52;2295:29;2314:9;2295:29;:::i;:::-;2285:39;2371:2;2356:18;;;;2343:32;;-1:-1:-1;;;2127:254:1:o;2386:127::-;2447:10;2442:3;2438:20;2435:1;2428:31;2478:4;2475:1;2468:15;2502:4;2499:1;2492:15;2518:275;2589:2;2583:9;2654:2;2635:13;;-1:-1:-1;;2631:27:1;2619:40;;2689:18;2674:34;;2710:22;;;2671:62;2668:88;;;2736:18;;:::i;:::-;2772:2;2765:22;2518:275;;-1:-1:-1;2518:275:1:o;2798:712::-;2852:5;2905:3;2898:4;2890:6;2886:17;2882:27;2872:55;;2923:1;2920;2913:12;2872:55;2959:6;2946:20;2985:4;3008:18;3004:2;3001:26;2998:52;;;3030:18;;:::i;:::-;3076:2;3073:1;3069:10;3099:28;3123:2;3119;3115:11;3099:28;:::i;:::-;3161:15;;;3231;;;3227:24;;;3192:12;;;;3263:15;;;3260:35;;;3291:1;3288;3281:12;3260:35;3327:2;3319:6;3315:15;3304:26;;3339:142;3355:6;3350:3;3347:15;3339:142;;;3421:17;;3409:30;;3372:12;;;;3459;;;;3339:142;;;3499:5;2798:712;-1:-1:-1;;;;;;;2798:712:1:o;3515:484::-;3617:6;3625;3633;3686:2;3674:9;3665:7;3661:23;3657:32;3654:52;;;3702:1;3699;3692:12;3654:52;3738:9;3725:23;3715:33;;3795:2;3784:9;3780:18;3767:32;3757:42;;3850:2;3839:9;3835:18;3822:32;3877:18;3869:6;3866:30;3863:50;;;3909:1;3906;3899:12;3863:50;3932:61;3985:7;3976:6;3965:9;3961:22;3932:61;:::i;:::-;3922:71;;;3515:484;;;;;:::o;4186:328::-;4263:6;4271;4279;4332:2;4320:9;4311:7;4307:23;4303:32;4300:52;;;4348:1;4345;4338:12;4300:52;4371:29;4390:9;4371:29;:::i;:::-;4361:39;;4419:38;4453:2;4442:9;4438:18;4419:38;:::i;:::-;4409:48;;4504:2;4493:9;4489:18;4476:32;4466:42;;4186:328;;;;;:::o;4701:348::-;4785:6;4838:2;4826:9;4817:7;4813:23;4809:32;4806:52;;;4854:1;4851;4844:12;4806:52;4894:9;4881:23;4927:18;4919:6;4916:30;4913:50;;;4959:1;4956;4949:12;4913:50;4982:61;5035:7;5026:6;5015:9;5011:22;4982:61;:::i;5054:407::-;5119:5;5153:18;5145:6;5142:30;5139:56;;;5175:18;;:::i;:::-;5213:57;5258:2;5237:15;;-1:-1:-1;;5233:29:1;5264:4;5229:40;5213:57;:::i;:::-;5204:66;;5293:6;5286:5;5279:21;5333:3;5324:6;5319:3;5315:16;5312:25;5309:45;;;5350:1;5347;5340:12;5309:45;5399:6;5394:3;5387:4;5380:5;5376:16;5363:43;5453:1;5446:4;5437:6;5430:5;5426:18;5422:29;5415:40;5054:407;;;;;:::o;5466:451::-;5535:6;5588:2;5576:9;5567:7;5563:23;5559:32;5556:52;;;5604:1;5601;5594:12;5556:52;5644:9;5631:23;5677:18;5669:6;5666:30;5663:50;;;5709:1;5706;5699:12;5663:50;5732:22;;5785:4;5777:13;;5773:27;-1:-1:-1;5763:55:1;;5814:1;5811;5804:12;5763:55;5837:74;5903:7;5898:2;5885:16;5880:2;5876;5872:11;5837:74;:::i;5922:347::-;5987:6;5995;6048:2;6036:9;6027:7;6023:23;6019:32;6016:52;;;6064:1;6061;6054:12;6016:52;6087:29;6106:9;6087:29;:::i;:::-;6077:39;;6166:2;6155:9;6151:18;6138:32;6213:5;6206:13;6199:21;6192:5;6189:32;6179:60;;6235:1;6232;6225:12;6179:60;6258:5;6248:15;;;5922:347;;;;;:::o;6274:667::-;6369:6;6377;6385;6393;6446:3;6434:9;6425:7;6421:23;6417:33;6414:53;;;6463:1;6460;6453:12;6414:53;6486:29;6505:9;6486:29;:::i;:::-;6476:39;;6534:38;6568:2;6557:9;6553:18;6534:38;:::i;:::-;6524:48;;6619:2;6608:9;6604:18;6591:32;6581:42;;6674:2;6663:9;6659:18;6646:32;6701:18;6693:6;6690:30;6687:50;;;6733:1;6730;6723:12;6687:50;6756:22;;6809:4;6801:13;;6797:27;-1:-1:-1;6787:55:1;;6838:1;6835;6828:12;6787:55;6861:74;6927:7;6922:2;6909:16;6904:2;6900;6896:11;6861:74;:::i;:::-;6851:84;;;6274:667;;;;;;;:::o;7131:260::-;7199:6;7207;7260:2;7248:9;7239:7;7235:23;7231:32;7228:52;;;7276:1;7273;7266:12;7228:52;7299:29;7318:9;7299:29;:::i;:::-;7289:39;;7347:38;7381:2;7370:9;7366:18;7347:38;:::i;:::-;7337:48;;7131:260;;;;;:::o;7396:380::-;7475:1;7471:12;;;;7518;;;7539:61;;7593:4;7585:6;7581:17;7571:27;;7539:61;7646:2;7638:6;7635:14;7615:18;7612:38;7609:161;;;7692:10;7687:3;7683:20;7680:1;7673:31;7727:4;7724:1;7717:15;7755:4;7752:1;7745:15;7609:161;;7396:380;;;:::o;9021:356::-;9223:2;9205:21;;;9242:18;;;9235:30;9301:34;9296:2;9281:18;;9274:62;9368:2;9353:18;;9021:356::o;9382:354::-;9584:2;9566:21;;;9623:2;9603:18;;;9596:30;9662:32;9657:2;9642:18;;9635:60;9727:2;9712:18;;9382:354::o;10566:127::-;10627:10;10622:3;10618:20;10615:1;10608:31;10658:4;10655:1;10648:15;10682:4;10679:1;10672:15;10698:128;10738:3;10769:1;10765:6;10762:1;10759:13;10756:39;;;10775:18;;:::i;:::-;-1:-1:-1;10811:9:1;;10698:128::o;11541:135::-;11580:3;-1:-1:-1;;11601:17:1;;11598:43;;;11621:18;;:::i;:::-;-1:-1:-1;11668:1:1;11657:13;;11541:135::o;11681:413::-;11883:2;11865:21;;;11922:2;11902:18;;;11895:30;11961:34;11956:2;11941:18;;11934:62;-1:-1:-1;;;12027:2:1;12012:18;;12005:47;12084:3;12069:19;;11681:413::o;13711:168::-;13751:7;13817:1;13813;13809:6;13805:14;13802:1;13799:21;13794:1;13787:9;13780:17;13776:45;13773:71;;;13824:18;;:::i;:::-;-1:-1:-1;13864:9:1;;13711:168::o;13884:349::-;14086:2;14068:21;;;14125:2;14105:18;;;14098:30;14164:27;14159:2;14144:18;;14137:55;14224:2;14209:18;;13884:349::o;14238:407::-;14440:2;14422:21;;;14479:2;14459:18;;;14452:30;14518:34;14513:2;14498:18;;14491:62;-1:-1:-1;;;14584:2:1;14569:18;;14562:41;14635:3;14620:19;;14238:407::o;14650:127::-;14711:10;14706:3;14702:20;14699:1;14692:31;14742:4;14739:1;14732:15;14766:4;14763:1;14756:15;19580:185;19622:3;19660:5;19654:12;19675:52;19720:6;19715:3;19708:4;19701:5;19697:16;19675:52;:::i;:::-;19743:16;;;;;19580:185;-1:-1:-1;;19580:185:1:o;19770:1174::-;19946:3;19975:1;20008:6;20002:13;20038:3;20060:1;20088:9;20084:2;20080:18;20070:28;;20148:2;20137:9;20133:18;20170;20160:61;;20214:4;20206:6;20202:17;20192:27;;20160:61;20240:2;20288;20280:6;20277:14;20257:18;20254:38;20251:165;;;-1:-1:-1;;;20315:33:1;;20371:4;20368:1;20361:15;20401:4;20322:3;20389:17;20251:165;20432:18;20459:104;;;;20577:1;20572:320;;;;20425:467;;20459:104;-1:-1:-1;;20492:24:1;;20480:37;;20537:16;;;;-1:-1:-1;20459:104:1;;20572:320;19527:1;19520:14;;;19564:4;19551:18;;20667:1;20681:165;20695:6;20692:1;20689:13;20681:165;;;20773:14;;20760:11;;;20753:35;20816:16;;;;20710:10;;20681:165;;;20685:3;;20875:6;20870:3;20866:16;20859:23;;20425:467;;;;;;;20908:30;20934:3;20926:6;20908:30;:::i;:::-;20901:37;19770:1174;-1:-1:-1;;;;;19770:1174:1:o;25075:414::-;25277:2;25259:21;;;25316:2;25296:18;;;25289:30;25355:34;25350:2;25335:18;;25328:62;-1:-1:-1;;;25421:2:1;25406:18;;25399:48;25479:3;25464:19;;25075:414::o;25494:127::-;25555:10;25550:3;25546:20;25543:1;25536:31;25586:4;25583:1;25576:15;25610:4;25607:1;25600:15;25626:120;25666:1;25692;25682:35;;25697:18;;:::i;:::-;-1:-1:-1;25731:9:1;;25626:120::o;25751:125::-;25791:4;25819:1;25816;25813:8;25810:34;;;25824:18;;:::i;:::-;-1:-1:-1;25861:9:1;;25751:125::o;25881:112::-;25913:1;25939;25929:35;;25944:18;;:::i;:::-;-1:-1:-1;25978:9:1;;25881:112::o;25998:500::-;-1:-1:-1;;;;;26267:15:1;;;26249:34;;26319:15;;26314:2;26299:18;;26292:43;26366:2;26351:18;;26344:34;;;26414:3;26409:2;26394:18;;26387:31;;;26192:4;;26435:57;;26472:19;;26464:6;26435:57;:::i;:::-;26427:65;25998:500;-1:-1:-1;;;;;;25998:500:1:o;26503:249::-;26572:6;26625:2;26613:9;26604:7;26600:23;26596:32;26593:52;;;26641:1;26638;26631:12;26593:52;26673:9;26667:16;26692:30;26716:5;26692:30;:::i

Swarm Source

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