ETH Price: $3,466.99 (+2.34%)
Gas: 10 Gwei

Token

Pixel Sports Legends (PSL)
 

Overview

Max Total Supply

52 PSL

Holders

37

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 PSL
0xb9e95651a78907fd5bb8bc37fc5138669314ed93
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:
PixelSportsLegends

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

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


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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.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);
}

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


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

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


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

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


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

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


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

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


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

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


// 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 OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: psl.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;





contract PixelSportsLegends is ERC721Enumerable, Ownable {
    using Strings for uint256;
    uint256 public constant MAX_PIXELS = 3000;
    uint256 public price = 0.07 ether;

    // Flag to Toggle pixels public and pre-sale
    bool public publicSaleOpen = false;
    bool public preSaleOpen = false;
    bool public lock = false;
    uint256 public maxMintPerAddress = 2;
    mapping(address => uint256) public mintPerAddress;
    mapping(bytes32 => bool) private _usedHashes;
    string public prefixURI;
    string public commonURI;

  struct ReserveList {
        address addr;
        uint hasMinted;
    }
    mapping(address => ReserveList) public reservelist;
    address[] reservelistAddr;
    struct WhiteList {
        address addr;
        uint hasMinted;
    }

    mapping(address => WhiteList) public whitelist;
    address[] whitelistAddr;
    

    constructor() ERC721("Pixel Sports Legends", "PSL") { }

    // Public Mint
    function mint(uint256 _count) public payable {
        require(publicSaleOpen, "public mint not open");
        require(mintPerAddress[msg.sender] + _count <= maxMintPerAddress, "max mint per address");
        require(msg.value == _count * price, "invalid price");
        require(totalSupply() + _count <= MAX_PIXELS, "max pixels reached");

        mintPerAddress[msg.sender] += _count;
        for (uint256 i = 1; i <= _count; i++) {
            _safeMint(msg.sender, totalSupply()+1);
        }
        // totalSupply += _count;

    }
    // Whitelist Mint
    function Premint(uint256 _count) public payable {
            require(isWhiteListed(msg.sender), 'Address not on Reserve list');

        require(preSaleOpen, "public mint not open");
        require(mintPerAddress[msg.sender] + _count <= maxMintPerAddress, "max mint per address");
        require(msg.value == _count * price, "invalid price");
        require(totalSupply() + _count <= MAX_PIXELS, "max pixels reached");

        mintPerAddress[msg.sender] += _count;
        for (uint256 i = 1; i <= _count; i++) {
            _safeMint(msg.sender, totalSupply()+1);
        }
        // totalSupply += _count;

    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        if (bytes(commonURI).length != 0) {
            return commonURI;
        }
        return string(abi.encodePacked(prefixURI, tokenId.toString()));
    }

    // ************** Admin functions **************
    function togglePublicSale() external onlyOwner {
        publicSaleOpen = !publicSaleOpen;
    }

    function togglePreSale() external onlyOwner {
        preSaleOpen = !preSaleOpen;
    }

    function setMaxMintPerAddress(uint256 _maxMint) external onlyOwner {
        maxMintPerAddress = _maxMint;
    }


    function withdraw(address payable _to) external onlyOwner {
        require(_to != address(0), "cannot withdraw to address(0)");
        require(address(this).balance > 0, "empty balance");
        _to.transfer(address(this).balance);
    }

    function gift(address _to, uint256 _count) external onlyOwner {
        require(_to != address(0), "cannot withdraw to address(0)");
        require(totalSupply() + _count <= MAX_PIXELS, "max pixels reached");

        for (uint256 i = 1; i <= _count; i++) {
            _safeMint(_to, totalSupply()+1);
        }
    }

    function lockBaseURI() external onlyOwner {
        require(!lock, "already locked");
        lock = true;
    }

    function setPrefixURI(string calldata _uri) external onlyOwner {
        require(!lock, "already locked");
        prefixURI = _uri;
        commonURI = '';
    }

    function setCommonURI(string calldata _uri) external onlyOwner {
        require(!lock, "already locked");
        commonURI = _uri;
        prefixURI = '';
    }

    function setPrice(uint256 _price) external onlyOwner {
        price = _price;
    }

    function addAddressToReserveList(address[] memory addr) onlyOwner external returns(bool success) {

        for (uint i = 0; i < addr.length; i++) {

            if (reservelist[addr[i]].addr != addr[i]){
                reservelist[addr[i]].addr = addr[i];
                reservelist[addr[i]].hasMinted = 0;
            }
        }

        success = true;
    }

    function isReserveListed(address addr) public view returns (bool isReservelisted) {
        return reservelist[addr].addr == addr && reservelist[addr].hasMinted == 0;
    }

    function addAddressToWhiteList(address[] memory addr) onlyOwner external returns(bool success) {

        for (uint i = 0; i < addr.length; i++) {

            if (whitelist[addr[i]].addr != addr[i]){
                whitelist[addr[i]].addr = addr[i];
                whitelist[addr[i]].hasMinted = 0;
            }
        }

        success = true;
    }

    function isWhiteListed(address addr) public view returns (bool isWhitelisted) {
        return whitelist[addr].addr == addr && whitelist[addr].hasMinted == 0;
    }


}

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_PIXELS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"Premint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"}],"name":"addAddressToReserveList","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"}],"name":"addAddressToWhiteList","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","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":"commonURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isReserveListed","outputs":[{"internalType":"bool","name":"isReservelisted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"isWhitelisted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMintPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintPerAddress","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":[],"name":"preSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prefixURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reservelist","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"hasMinted","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setCommonURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMint","type":"uint256"}],"name":"setMaxMintPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setPrefixURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"whitelist","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"hasMinted","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266f8b0a10e470000600b55600c805462ffffff191690556002600d553480156200002d57600080fd5b50604080518082018252601481527f506978656c2053706f727473204c6567656e64730000000000000000000000006020808301918252835180850190945260038452621414d360ea1b9084015281519192916200008e916000916200011d565b508051620000a49060019060208401906200011d565b505050620000c1620000bb620000c760201b60201c565b620000cb565b62000200565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200012b90620001c3565b90600052602060002090601f0160209004810192826200014f57600085556200019a565b82601f106200016a57805160ff19168380011785556200019a565b828001600101855582156200019a579182015b828111156200019a5782518255916020019190600101906200017d565b50620001a8929150620001ac565b5090565b5b80821115620001a85760008155600101620001ad565b600281046001821680620001d857607f821691505b60208210811415620001fa57634e487b7160e01b600052602260045260246000fd5b50919050565b6130c080620002106000396000f3fe6080604052600436106102725760003560e01c806391b7f5ed1161014f578063bd421727116100c1578063e222c7f91161007a578063e222c7f914610706578063e985e9c51461071b578063f2fde38b1461073b578063f83d08ba1461075b578063f9e2379914610770578063fd7982ca1461078557610272565b8063bd42172714610651578063c87b56dd14610671578063c880506414610691578063ca3cb522146106b1578063cbce4c97146106c6578063dfa9b440146106e657610272565b8063a0c5407811610113578063a0c54078146105a7578063a22cb465146105bc578063a6c982bf146105dc578063b2c94ee6146105fc578063b88d4fde1461061c578063ba11ecde1461063c57610272565b806391b7f5ed1461051c57806395d89b411461053c5780639b19251a14610551578063a035b1fe1461057f578063a0712d681461059457610272565b806353df5c7c116101e857806370a08231116101ac57806370a082311461048a57806370d75ce7146104aa578063715018a6146104bd578063769b5ef2146104d25780638d40fb4e146104f25780638da5cb5b1461050757610272565b806353df5c7c1461040057806355fc989314610415578063572849c4146104355780636352211e1461044a5780636f9170f61461046a57610272565b80631e14d44b1161023a5780631e14d44b1461034057806323b872dd146103605780632f745c591461038057806342842e0e146103a05780634f6ccce7146103c057806351cff8d9146103e057610272565b806301ffc9a71461027757806306fdde03146102ad578063081812fc146102cf578063095ea7b3146102fc57806318160ddd1461031e575b600080fd5b34801561028357600080fd5b50610297610292366004612643565b61079a565b6040516102a49190612858565b60405180910390f35b3480156102b957600080fd5b506102c26107c7565b6040516102a49190612863565b3480156102db57600080fd5b506102ef6102ea3660046126e8565b610859565b6040516102a491906127ee565b34801561030857600080fd5b5061031c610317366004612565565b6108a5565b005b34801561032a57600080fd5b5061033361093d565b6040516102a49190612edf565b34801561034c57600080fd5b5061031c61035b3660046126e8565b610943565b34801561036c57600080fd5b5061031c61037b366004612438565b610987565b34801561038c57600080fd5b5061033361039b366004612565565b6109bf565b3480156103ac57600080fd5b5061031c6103bb366004612438565b610a11565b3480156103cc57600080fd5b506103336103db3660046126e8565b610a2c565b3480156103ec57600080fd5b5061031c6103fb3660046123dd565b610a87565b34801561040c57600080fd5b5061031c610b45565b34801561042157600080fd5b5061031c61043036600461267b565b610bc0565b34801561044157600080fd5b50610333610c53565b34801561045657600080fd5b506102ef6104653660046126e8565b610c59565b34801561047657600080fd5b506102976104853660046123dd565b610c8e565b34801561049657600080fd5b506103336104a53660046123dd565b610cd3565b61031c6104b83660046126e8565b610d17565b3480156104c957600080fd5b5061031c610e5b565b3480156104de57600080fd5b506103336104ed3660046123dd565b610ea6565b3480156104fe57600080fd5b506102c2610eb8565b34801561051357600080fd5b506102ef610f46565b34801561052857600080fd5b5061031c6105373660046126e8565b610f55565b34801561054857600080fd5b506102c2610f99565b34801561055d57600080fd5b5061057161056c3660046123dd565b610fa8565b6040516102a492919061283f565b34801561058b57600080fd5b50610333610fcd565b61031c6105a23660046126e8565b610fd3565b3480156105b357600080fd5b506102c26110dd565b3480156105c857600080fd5b5061031c6105d7366004612534565b6110ea565b3480156105e857600080fd5b506102976105f7366004612590565b6110fc565b34801561060857600080fd5b5061031c61061736600461267b565b6112d7565b34801561062857600080fd5b5061031c610637366004612478565b61136a565b34801561064857600080fd5b506102976113a9565b34801561065d57600080fd5b5061029761066c3660046123dd565b6113b7565b34801561067d57600080fd5b506102c261068c3660046126e8565b6113fc565b34801561069d57600080fd5b506105716106ac3660046123dd565b6114fb565b3480156106bd57600080fd5b5061031c611520565b3480156106d257600080fd5b5061031c6106e1366004612565565b61157c565b3480156106f257600080fd5b50610297610701366004612590565b61163d565b34801561071257600080fd5b5061031c61180f565b34801561072757600080fd5b50610297610736366004612400565b611862565b34801561074757600080fd5b5061031c6107563660046123dd565b611890565b34801561076757600080fd5b50610297611901565b34801561077c57600080fd5b50610297611910565b34801561079157600080fd5b50610333611919565b60006001600160e01b0319821663780e9d6360e01b14806107bf57506107bf8261191f565b90505b919050565b6060600080546107d690612fb3565b80601f016020809104026020016040519081016040528092919081815260200182805461080290612fb3565b801561084f5780601f106108245761010080835404028352916020019161084f565b820191906000526020600020905b81548152906001019060200180831161083257829003601f168201915b5050505050905090565b60006108648261195f565b6108895760405162461bcd60e51b815260040161088090612c3f565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108b082610c59565b9050806001600160a01b0316836001600160a01b031614156108e45760405162461bcd60e51b815260040161088090612db2565b806001600160a01b03166108f661197c565b6001600160a01b0316148061091257506109128161073661197c565b61092e5760405162461bcd60e51b815260040161088090612a7e565b6109388383611980565b505050565b60085490565b61094b61197c565b6001600160a01b031661095c610f46565b6001600160a01b0316146109825760405162461bcd60e51b815260040161088090612c8b565b600d55565b61099861099261197c565b826119ee565b6109b45760405162461bcd60e51b815260040161088090612df3565b610938838383611a73565b60006109ca83610cd3565b82106109e85760405162461bcd60e51b815260040161088090612876565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6109388383836040518060200160405280600081525061136a565b6000610a3661093d565b8210610a545760405162461bcd60e51b815260040161088090612e93565b60088281548110610a7557634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b610a8f61197c565b6001600160a01b0316610aa0610f46565b6001600160a01b031614610ac65760405162461bcd60e51b815260040161088090612c8b565b6001600160a01b038116610aec5760405162461bcd60e51b815260040161088090612bd3565b60004711610b0c5760405162461bcd60e51b815260040161088090612e44565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610b41573d6000803e3d6000fd5b5050565b610b4d61197c565b6001600160a01b0316610b5e610f46565b6001600160a01b031614610b845760405162461bcd60e51b815260040161088090612c8b565b600c5462010000900460ff1615610bad5760405162461bcd60e51b815260040161088090612e6b565b600c805462ff0000191662010000179055565b610bc861197c565b6001600160a01b0316610bd9610f46565b6001600160a01b031614610bff5760405162461bcd60e51b815260040161088090612c8b565b600c5462010000900460ff1615610c285760405162461bcd60e51b815260040161088090612e6b565b610c34601183836122d0565b5060408051602081019182905260009081905261093891601091612354565b600d5481565b6000818152600260205260408120546001600160a01b0316806107bf5760405162461bcd60e51b815260040161088090612b53565b6001600160a01b038082166000818152601460205260408120549092161480156107bf5750506001600160a01b03166000908152601460205260409020600101541590565b60006001600160a01b038216610cfb5760405162461bcd60e51b815260040161088090612b09565b506001600160a01b031660009081526003602052604090205490565b610d2033610c8e565b610d3c5760405162461bcd60e51b815260040161088090612b9c565b600c54610100900460ff16610d635760405162461bcd60e51b815260040161088090612d58565b600d54336000908152600e6020526040902054610d81908390612f25565b1115610d9f5760405162461bcd60e51b815260040161088090612adb565b600b54610dac9082612f51565b3414610dca5760405162461bcd60e51b815260040161088090612a57565b610bb881610dd661093d565b610de09190612f25565b1115610dfe5760405162461bcd60e51b815260040161088090612d86565b336000908152600e602052604081208054839290610e1d908490612f25565b90915550600190505b818111610b4157610e4933610e3961093d565b610e44906001612f25565b611ba0565b80610e5381612fee565b915050610e26565b610e6361197c565b6001600160a01b0316610e74610f46565b6001600160a01b031614610e9a5760405162461bcd60e51b815260040161088090612c8b565b610ea46000611bba565b565b600e6020526000908152604090205481565b60118054610ec590612fb3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef190612fb3565b8015610f3e5780601f10610f1357610100808354040283529160200191610f3e565b820191906000526020600020905b815481529060010190602001808311610f2157829003601f168201915b505050505081565b600a546001600160a01b031690565b610f5d61197c565b6001600160a01b0316610f6e610f46565b6001600160a01b031614610f945760405162461bcd60e51b815260040161088090612c8b565b600b55565b6060600180546107d690612fb3565b601460205260009081526040902080546001909101546001600160a01b039091169082565b600b5481565b600c5460ff16610ff55760405162461bcd60e51b815260040161088090612d58565b600d54336000908152600e6020526040902054611013908390612f25565b11156110315760405162461bcd60e51b815260040161088090612adb565b600b5461103e9082612f51565b341461105c5760405162461bcd60e51b815260040161088090612a57565b610bb88161106861093d565b6110729190612f25565b11156110905760405162461bcd60e51b815260040161088090612d86565b336000908152600e6020526040812080548392906110af908490612f25565b90915550600190505b818111610b41576110cb33610e3961093d565b806110d581612fee565b9150506110b8565b60108054610ec590612fb3565b610b416110f561197c565b8383611c0c565b600061110661197c565b6001600160a01b0316611117610f46565b6001600160a01b03161461113d5760405162461bcd60e51b815260040161088090612c8b565b60005b82518110156112ce5782818151811061116957634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166012600085848151811061119e57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b039081168352908201929092526040016000205416146112bc578281815181106111eb57634e487b7160e01b600052603260045260246000fd5b60200260200101516012600085848151811061121757634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060006012600085848151811061128c57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600101819055505b806112c681612fee565b915050611140565b50600192915050565b6112df61197c565b6001600160a01b03166112f0610f46565b6001600160a01b0316146113165760405162461bcd60e51b815260040161088090612c8b565b600c5462010000900460ff161561133f5760405162461bcd60e51b815260040161088090612e6b565b61134b601083836122d0565b5060408051602081019182905260009081905261093891601191612354565b61137b61137561197c565b836119ee565b6113975760405162461bcd60e51b815260040161088090612df3565b6113a384848484611caf565b50505050565b600c54610100900460ff1681565b6001600160a01b038082166000818152601260205260408120549092161480156107bf5750506001600160a01b03166000908152601260205260409020600101541590565b60606114078261195f565b6114235760405162461bcd60e51b815260040161088090612d09565b6011805461143090612fb3565b1590506114c9576011805461144490612fb3565b80601f016020809104026020016040519081016040528092919081815260200182805461147090612fb3565b80156114bd5780601f10611492576101008083540402835291602001916114bd565b820191906000526020600020905b8154815290600101906020018083116114a057829003601f168201915b505050505090506107c2565b60106114d483611ce2565b6040516020016114e5929190612748565b6040516020818303038152906040529050919050565b601260205260009081526040902080546001909101546001600160a01b039091169082565b61152861197c565b6001600160a01b0316611539610f46565b6001600160a01b03161461155f5760405162461bcd60e51b815260040161088090612c8b565b600c805461ff001981166101009182900460ff1615909102179055565b61158461197c565b6001600160a01b0316611595610f46565b6001600160a01b0316146115bb5760405162461bcd60e51b815260040161088090612c8b565b6001600160a01b0382166115e15760405162461bcd60e51b815260040161088090612bd3565b610bb8816115ed61093d565b6115f79190612f25565b11156116155760405162461bcd60e51b815260040161088090612d86565b60015b8181116109385761162b83610e3961093d565b8061163581612fee565b915050611618565b600061164761197c565b6001600160a01b0316611658610f46565b6001600160a01b03161461167e5760405162461bcd60e51b815260040161088090612c8b565b60005b82518110156112ce578281815181106116aa57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316601460008584815181106116df57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b039081168352908201929092526040016000205416146117fd5782818151811061172c57634e487b7160e01b600052603260045260246000fd5b60200260200101516014600085848151811061175857634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000601460008584815181106117cd57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600101819055505b8061180781612fee565b915050611681565b61181761197c565b6001600160a01b0316611828610f46565b6001600160a01b03161461184e5760405162461bcd60e51b815260040161088090612c8b565b600c805460ff19811660ff90911615179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61189861197c565b6001600160a01b03166118a9610f46565b6001600160a01b0316146118cf5760405162461bcd60e51b815260040161088090612c8b565b6001600160a01b0381166118f55760405162461bcd60e51b815260040161088090612913565b6118fe81611bba565b50565b600c5462010000900460ff1681565b600c5460ff1681565b610bb881565b60006001600160e01b031982166380ac58cd60e01b148061195057506001600160e01b03198216635b5e139f60e01b145b806107bf57506107bf82611dfd565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906119b582610c59565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006119f98261195f565b611a155760405162461bcd60e51b815260040161088090612a0b565b6000611a2083610c59565b9050806001600160a01b0316846001600160a01b03161480611a5b5750836001600160a01b0316611a5084610859565b6001600160a01b0316145b80611a6b5750611a6b8185611862565b949350505050565b826001600160a01b0316611a8682610c59565b6001600160a01b031614611aac5760405162461bcd60e51b815260040161088090612cc0565b6001600160a01b038216611ad25760405162461bcd60e51b815260040161088090612990565b611add838383611e16565b611ae8600082611980565b6001600160a01b0383166000908152600360205260408120805460019290611b11908490612f70565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b3f908490612f25565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610b41828260405180602001604052806000815250611e9f565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611c3e5760405162461bcd60e51b8152600401610880906129d4565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190611ca2908590612858565b60405180910390a3505050565b611cba848484611a73565b611cc684848484611ed2565b6113a35760405162461bcd60e51b8152600401610880906128c1565b606081611d0757506040805180820190915260018152600360fc1b60208201526107c2565b8160005b8115611d315780611d1b81612fee565b9150611d2a9050600a83612f3d565b9150611d0b565b60008167ffffffffffffffff811115611d5a57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611d84576020820181803683370190505b5090505b8415611a6b57611d99600183612f70565b9150611da6600a86613009565b611db1906030612f25565b60f81b818381518110611dd457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611df6600a86612f3d565b9450611d88565b6001600160e01b031981166301ffc9a760e01b14919050565b611e21838383610938565b6001600160a01b038316611e3d57611e3881611fed565b611e60565b816001600160a01b0316836001600160a01b031614611e6057611e608382612031565b6001600160a01b038216611e7c57611e77816120ce565b610938565b826001600160a01b0316826001600160a01b0316146109385761093882826121a7565b611ea983836121eb565b611eb66000848484611ed2565b6109385760405162461bcd60e51b8152600401610880906128c1565b6000611ee6846001600160a01b03166122ca565b15611fe257836001600160a01b031663150b7a02611f0261197c565b8786866040518563ffffffff1660e01b8152600401611f249493929190612802565b602060405180830381600087803b158015611f3e57600080fd5b505af1925050508015611f6e575060408051601f3d908101601f19168201909252611f6b9181019061265f565b60015b611fc8573d808015611f9c576040519150601f19603f3d011682016040523d82523d6000602084013e611fa1565b606091505b508051611fc05760405162461bcd60e51b8152600401610880906128c1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a6b565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161203e84610cd3565b6120489190612f70565b60008381526007602052604090205490915080821461209b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906120e090600190612f70565b6000838152600960205260408120546008805493945090928490811061211657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061214557634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061218b57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006121b283610cd3565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166122115760405162461bcd60e51b815260040161088090612c0a565b61221a8161195f565b156122375760405162461bcd60e51b815260040161088090612959565b61224360008383611e16565b6001600160a01b038216600090815260036020526040812080546001929061226c908490612f25565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b8280546122dc90612fb3565b90600052602060002090601f0160209004810192826122fe5760008555612344565b82601f106123175782800160ff19823516178555612344565b82800160010185558215612344579182015b82811115612344578235825591602001919060010190612329565b506123509291506123c8565b5090565b82805461236090612fb3565b90600052602060002090601f0160209004810192826123825760008555612344565b82601f1061239b57805160ff1916838001178555612344565b82800160010185558215612344579182015b828111156123445782518255916020019190600101906123ad565b5b8082111561235057600081556001016123c9565b6000602082840312156123ee578081fd5b81356123f98161305f565b9392505050565b60008060408385031215612412578081fd5b823561241d8161305f565b9150602083013561242d8161305f565b809150509250929050565b60008060006060848603121561244c578081fd5b83356124578161305f565b925060208401356124678161305f565b929592945050506040919091013590565b6000806000806080858703121561248d578081fd5b84356124988161305f565b93506020858101356124a98161305f565b935060408601359250606086013567ffffffffffffffff808211156124cc578384fd5b818801915088601f8301126124df578384fd5b8135818111156124f1576124f1613049565b612503601f8201601f19168501612ee8565b91508082528984828501011115612518578485fd5b8084840185840137810190920192909252939692955090935050565b60008060408385031215612546578182fd5b82356125518161305f565b91506020830135801515811461242d578182fd5b60008060408385031215612577578182fd5b82356125828161305f565b946020939093013593505050565b600060208083850312156125a2578182fd5b823567ffffffffffffffff808211156125b9578384fd5b818501915085601f8301126125cc578384fd5b8135818111156125de576125de613049565b83810291506125ee848301612ee8565b8181528481019084860184860187018a1015612608578788fd5b8795505b8386101561263657803594506126218561305f565b8483526001959095019491860191860161260c565b5098975050505050505050565b600060208284031215612654578081fd5b81356123f981613074565b600060208284031215612670578081fd5b81516123f981613074565b6000806020838503121561268d578182fd5b823567ffffffffffffffff808211156126a4578384fd5b818501915085601f8301126126b7578384fd5b8135818111156126c5578485fd5b8660208285010111156126d6578485fd5b60209290920196919550909350505050565b6000602082840312156126f9578081fd5b5035919050565b60008151808452612718816020860160208601612f87565b601f01601f19169290920160200192915050565b6000815161273e818560208601612f87565b9290920192915050565b825460009081906002810460018083168061276457607f831692505b602080841082141561278457634e487b7160e01b87526022600452602487fd5b81801561279857600181146127a9576127d5565b60ff198616895284890196506127d5565b6127b28b612f19565b885b868110156127cd5781548b8201529085019083016127b4565b505084890196505b5050505050506127e5818561272c565b95945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061283590830184612700565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082526123f96020830184612700565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252600d908201526c696e76616c696420707269636560981b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252601490820152736d6178206d696e7420706572206164647265737360601b604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601b908201527f41646472657373206e6f74206f6e2052657365727665206c6973740000000000604082015260600190565b6020808252601d908201527f63616e6e6f7420776974686472617720746f2061646472657373283029000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b602080825260149082015273383ab13634b19036b4b73a103737ba1037b832b760611b604082015260600190565b6020808252601290820152711b585e081c1a5e195b1cc81c995858da195960721b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600d908201526c656d7074792062616c616e636560981b604082015260600190565b6020808252600e908201526d185b1c9958591e481b1bd8dad95960921b604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b90815260200190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612f1157612f11613049565b604052919050565b60009081526020902090565b60008219821115612f3857612f3861301d565b500190565b600082612f4c57612f4c613033565b500490565b6000816000190483118215151615612f6b57612f6b61301d565b500290565b600082821015612f8257612f8261301d565b500390565b60005b83811015612fa2578181015183820152602001612f8a565b838111156113a35750506000910152565b600281046001821680612fc757607f821691505b60208210811415612fe857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156130025761300261301d565b5060010190565b60008261301857613018613033565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146118fe57600080fd5b6001600160e01b0319811681146118fe57600080fdfea26469706673582212206047dd843c9064932f72d09c7097fc732a440c164630fc6af78a385bc52b87c364736f6c63430008010033

Deployed Bytecode

0x6080604052600436106102725760003560e01c806391b7f5ed1161014f578063bd421727116100c1578063e222c7f91161007a578063e222c7f914610706578063e985e9c51461071b578063f2fde38b1461073b578063f83d08ba1461075b578063f9e2379914610770578063fd7982ca1461078557610272565b8063bd42172714610651578063c87b56dd14610671578063c880506414610691578063ca3cb522146106b1578063cbce4c97146106c6578063dfa9b440146106e657610272565b8063a0c5407811610113578063a0c54078146105a7578063a22cb465146105bc578063a6c982bf146105dc578063b2c94ee6146105fc578063b88d4fde1461061c578063ba11ecde1461063c57610272565b806391b7f5ed1461051c57806395d89b411461053c5780639b19251a14610551578063a035b1fe1461057f578063a0712d681461059457610272565b806353df5c7c116101e857806370a08231116101ac57806370a082311461048a57806370d75ce7146104aa578063715018a6146104bd578063769b5ef2146104d25780638d40fb4e146104f25780638da5cb5b1461050757610272565b806353df5c7c1461040057806355fc989314610415578063572849c4146104355780636352211e1461044a5780636f9170f61461046a57610272565b80631e14d44b1161023a5780631e14d44b1461034057806323b872dd146103605780632f745c591461038057806342842e0e146103a05780634f6ccce7146103c057806351cff8d9146103e057610272565b806301ffc9a71461027757806306fdde03146102ad578063081812fc146102cf578063095ea7b3146102fc57806318160ddd1461031e575b600080fd5b34801561028357600080fd5b50610297610292366004612643565b61079a565b6040516102a49190612858565b60405180910390f35b3480156102b957600080fd5b506102c26107c7565b6040516102a49190612863565b3480156102db57600080fd5b506102ef6102ea3660046126e8565b610859565b6040516102a491906127ee565b34801561030857600080fd5b5061031c610317366004612565565b6108a5565b005b34801561032a57600080fd5b5061033361093d565b6040516102a49190612edf565b34801561034c57600080fd5b5061031c61035b3660046126e8565b610943565b34801561036c57600080fd5b5061031c61037b366004612438565b610987565b34801561038c57600080fd5b5061033361039b366004612565565b6109bf565b3480156103ac57600080fd5b5061031c6103bb366004612438565b610a11565b3480156103cc57600080fd5b506103336103db3660046126e8565b610a2c565b3480156103ec57600080fd5b5061031c6103fb3660046123dd565b610a87565b34801561040c57600080fd5b5061031c610b45565b34801561042157600080fd5b5061031c61043036600461267b565b610bc0565b34801561044157600080fd5b50610333610c53565b34801561045657600080fd5b506102ef6104653660046126e8565b610c59565b34801561047657600080fd5b506102976104853660046123dd565b610c8e565b34801561049657600080fd5b506103336104a53660046123dd565b610cd3565b61031c6104b83660046126e8565b610d17565b3480156104c957600080fd5b5061031c610e5b565b3480156104de57600080fd5b506103336104ed3660046123dd565b610ea6565b3480156104fe57600080fd5b506102c2610eb8565b34801561051357600080fd5b506102ef610f46565b34801561052857600080fd5b5061031c6105373660046126e8565b610f55565b34801561054857600080fd5b506102c2610f99565b34801561055d57600080fd5b5061057161056c3660046123dd565b610fa8565b6040516102a492919061283f565b34801561058b57600080fd5b50610333610fcd565b61031c6105a23660046126e8565b610fd3565b3480156105b357600080fd5b506102c26110dd565b3480156105c857600080fd5b5061031c6105d7366004612534565b6110ea565b3480156105e857600080fd5b506102976105f7366004612590565b6110fc565b34801561060857600080fd5b5061031c61061736600461267b565b6112d7565b34801561062857600080fd5b5061031c610637366004612478565b61136a565b34801561064857600080fd5b506102976113a9565b34801561065d57600080fd5b5061029761066c3660046123dd565b6113b7565b34801561067d57600080fd5b506102c261068c3660046126e8565b6113fc565b34801561069d57600080fd5b506105716106ac3660046123dd565b6114fb565b3480156106bd57600080fd5b5061031c611520565b3480156106d257600080fd5b5061031c6106e1366004612565565b61157c565b3480156106f257600080fd5b50610297610701366004612590565b61163d565b34801561071257600080fd5b5061031c61180f565b34801561072757600080fd5b50610297610736366004612400565b611862565b34801561074757600080fd5b5061031c6107563660046123dd565b611890565b34801561076757600080fd5b50610297611901565b34801561077c57600080fd5b50610297611910565b34801561079157600080fd5b50610333611919565b60006001600160e01b0319821663780e9d6360e01b14806107bf57506107bf8261191f565b90505b919050565b6060600080546107d690612fb3565b80601f016020809104026020016040519081016040528092919081815260200182805461080290612fb3565b801561084f5780601f106108245761010080835404028352916020019161084f565b820191906000526020600020905b81548152906001019060200180831161083257829003601f168201915b5050505050905090565b60006108648261195f565b6108895760405162461bcd60e51b815260040161088090612c3f565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108b082610c59565b9050806001600160a01b0316836001600160a01b031614156108e45760405162461bcd60e51b815260040161088090612db2565b806001600160a01b03166108f661197c565b6001600160a01b0316148061091257506109128161073661197c565b61092e5760405162461bcd60e51b815260040161088090612a7e565b6109388383611980565b505050565b60085490565b61094b61197c565b6001600160a01b031661095c610f46565b6001600160a01b0316146109825760405162461bcd60e51b815260040161088090612c8b565b600d55565b61099861099261197c565b826119ee565b6109b45760405162461bcd60e51b815260040161088090612df3565b610938838383611a73565b60006109ca83610cd3565b82106109e85760405162461bcd60e51b815260040161088090612876565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6109388383836040518060200160405280600081525061136a565b6000610a3661093d565b8210610a545760405162461bcd60e51b815260040161088090612e93565b60088281548110610a7557634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b610a8f61197c565b6001600160a01b0316610aa0610f46565b6001600160a01b031614610ac65760405162461bcd60e51b815260040161088090612c8b565b6001600160a01b038116610aec5760405162461bcd60e51b815260040161088090612bd3565b60004711610b0c5760405162461bcd60e51b815260040161088090612e44565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610b41573d6000803e3d6000fd5b5050565b610b4d61197c565b6001600160a01b0316610b5e610f46565b6001600160a01b031614610b845760405162461bcd60e51b815260040161088090612c8b565b600c5462010000900460ff1615610bad5760405162461bcd60e51b815260040161088090612e6b565b600c805462ff0000191662010000179055565b610bc861197c565b6001600160a01b0316610bd9610f46565b6001600160a01b031614610bff5760405162461bcd60e51b815260040161088090612c8b565b600c5462010000900460ff1615610c285760405162461bcd60e51b815260040161088090612e6b565b610c34601183836122d0565b5060408051602081019182905260009081905261093891601091612354565b600d5481565b6000818152600260205260408120546001600160a01b0316806107bf5760405162461bcd60e51b815260040161088090612b53565b6001600160a01b038082166000818152601460205260408120549092161480156107bf5750506001600160a01b03166000908152601460205260409020600101541590565b60006001600160a01b038216610cfb5760405162461bcd60e51b815260040161088090612b09565b506001600160a01b031660009081526003602052604090205490565b610d2033610c8e565b610d3c5760405162461bcd60e51b815260040161088090612b9c565b600c54610100900460ff16610d635760405162461bcd60e51b815260040161088090612d58565b600d54336000908152600e6020526040902054610d81908390612f25565b1115610d9f5760405162461bcd60e51b815260040161088090612adb565b600b54610dac9082612f51565b3414610dca5760405162461bcd60e51b815260040161088090612a57565b610bb881610dd661093d565b610de09190612f25565b1115610dfe5760405162461bcd60e51b815260040161088090612d86565b336000908152600e602052604081208054839290610e1d908490612f25565b90915550600190505b818111610b4157610e4933610e3961093d565b610e44906001612f25565b611ba0565b80610e5381612fee565b915050610e26565b610e6361197c565b6001600160a01b0316610e74610f46565b6001600160a01b031614610e9a5760405162461bcd60e51b815260040161088090612c8b565b610ea46000611bba565b565b600e6020526000908152604090205481565b60118054610ec590612fb3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef190612fb3565b8015610f3e5780601f10610f1357610100808354040283529160200191610f3e565b820191906000526020600020905b815481529060010190602001808311610f2157829003601f168201915b505050505081565b600a546001600160a01b031690565b610f5d61197c565b6001600160a01b0316610f6e610f46565b6001600160a01b031614610f945760405162461bcd60e51b815260040161088090612c8b565b600b55565b6060600180546107d690612fb3565b601460205260009081526040902080546001909101546001600160a01b039091169082565b600b5481565b600c5460ff16610ff55760405162461bcd60e51b815260040161088090612d58565b600d54336000908152600e6020526040902054611013908390612f25565b11156110315760405162461bcd60e51b815260040161088090612adb565b600b5461103e9082612f51565b341461105c5760405162461bcd60e51b815260040161088090612a57565b610bb88161106861093d565b6110729190612f25565b11156110905760405162461bcd60e51b815260040161088090612d86565b336000908152600e6020526040812080548392906110af908490612f25565b90915550600190505b818111610b41576110cb33610e3961093d565b806110d581612fee565b9150506110b8565b60108054610ec590612fb3565b610b416110f561197c565b8383611c0c565b600061110661197c565b6001600160a01b0316611117610f46565b6001600160a01b03161461113d5760405162461bcd60e51b815260040161088090612c8b565b60005b82518110156112ce5782818151811061116957634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166012600085848151811061119e57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b039081168352908201929092526040016000205416146112bc578281815181106111eb57634e487b7160e01b600052603260045260246000fd5b60200260200101516012600085848151811061121757634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060006012600085848151811061128c57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600101819055505b806112c681612fee565b915050611140565b50600192915050565b6112df61197c565b6001600160a01b03166112f0610f46565b6001600160a01b0316146113165760405162461bcd60e51b815260040161088090612c8b565b600c5462010000900460ff161561133f5760405162461bcd60e51b815260040161088090612e6b565b61134b601083836122d0565b5060408051602081019182905260009081905261093891601191612354565b61137b61137561197c565b836119ee565b6113975760405162461bcd60e51b815260040161088090612df3565b6113a384848484611caf565b50505050565b600c54610100900460ff1681565b6001600160a01b038082166000818152601260205260408120549092161480156107bf5750506001600160a01b03166000908152601260205260409020600101541590565b60606114078261195f565b6114235760405162461bcd60e51b815260040161088090612d09565b6011805461143090612fb3565b1590506114c9576011805461144490612fb3565b80601f016020809104026020016040519081016040528092919081815260200182805461147090612fb3565b80156114bd5780601f10611492576101008083540402835291602001916114bd565b820191906000526020600020905b8154815290600101906020018083116114a057829003601f168201915b505050505090506107c2565b60106114d483611ce2565b6040516020016114e5929190612748565b6040516020818303038152906040529050919050565b601260205260009081526040902080546001909101546001600160a01b039091169082565b61152861197c565b6001600160a01b0316611539610f46565b6001600160a01b03161461155f5760405162461bcd60e51b815260040161088090612c8b565b600c805461ff001981166101009182900460ff1615909102179055565b61158461197c565b6001600160a01b0316611595610f46565b6001600160a01b0316146115bb5760405162461bcd60e51b815260040161088090612c8b565b6001600160a01b0382166115e15760405162461bcd60e51b815260040161088090612bd3565b610bb8816115ed61093d565b6115f79190612f25565b11156116155760405162461bcd60e51b815260040161088090612d86565b60015b8181116109385761162b83610e3961093d565b8061163581612fee565b915050611618565b600061164761197c565b6001600160a01b0316611658610f46565b6001600160a01b03161461167e5760405162461bcd60e51b815260040161088090612c8b565b60005b82518110156112ce578281815181106116aa57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316601460008584815181106116df57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b039081168352908201929092526040016000205416146117fd5782818151811061172c57634e487b7160e01b600052603260045260246000fd5b60200260200101516014600085848151811061175857634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000601460008584815181106117cd57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600101819055505b8061180781612fee565b915050611681565b61181761197c565b6001600160a01b0316611828610f46565b6001600160a01b03161461184e5760405162461bcd60e51b815260040161088090612c8b565b600c805460ff19811660ff90911615179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61189861197c565b6001600160a01b03166118a9610f46565b6001600160a01b0316146118cf5760405162461bcd60e51b815260040161088090612c8b565b6001600160a01b0381166118f55760405162461bcd60e51b815260040161088090612913565b6118fe81611bba565b50565b600c5462010000900460ff1681565b600c5460ff1681565b610bb881565b60006001600160e01b031982166380ac58cd60e01b148061195057506001600160e01b03198216635b5e139f60e01b145b806107bf57506107bf82611dfd565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906119b582610c59565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006119f98261195f565b611a155760405162461bcd60e51b815260040161088090612a0b565b6000611a2083610c59565b9050806001600160a01b0316846001600160a01b03161480611a5b5750836001600160a01b0316611a5084610859565b6001600160a01b0316145b80611a6b5750611a6b8185611862565b949350505050565b826001600160a01b0316611a8682610c59565b6001600160a01b031614611aac5760405162461bcd60e51b815260040161088090612cc0565b6001600160a01b038216611ad25760405162461bcd60e51b815260040161088090612990565b611add838383611e16565b611ae8600082611980565b6001600160a01b0383166000908152600360205260408120805460019290611b11908490612f70565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b3f908490612f25565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610b41828260405180602001604052806000815250611e9f565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611c3e5760405162461bcd60e51b8152600401610880906129d4565b6001600160a01b0383811660008181526005602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190611ca2908590612858565b60405180910390a3505050565b611cba848484611a73565b611cc684848484611ed2565b6113a35760405162461bcd60e51b8152600401610880906128c1565b606081611d0757506040805180820190915260018152600360fc1b60208201526107c2565b8160005b8115611d315780611d1b81612fee565b9150611d2a9050600a83612f3d565b9150611d0b565b60008167ffffffffffffffff811115611d5a57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611d84576020820181803683370190505b5090505b8415611a6b57611d99600183612f70565b9150611da6600a86613009565b611db1906030612f25565b60f81b818381518110611dd457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611df6600a86612f3d565b9450611d88565b6001600160e01b031981166301ffc9a760e01b14919050565b611e21838383610938565b6001600160a01b038316611e3d57611e3881611fed565b611e60565b816001600160a01b0316836001600160a01b031614611e6057611e608382612031565b6001600160a01b038216611e7c57611e77816120ce565b610938565b826001600160a01b0316826001600160a01b0316146109385761093882826121a7565b611ea983836121eb565b611eb66000848484611ed2565b6109385760405162461bcd60e51b8152600401610880906128c1565b6000611ee6846001600160a01b03166122ca565b15611fe257836001600160a01b031663150b7a02611f0261197c565b8786866040518563ffffffff1660e01b8152600401611f249493929190612802565b602060405180830381600087803b158015611f3e57600080fd5b505af1925050508015611f6e575060408051601f3d908101601f19168201909252611f6b9181019061265f565b60015b611fc8573d808015611f9c576040519150601f19603f3d011682016040523d82523d6000602084013e611fa1565b606091505b508051611fc05760405162461bcd60e51b8152600401610880906128c1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a6b565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161203e84610cd3565b6120489190612f70565b60008381526007602052604090205490915080821461209b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906120e090600190612f70565b6000838152600960205260408120546008805493945090928490811061211657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061214557634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061218b57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006121b283610cd3565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166122115760405162461bcd60e51b815260040161088090612c0a565b61221a8161195f565b156122375760405162461bcd60e51b815260040161088090612959565b61224360008383611e16565b6001600160a01b038216600090815260036020526040812080546001929061226c908490612f25565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b8280546122dc90612fb3565b90600052602060002090601f0160209004810192826122fe5760008555612344565b82601f106123175782800160ff19823516178555612344565b82800160010185558215612344579182015b82811115612344578235825591602001919060010190612329565b506123509291506123c8565b5090565b82805461236090612fb3565b90600052602060002090601f0160209004810192826123825760008555612344565b82601f1061239b57805160ff1916838001178555612344565b82800160010185558215612344579182015b828111156123445782518255916020019190600101906123ad565b5b8082111561235057600081556001016123c9565b6000602082840312156123ee578081fd5b81356123f98161305f565b9392505050565b60008060408385031215612412578081fd5b823561241d8161305f565b9150602083013561242d8161305f565b809150509250929050565b60008060006060848603121561244c578081fd5b83356124578161305f565b925060208401356124678161305f565b929592945050506040919091013590565b6000806000806080858703121561248d578081fd5b84356124988161305f565b93506020858101356124a98161305f565b935060408601359250606086013567ffffffffffffffff808211156124cc578384fd5b818801915088601f8301126124df578384fd5b8135818111156124f1576124f1613049565b612503601f8201601f19168501612ee8565b91508082528984828501011115612518578485fd5b8084840185840137810190920192909252939692955090935050565b60008060408385031215612546578182fd5b82356125518161305f565b91506020830135801515811461242d578182fd5b60008060408385031215612577578182fd5b82356125828161305f565b946020939093013593505050565b600060208083850312156125a2578182fd5b823567ffffffffffffffff808211156125b9578384fd5b818501915085601f8301126125cc578384fd5b8135818111156125de576125de613049565b83810291506125ee848301612ee8565b8181528481019084860184860187018a1015612608578788fd5b8795505b8386101561263657803594506126218561305f565b8483526001959095019491860191860161260c565b5098975050505050505050565b600060208284031215612654578081fd5b81356123f981613074565b600060208284031215612670578081fd5b81516123f981613074565b6000806020838503121561268d578182fd5b823567ffffffffffffffff808211156126a4578384fd5b818501915085601f8301126126b7578384fd5b8135818111156126c5578485fd5b8660208285010111156126d6578485fd5b60209290920196919550909350505050565b6000602082840312156126f9578081fd5b5035919050565b60008151808452612718816020860160208601612f87565b601f01601f19169290920160200192915050565b6000815161273e818560208601612f87565b9290920192915050565b825460009081906002810460018083168061276457607f831692505b602080841082141561278457634e487b7160e01b87526022600452602487fd5b81801561279857600181146127a9576127d5565b60ff198616895284890196506127d5565b6127b28b612f19565b885b868110156127cd5781548b8201529085019083016127b4565b505084890196505b5050505050506127e5818561272c565b95945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061283590830184612700565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082526123f96020830184612700565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252600d908201526c696e76616c696420707269636560981b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252601490820152736d6178206d696e7420706572206164647265737360601b604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601b908201527f41646472657373206e6f74206f6e2052657365727665206c6973740000000000604082015260600190565b6020808252601d908201527f63616e6e6f7420776974686472617720746f2061646472657373283029000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b602080825260149082015273383ab13634b19036b4b73a103737ba1037b832b760611b604082015260600190565b6020808252601290820152711b585e081c1a5e195b1cc81c995858da195960721b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600d908201526c656d7074792062616c616e636560981b604082015260600190565b6020808252600e908201526d185b1c9958591e481b1bd8dad95960921b604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b90815260200190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612f1157612f11613049565b604052919050565b60009081526020902090565b60008219821115612f3857612f3861301d565b500190565b600082612f4c57612f4c613033565b500490565b6000816000190483118215151615612f6b57612f6b61301d565b500290565b600082821015612f8257612f8261301d565b500390565b60005b83811015612fa2578181015183820152602001612f8a565b838111156113a35750506000910152565b600281046001821680612fc757607f821691505b60208210811415612fe857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156130025761300261301d565b5060010190565b60008261301857613018613033565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146118fe57600080fd5b6001600160e01b0319811681146118fe57600080fdfea26469706673582212206047dd843c9064932f72d09c7097fc732a440c164630fc6af78a385bc52b87c364736f6c63430008010033

Deployed Bytecode Sourcemap

44501:5200:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38266:224;;;;;;;;;;-1:-1:-1;38266:224:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25760:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27319:221::-;;;;;;;;;;-1:-1:-1;27319:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26842:411::-;;;;;;;;;;-1:-1:-1;26842:411:0;;;;;:::i;:::-;;:::i;:::-;;38906:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47313:114::-;;;;;;;;;;-1:-1:-1;47313:114:0;;;;;:::i;:::-;;:::i;28069:339::-;;;;;;;;;;-1:-1:-1;28069:339:0;;;;;:::i;:::-;;:::i;38574:256::-;;;;;;;;;;-1:-1:-1;38574:256:0;;;;;:::i;:::-;;:::i;28479:185::-;;;;;;;;;;-1:-1:-1;28479:185:0;;;;;:::i;:::-;;:::i;39096:233::-;;;;;;;;;;-1:-1:-1;39096:233:0;;;;;:::i;:::-;;:::i;47437:244::-;;;;;;;;;;-1:-1:-1;47437:244:0;;;;;:::i;:::-;;:::i;48023:115::-;;;;;;;;;;;;;:::i;48320:166::-;;;;;;;;;;-1:-1:-1;48320:166:0;;;;;:::i;:::-;;:::i;44847:36::-;;;;;;;;;;;;;:::i;25454:239::-;;;;;;;;;;-1:-1:-1;25454:239:0;;;;;:::i;:::-;;:::i;49528:166::-;;;;;;;;;;-1:-1:-1;49528:166:0;;;;;:::i;:::-;;:::i;25184:208::-;;;;;;;;;;-1:-1:-1;25184:208:0;;;;;:::i;:::-;;:::i;46063:634::-;;;;;;:::i;:::-;;:::i;2606:103::-;;;;;;;;;;;;;:::i;44890:49::-;;;;;;;;;;-1:-1:-1;44890:49:0;;;;;:::i;:::-;;:::i;45027:23::-;;;;;;;;;;;;;:::i;1955:87::-;;;;;;;;;;;;;:::i;48494:86::-;;;;;;;;;;-1:-1:-1;48494:86:0;;;;;:::i;:::-;;:::i;25929:104::-;;;;;;;;;;;;;:::i;45308:46::-;;;;;;;;;;-1:-1:-1;45308:46:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;44645:33::-;;;;;;;;;;;;;:::i;45482:552::-;;;;;;:::i;:::-;;:::i;44997:23::-;;;;;;;;;;;;;:::i;27612:155::-;;;;;;;;;;-1:-1:-1;27612:155:0;;;;;:::i;:::-;;:::i;48588:375::-;;;;;;;;;;-1:-1:-1;48588:375:0;;;;;:::i;:::-;;:::i;48146:166::-;;;;;;;;;;-1:-1:-1;48146:166:0;;;;;:::i;:::-;;:::i;28735:328::-;;;;;;;;;;-1:-1:-1;28735:328:0;;;;;:::i;:::-;;:::i;44778:31::-;;;;;;;;;;;;;:::i;48971:174::-;;;;;;;;;;-1:-1:-1;48971:174:0;;;;;:::i;:::-;;:::i;46705:343::-;;;;;;;;;;-1:-1:-1;46705:343:0;;;;;:::i;:::-;;:::i;45138:50::-;;;;;;;;;;-1:-1:-1;45138:50:0;;;;;:::i;:::-;;:::i;47216:89::-;;;;;;;;;;;;;:::i;47689:326::-;;;;;;;;;;-1:-1:-1;47689:326:0;;;;;:::i;:::-;;:::i;49153:367::-;;;;;;;;;;-1:-1:-1;49153:367:0;;;;;:::i;:::-;;:::i;47110:98::-;;;;;;;;;;;;;:::i;27838:164::-;;;;;;;;;;-1:-1:-1;27838:164:0;;;;;:::i;:::-;;:::i;2864:201::-;;;;;;;;;;-1:-1:-1;2864:201:0;;;;;:::i;:::-;;:::i;44816:24::-;;;;;;;;;;;;;:::i;44737:34::-;;;;;;;;;;;;;:::i;44597:41::-;;;;;;;;;;;;;:::i;38266:224::-;38368:4;-1:-1:-1;;;;;;38392:50:0;;-1:-1:-1;;;38392:50:0;;:90;;;38446:36;38470:11;38446:23;:36::i;:::-;38385:97;;38266:224;;;;:::o;25760:100::-;25814:13;25847:5;25840:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25760:100;:::o;27319:221::-;27395:7;27423:16;27431:7;27423;:16::i;:::-;27415:73;;;;-1:-1:-1;;;27415:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;27508:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27508:24:0;;27319:221::o;26842:411::-;26923:13;26939:23;26954:7;26939:14;:23::i;:::-;26923:39;;26987:5;-1:-1:-1;;;;;26981:11:0;:2;-1:-1:-1;;;;;26981:11:0;;;26973:57;;;;-1:-1:-1;;;26973:57:0;;;;;;;:::i;:::-;27081:5;-1:-1:-1;;;;;27065:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;27065:21:0;;:62;;;;27090:37;27107:5;27114:12;:10;:12::i;27090:37::-;27043:168;;;;-1:-1:-1;;;27043:168:0;;;;;;;:::i;:::-;27224:21;27233:2;27237:7;27224:8;:21::i;:::-;26842:411;;;:::o;38906:113::-;38994:10;:17;38906:113;:::o;47313:114::-;2186:12;:10;:12::i;:::-;-1:-1:-1;;;;;2175:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2175:23:0;;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;47391:17:::1;:28:::0;47313:114::o;28069:339::-;28264:41;28283:12;:10;:12::i;:::-;28297:7;28264:18;:41::i;:::-;28256:103;;;;-1:-1:-1;;;28256:103:0;;;;;;;:::i;:::-;28372:28;28382:4;28388:2;28392:7;28372:9;:28::i;38574:256::-;38671:7;38707:23;38724:5;38707:16;:23::i;:::-;38699:5;:31;38691:87;;;;-1:-1:-1;;;38691:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;38796:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;38574:256::o;28479:185::-;28617:39;28634:4;28640:2;28644:7;28617:39;;;;;;;;;;;;:16;:39::i;39096:233::-;39171:7;39207:30;:28;:30::i;:::-;39199:5;:38;39191:95;;;;-1:-1:-1;;;39191:95:0;;;;;;;:::i;:::-;39304:10;39315:5;39304:17;;;;;;-1:-1:-1;;;39304:17:0;;;;;;;;;;;;;;;;;39297:24;;39096:233;;;:::o;47437:244::-;2186:12;:10;:12::i;:::-;-1:-1:-1;;;;;2175:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2175:23:0;;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47514:17:0;::::1;47506:59;;;;-1:-1:-1::0;;;47506:59:0::1;;;;;;;:::i;:::-;47608:1;47584:21;:25;47576:51;;;;-1:-1:-1::0;;;47576:51:0::1;;;;;;;:::i;:::-;47638:35;::::0;-1:-1:-1;;;;;47638:12:0;::::1;::::0;47651:21:::1;47638:35:::0;::::1;;;::::0;::::1;::::0;;;47651:21;47638:12;:35;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;47437:244:::0;:::o;48023:115::-;2186:12;:10;:12::i;:::-;-1:-1:-1;;;;;2175:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2175:23:0;;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;48085:4:::1;::::0;;;::::1;;;48084:5;48076:32;;;;-1:-1:-1::0;;;48076:32:0::1;;;;;;;:::i;:::-;48119:4;:11:::0;;-1:-1:-1;;48119:11:0::1;::::0;::::1;::::0;;48023:115::o;48320:166::-;2186:12;:10;:12::i;:::-;-1:-1:-1;;;;;2175:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2175:23:0;;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;48403:4:::1;::::0;;;::::1;;;48402:5;48394:32;;;;-1:-1:-1::0;;;48394:32:0::1;;;;;;;:::i;:::-;48437:16;:9;48449:4:::0;;48437:16:::1;:::i;:::-;-1:-1:-1::0;48464:14:0::1;::::0;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;48464:14:0;;;;::::1;::::0;:9:::1;::::0;:14:::1;:::i;44847:36::-:0;;;;:::o;25454:239::-;25526:7;25562:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25562:16:0;25597:19;25589:73;;;;-1:-1:-1;;;25589:73:0;;;;;;;:::i;49528:166::-;-1:-1:-1;;;;;49624:28:0;;;49586:18;49624:15;;;:9;:15;;;;;:20;49586:18;;49624:20;:28;:62;;;;-1:-1:-1;;;;;;;49656:15:0;;;;;:9;:15;;;;;:25;;;:30;;49528:166::o;25184:208::-;25256:7;-1:-1:-1;;;;;25284:19:0;;25276:74;;;;-1:-1:-1;;;25276:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;25368:16:0;;;;;:9;:16;;;;;;;25184:208::o;46063:634::-;46134:25;46148:10;46134:13;:25::i;:::-;46126:65;;;;-1:-1:-1;;;46126:65:0;;;;;;;:::i;:::-;46212:11;;;;;;;46204:44;;;;-1:-1:-1;;;46204:44:0;;;;;;;:::i;:::-;46306:17;;46282:10;46267:26;;;;:14;:26;;;;;;:35;;46296:6;;46267:35;:::i;:::-;:56;;46259:89;;;;-1:-1:-1;;;46259:89:0;;;;;;;:::i;:::-;46389:5;;46380:14;;:6;:14;:::i;:::-;46367:9;:27;46359:53;;;;-1:-1:-1;;;46359:53:0;;;;;;;:::i;:::-;44634:4;46447:6;46431:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;46423:67;;;;-1:-1:-1;;;46423:67:0;;;;;;;:::i;:::-;46518:10;46503:26;;;;:14;:26;;;;;:36;;46533:6;;46503:26;:36;;46533:6;;46503:36;:::i;:::-;;;;-1:-1:-1;46567:1:0;;-1:-1:-1;46550:103:0;46575:6;46570:1;:11;46550:103;;46603:38;46613:10;46625:13;:11;:13::i;:::-;:15;;46639:1;46625:15;:::i;:::-;46603:9;:38::i;:::-;46583:3;;;;:::i;:::-;;;;46550:103;;2606;2186:12;:10;:12::i;:::-;-1:-1:-1;;;;;2175:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2175:23:0;;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;2671:30:::1;2698:1;2671:18;:30::i;:::-;2606:103::o:0;44890:49::-;;;;;;;;;;;;;:::o;45027:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1955:87::-;2028:6;;-1:-1:-1;;;;;2028:6:0;1955:87;:::o;48494:86::-;2186:12;:10;:12::i;:::-;-1:-1:-1;;;;;2175:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2175:23:0;;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;48558:5:::1;:14:::0;48494:86::o;25929:104::-;25985:13;26018:7;26011:14;;;;;:::i;45308:46::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45308:46:0;;;;;:::o;44645:33::-;;;;:::o;45482:552::-;45546:14;;;;45538:47;;;;-1:-1:-1;;;45538:47:0;;;;;;;:::i;:::-;45643:17;;45619:10;45604:26;;;;:14;:26;;;;;;:35;;45633:6;;45604:35;:::i;:::-;:56;;45596:89;;;;-1:-1:-1;;;45596:89:0;;;;;;;:::i;:::-;45726:5;;45717:14;;:6;:14;:::i;:::-;45704:9;:27;45696:53;;;;-1:-1:-1;;;45696:53:0;;;;;;;:::i;:::-;44634:4;45784:6;45768:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;45760:67;;;;-1:-1:-1;;;45760:67:0;;;;;;;:::i;:::-;45855:10;45840:26;;;;:14;:26;;;;;:36;;45870:6;;45840:26;:36;;45870:6;;45840:36;:::i;:::-;;;;-1:-1:-1;45904:1:0;;-1:-1:-1;45887:103:0;45912:6;45907:1;:11;45887:103;;45940:38;45950:10;45962:13;:11;:13::i;45940:38::-;45920:3;;;;:::i;:::-;;;;45887:103;;44997:23;;;;;;;:::i;27612:155::-;27707:52;27726:12;:10;:12::i;:::-;27740:8;27750;27707:18;:52::i;48588:375::-;48671:12;2186;:10;:12::i;:::-;-1:-1:-1;;;;;2175:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2175:23:0;;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;48703:6:::1;48698:231;48719:4;:11;48715:1;:15;48698:231;;;48787:4;48792:1;48787:7;;;;;;-1:-1:-1::0;;;48787:7:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;48758:36:0::1;:11;:20;48770:4;48775:1;48770:7;;;;;;-1:-1:-1::0;;;48770:7:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;48758:20:0;;::::1;::::0;;;;::::1;::::0;;;;;;-1:-1:-1;48758:20:0;:25;::::1;:36;48754:164;;48842:4;48847:1;48842:7;;;;;;-1:-1:-1::0;;;48842:7:0::1;;;;;;;;;;;;;;;48814:11;:20;48826:4;48831:1;48826:7;;;;;;-1:-1:-1::0;;;48826:7:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;48814:20:0::1;-1:-1:-1::0;;;;;48814:20:0::1;;;;;;;;;;;;:25;;;:35;;;;;-1:-1:-1::0;;;;;48814:35:0::1;;;;;-1:-1:-1::0;;;;;48814:35:0::1;;;;;;48901:1;48868:11;:20;48880:4;48885:1;48880:7;;;;;;-1:-1:-1::0;;;48880:7:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;48868:20:0::1;-1:-1:-1::0;;;;;48868:20:0::1;;;;;;;;;;;;:30;;:34;;;;48754:164;48732:3:::0;::::1;::::0;::::1;:::i;:::-;;;;48698:231;;;-1:-1:-1::0;48951:4:0::1;::::0;48588:375;-1:-1:-1;;48588:375:0:o;48146:166::-;2186:12;:10;:12::i;:::-;-1:-1:-1;;;;;2175:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2175:23:0;;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;48229:4:::1;::::0;;;::::1;;;48228:5;48220:32;;;;-1:-1:-1::0;;;48220:32:0::1;;;;;;;:::i;:::-;48263:16;:9;48275:4:::0;;48263:16:::1;:::i;:::-;-1:-1:-1::0;48290:14:0::1;::::0;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;48290:14:0;;;;::::1;::::0;:9:::1;::::0;:14:::1;:::i;28735:328::-:0;28910:41;28929:12;:10;:12::i;:::-;28943:7;28910:18;:41::i;:::-;28902:103;;;;-1:-1:-1;;;28902:103:0;;;;;;;:::i;:::-;29016:39;29030:4;29036:2;29040:7;29049:5;29016:13;:39::i;:::-;28735:328;;;;:::o;44778:31::-;;;;;;;;;:::o;48971:174::-;-1:-1:-1;;;;;49071:30:0;;;49031:20;49071:17;;;:11;:17;;;;;:22;49031:20;;49071:22;:30;:66;;;;-1:-1:-1;;;;;;;49105:17:0;;;;;:11;:17;;;;;:27;;;:32;;48971:174::o;46705:343::-;46778:13;46812:16;46820:7;46812;:16::i;:::-;46804:76;;;;-1:-1:-1;;;46804:76:0;;;;;;;:::i;:::-;46901:9;46895:23;;;;;:::i;:::-;:28;;-1:-1:-1;46891:77:0;;46947:9;46940:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46891:77;47009:9;47020:18;:7;:16;:18::i;:::-;46992:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46978:62;;46705:343;;;:::o;45138:50::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45138:50:0;;;;;:::o;47216:89::-;2186:12;:10;:12::i;:::-;-1:-1:-1;;;;;2175:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2175:23:0;;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;47286:11:::1;::::0;;-1:-1:-1;;47271:26:0;::::1;47286:11;::::0;;;::::1;;;47285:12;47271:26:::0;;::::1;;::::0;;47216:89::o;47689:326::-;2186:12;:10;:12::i;:::-;-1:-1:-1;;;;;2175:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2175:23:0;;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47770:17:0;::::1;47762:59;;;;-1:-1:-1::0;;;47762:59:0::1;;;;;;;:::i;:::-;44634:4;47856:6;47840:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;47832:67;;;;-1:-1:-1::0;;;47832:67:0::1;;;;;;;:::i;:::-;47929:1;47912:96;47937:6;47932:1;:11;47912:96;;47965:31;47975:3;47980:13;:11;:13::i;47965:31::-;47945:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47912:96;;49153:367:::0;49234:12;2186;:10;:12::i;:::-;-1:-1:-1;;;;;2175:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2175:23:0;;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;49266:6:::1;49261:225;49282:4;:11;49278:1;:15;49261:225;;;49348:4;49353:1;49348:7;;;;;;-1:-1:-1::0;;;49348:7:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;49321:34:0::1;:9;:18;49331:4;49336:1;49331:7;;;;;;-1:-1:-1::0;;;49331:7:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;49321:18:0;;::::1;::::0;;;;::::1;::::0;;;;;;-1:-1:-1;49321:18:0;:23;::::1;:34;49317:158;;49401:4;49406:1;49401:7;;;;;;-1:-1:-1::0;;;49401:7:0::1;;;;;;;;;;;;;;;49375:9;:18;49385:4;49390:1;49385:7;;;;;;-1:-1:-1::0;;;49385:7:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;49375:18:0::1;-1:-1:-1::0;;;;;49375:18:0::1;;;;;;;;;;;;:23;;;:33;;;;;-1:-1:-1::0;;;;;49375:33:0::1;;;;;-1:-1:-1::0;;;;;49375:33:0::1;;;;;;49458:1;49427:9;:18;49437:4;49442:1;49437:7;;;;;;-1:-1:-1::0;;;49437:7:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;49427:18:0::1;-1:-1:-1::0;;;;;49427:18:0::1;;;;;;;;;;;;:28;;:32;;;;49317:158;49295:3:::0;::::1;::::0;::::1;:::i;:::-;;;;49261:225;;47110:98:::0;2186:12;:10;:12::i;:::-;-1:-1:-1;;;;;2175:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2175:23:0;;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;47186:14:::1;::::0;;-1:-1:-1;;47168:32:0;::::1;47186:14;::::0;;::::1;47185:15;47168:32;::::0;;47110:98::o;27838:164::-;-1:-1:-1;;;;;27959:25:0;;;27935:4;27959:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27838:164::o;2864:201::-;2186:12;:10;:12::i;:::-;-1:-1:-1;;;;;2175:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2175:23:0;;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2953:22:0;::::1;2945:73;;;;-1:-1:-1::0;;;2945:73:0::1;;;;;;;:::i;:::-;3029:28;3048:8;3029:18;:28::i;:::-;2864:201:::0;:::o;44816:24::-;;;;;;;;;:::o;44737:34::-;;;;;;:::o;44597:41::-;44634:4;44597:41;:::o;24815:305::-;24917:4;-1:-1:-1;;;;;;24954:40:0;;-1:-1:-1;;;24954:40:0;;:105;;-1:-1:-1;;;;;;;25011:48:0;;-1:-1:-1;;;25011:48:0;24954:105;:158;;;;25076:36;25100:11;25076:23;:36::i;30573:127::-;30638:4;30662:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30662:16:0;:30;;;30573:127::o;679:98::-;759:10;679:98;:::o;34555:174::-;34630:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34630:29:0;-1:-1:-1;;;;;34630:29:0;;;;;;;;:24;;34684:23;34630:24;34684:14;:23::i;:::-;-1:-1:-1;;;;;34675:46:0;;;;;;;;;;;34555:174;;:::o;30867:348::-;30960:4;30985:16;30993:7;30985;:16::i;:::-;30977:73;;;;-1:-1:-1;;;30977:73:0;;;;;;;:::i;:::-;31061:13;31077:23;31092:7;31077:14;:23::i;:::-;31061:39;;31130:5;-1:-1:-1;;;;;31119:16:0;:7;-1:-1:-1;;;;;31119:16:0;;:51;;;;31163:7;-1:-1:-1;;;;;31139:31:0;:20;31151:7;31139:11;:20::i;:::-;-1:-1:-1;;;;;31139:31:0;;31119:51;:87;;;;31174:32;31191:5;31198:7;31174:16;:32::i;:::-;31111:96;30867:348;-1:-1:-1;;;;30867:348:0:o;33859:578::-;34018:4;-1:-1:-1;;;;;33991:31:0;:23;34006:7;33991:14;:23::i;:::-;-1:-1:-1;;;;;33991:31:0;;33983:85;;;;-1:-1:-1;;;33983:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34087:16:0;;34079:65;;;;-1:-1:-1;;;34079:65:0;;;;;;;:::i;:::-;34157:39;34178:4;34184:2;34188:7;34157:20;:39::i;:::-;34261:29;34278:1;34282:7;34261:8;:29::i;:::-;-1:-1:-1;;;;;34303:15:0;;;;;;:9;:15;;;;;:20;;34322:1;;34303:15;:20;;34322:1;;34303:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34334:13:0;;;;;;:9;:13;;;;;:18;;34351:1;;34334:13;:18;;34351:1;;34334:18;:::i;:::-;;;;-1:-1:-1;;34363:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34363:21:0;-1:-1:-1;;;;;34363:21:0;;;;;;;;;34402:27;;34363:16;;34402:27;;;;;;;33859:578;;;:::o;31557:110::-;31633:26;31643:2;31647:7;31633:26;;;;;;;;;;;;:9;:26::i;3225:191::-;3318:6;;;-1:-1:-1;;;;;3335:17:0;;;-1:-1:-1;;;;;;3335:17:0;;;;;;;3368:40;;3318:6;;;3335:17;3318:6;;3368:40;;3299:16;;3368:40;3225:191;;:::o;34871:315::-;35026:8;-1:-1:-1;;;;;35017:17:0;:5;-1:-1:-1;;;;;35017:17:0;;;35009:55;;;;-1:-1:-1;;;35009:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35075:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;:46;;-1:-1:-1;;35075:46:0;;;;;;;35137:41;;;;;35075:46;;35137:41;:::i;:::-;;;;;;;;34871:315;;;:::o;29945:::-;30102:28;30112:4;30118:2;30122:7;30102:9;:28::i;:::-;30149:48;30172:4;30178:2;30182:7;30191:5;30149:22;:48::i;:::-;30141:111;;;;-1:-1:-1;;;30141:111:0;;;;;;;:::i;21664:723::-;21720:13;21941:10;21937:53;;-1:-1:-1;21968:10:0;;;;;;;;;;;;-1:-1:-1;;;21968:10:0;;;;;;21937:53;22015:5;22000:12;22056:78;22063:9;;22056:78;;22089:8;;;;:::i;:::-;;-1:-1:-1;22112:10:0;;-1:-1:-1;22120:2:0;22112:10;;:::i;:::-;;;22056:78;;;22144:19;22176:6;22166:17;;;;;;-1:-1:-1;;;22166:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22166:17:0;;22144:39;;22194:154;22201:10;;22194:154;;22228:11;22238:1;22228:11;;:::i;:::-;;-1:-1:-1;22297:10:0;22305:2;22297:5;:10;:::i;:::-;22284:24;;:2;:24;:::i;:::-;22271:39;;22254:6;22261;22254:14;;;;;;-1:-1:-1;;;22254:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;22254:56:0;;;;;;;;-1:-1:-1;22325:11:0;22334:2;22325:11;;:::i;:::-;;;22194:154;;14387:157;-1:-1:-1;;;;;;14496:40:0;;-1:-1:-1;;;14496:40:0;14387:157;;;:::o;39942:589::-;40086:45;40113:4;40119:2;40123:7;40086:26;:45::i;:::-;-1:-1:-1;;;;;40148:18:0;;40144:187;;40183:40;40215:7;40183:31;:40::i;:::-;40144:187;;;40253:2;-1:-1:-1;;;;;40245:10:0;:4;-1:-1:-1;;;;;40245:10:0;;40241:90;;40272:47;40305:4;40311:7;40272:32;:47::i;:::-;-1:-1:-1;;;;;40345:16:0;;40341:183;;40378:45;40415:7;40378:36;:45::i;:::-;40341:183;;;40451:4;-1:-1:-1;;;;;40445:10:0;:2;-1:-1:-1;;;;;40445:10:0;;40441:83;;40472:40;40500:2;40504:7;40472:27;:40::i;31894:321::-;32024:18;32030:2;32034:7;32024:5;:18::i;:::-;32075:54;32106:1;32110:2;32114:7;32123:5;32075:22;:54::i;:::-;32053:154;;;;-1:-1:-1;;;32053:154:0;;;;;;;:::i;35751:799::-;35906:4;35927:15;:2;-1:-1:-1;;;;;35927:13:0;;:15::i;:::-;35923:620;;;35979:2;-1:-1:-1;;;;;35963:36:0;;36000:12;:10;:12::i;:::-;36014:4;36020:7;36029:5;35963:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35963:72:0;;;;;;;;-1:-1:-1;;35963:72:0;;;;;;;;;;;;:::i;:::-;;;35959:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36205:13:0;;36201:272;;36248:60;;-1:-1:-1;;;36248:60:0;;;;;;;:::i;36201:272::-;36423:6;36417:13;36408:6;36404:2;36400:15;36393:38;35959:529;-1:-1:-1;;;;;;36086:51:0;-1:-1:-1;;;36086:51:0;;-1:-1:-1;36079:58:0;;35923:620;-1:-1:-1;36527:4:0;35751:799;;;;;;:::o;41254:164::-;41358:10;:17;;41331:24;;;;:15;:24;;;;;:44;;;41386:24;;;;;;;;;;;;41254:164::o;42045:988::-;42311:22;42361:1;42336:22;42353:4;42336:16;:22::i;:::-;:26;;;;:::i;:::-;42373:18;42394:26;;;:17;:26;;;;;;42311:51;;-1:-1:-1;42527:28:0;;;42523:328;;-1:-1:-1;;;;;42594:18:0;;42572:19;42594:18;;;:12;:18;;;;;;;;:34;;;;;;;;;42645:30;;;;;;:44;;;42762:30;;:17;:30;;;;;:43;;;42523:328;-1:-1:-1;42947:26:0;;;;:17;:26;;;;;;;;42940:33;;;-1:-1:-1;;;;;42991:18:0;;;;;:12;:18;;;;;:34;;;;;;;42984:41;42045:988::o;43328:1079::-;43606:10;:17;43581:22;;43606:21;;43626:1;;43606:21;:::i;:::-;43638:18;43659:24;;;:15;:24;;;;;;44032:10;:26;;43581:46;;-1:-1:-1;43659:24:0;;43581:46;;44032:26;;;;-1:-1:-1;;;44032:26:0;;;;;;;;;;;;;;;;;44010:48;;44096:11;44071:10;44082;44071:22;;;;;;-1:-1:-1;;;44071:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;44176:28;;;:15;:28;;;;;;;:41;;;44348:24;;;;;44341:31;44383:10;:16;;;;;-1:-1:-1;;;44383:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;43328:1079;;;;:::o;40832:221::-;40917:14;40934:20;40951:2;40934:16;:20::i;:::-;-1:-1:-1;;;;;40965:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;41010:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;40832:221:0:o;32551:382::-;-1:-1:-1;;;;;32631:16:0;;32623:61;;;;-1:-1:-1;;;32623:61:0;;;;;;;:::i;:::-;32704:16;32712:7;32704;:16::i;:::-;32703:17;32695:58;;;;-1:-1:-1;;;32695:58:0;;;;;;;:::i;:::-;32766:45;32795:1;32799:2;32803:7;32766:20;:45::i;:::-;-1:-1:-1;;;;;32824:13:0;;;;;;:9;:13;;;;;:18;;32841:1;;32824:13;:18;;32841:1;;32824:18;:::i;:::-;;;;-1:-1:-1;;32853:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32853:21:0;-1:-1:-1;;;;;32853:21:0;;;;;;;;32892:33;;32853:16;;;32892:33;;32853:16;;32892:33;32551:382;;:::o;4243:387::-;4566:20;4614:8;;;4243:387::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:259:1;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;:::-;262:5;84:189;-1:-1:-1;;;84:189:1:o;550:402::-;;;679:2;667:9;658:7;654:23;650:32;647:2;;;700:6;692;685:22;647:2;744:9;731:23;763:33;790:5;763:33;:::i;:::-;815:5;-1:-1:-1;872:2:1;857:18;;844:32;885:35;844:32;885:35;:::i;:::-;939:7;929:17;;;637:315;;;;;:::o;957:470::-;;;;1103:2;1091:9;1082:7;1078:23;1074:32;1071:2;;;1124:6;1116;1109:22;1071:2;1168:9;1155:23;1187:33;1214:5;1187:33;:::i;:::-;1239:5;-1:-1:-1;1296:2:1;1281:18;;1268:32;1309:35;1268:32;1309:35;:::i;:::-;1061:366;;1363:7;;-1:-1:-1;;;1417:2:1;1402:18;;;;1389:32;;1061:366::o;1432:1157::-;;;;;1604:3;1592:9;1583:7;1579:23;1575:33;1572:2;;;1626:6;1618;1611:22;1572:2;1670:9;1657:23;1689:33;1716:5;1689:33;:::i;:::-;1741:5;-1:-1:-1;1765:2:1;1804:18;;;1791:32;1832:35;1791:32;1832:35;:::i;:::-;1886:7;-1:-1:-1;1940:2:1;1925:18;;1912:32;;-1:-1:-1;1995:2:1;1980:18;;1967:32;2018:18;2048:14;;;2045:2;;;2080:6;2072;2065:22;2045:2;2123:6;2112:9;2108:22;2098:32;;2168:7;2161:4;2157:2;2153:13;2149:27;2139:2;;2195:6;2187;2180:22;2139:2;2236;2223:16;2258:2;2254;2251:10;2248:2;;;2264:18;;:::i;:::-;2306:53;2349:2;2330:13;;-1:-1:-1;;2326:27:1;2322:36;;2306:53;:::i;:::-;2293:66;;2382:2;2375:5;2368:17;2422:7;2417:2;2412;2408;2404:11;2400:20;2397:33;2394:2;;;2448:6;2440;2433:22;2394:2;2508;2503;2499;2495:11;2490:2;2483:5;2479:14;2466:45;2531:14;;2527:23;;;2520:39;;;;1562:1027;;;;-1:-1:-1;1562:1027:1;;-1:-1:-1;;1562:1027:1:o;2594:438::-;;;2720:2;2708:9;2699:7;2695:23;2691:32;2688:2;;;2741:6;2733;2726:22;2688:2;2785:9;2772:23;2804:33;2831:5;2804:33;:::i;:::-;2856:5;-1:-1:-1;2913:2:1;2898:18;;2885:32;2955:15;;2948:23;2936:36;;2926:2;;2991:6;2983;2976:22;3037:327;;;3166:2;3154:9;3145:7;3141:23;3137:32;3134:2;;;3187:6;3179;3172:22;3134:2;3231:9;3218:23;3250:33;3277:5;3250:33;:::i;:::-;3302:5;3354:2;3339:18;;;;3326:32;;-1:-1:-1;;;3124:240:1:o;3369:1080::-;;3484:2;3527;3515:9;3506:7;3502:23;3498:32;3495:2;;;3548:6;3540;3533:22;3495:2;3593:9;3580:23;3622:18;3663:2;3655:6;3652:14;3649:2;;;3684:6;3676;3669:22;3649:2;3727:6;3716:9;3712:22;3702:32;;3772:7;3765:4;3761:2;3757:13;3753:27;3743:2;;3799:6;3791;3784:22;3743:2;3840;3827:16;3862:2;3858;3855:10;3852:2;;;3868:18;;:::i;:::-;3915:2;3911;3907:11;3897:21;;3938:28;3962:2;3958;3954:11;3938:28;:::i;:::-;4000:15;;;4031:12;;;;4063:11;;;4093;;;4089:20;;4086:33;-1:-1:-1;4083:2:1;;;4137:6;4129;4122:22;4083:2;4164:6;4155:15;;4179:240;4193:2;4190:1;4187:9;4179:240;;;4264:3;4251:17;4238:30;;4281:33;4308:5;4281:33;:::i;:::-;4327:18;;;4211:1;4204:9;;;;;4365:12;;;;4397;;4179:240;;;-1:-1:-1;4438:5:1;3464:985;-1:-1:-1;;;;;;;;3464:985:1:o;4454:257::-;;4565:2;4553:9;4544:7;4540:23;4536:32;4533:2;;;4586:6;4578;4571:22;4533:2;4630:9;4617:23;4649:32;4675:5;4649:32;:::i;4716:261::-;;4838:2;4826:9;4817:7;4813:23;4809:32;4806:2;;;4859:6;4851;4844:22;4806:2;4896:9;4890:16;4915:32;4941:5;4915:32;:::i;4982:642::-;;;5114:2;5102:9;5093:7;5089:23;5085:32;5082:2;;;5135:6;5127;5120:22;5082:2;5180:9;5167:23;5209:18;5250:2;5242:6;5239:14;5236:2;;;5271:6;5263;5256:22;5236:2;5314:6;5303:9;5299:22;5289:32;;5359:7;5352:4;5348:2;5344:13;5340:27;5330:2;;5386:6;5378;5371:22;5330:2;5431;5418:16;5457:2;5449:6;5446:14;5443:2;;;5478:6;5470;5463:22;5443:2;5528:7;5523:2;5514:6;5510:2;5506:15;5502:24;5499:37;5496:2;;;5554:6;5546;5539:22;5496:2;5590;5582:11;;;;;5612:6;;-1:-1:-1;5072:552:1;;-1:-1:-1;;;;5072:552:1:o;5629:190::-;;5741:2;5729:9;5720:7;5716:23;5712:32;5709:2;;;5762:6;5754;5747:22;5709:2;-1:-1:-1;5790:23:1;;5699:120;-1:-1:-1;5699:120:1:o;5824:259::-;;5905:5;5899:12;5932:6;5927:3;5920:19;5948:63;6004:6;5997:4;5992:3;5988:14;5981:4;5974:5;5970:16;5948:63;:::i;:::-;6065:2;6044:15;-1:-1:-1;;6040:29:1;6031:39;;;;6072:4;6027:50;;5875:208;-1:-1:-1;;5875:208:1:o;6088:187::-;;6170:5;6164:12;6185:52;6230:6;6225:3;6218:4;6211:5;6207:16;6185:52;:::i;:::-;6253:16;;;;;6140:135;-1:-1:-1;;6140:135:1:o;6280:1181::-;6514:13;;6280:1181;;;;6587:1;6572:17;;6608:1;6644:18;;;;6671:2;;6725:4;6717:6;6713:17;6703:27;;6671:2;6751;6799;6791:6;6788:14;6768:18;6765:38;6762:2;;;-1:-1:-1;;;6826:33:1;;6882:4;6879:1;6872:15;6912:4;6833:3;6900:17;6762:2;6943:18;6970:104;;;;7088:1;7083:324;;;;6936:471;;6970:104;-1:-1:-1;;7003:24:1;;6991:37;;7048:16;;;;-1:-1:-1;6970:104:1;;7083:324;7119:39;7151:6;7119:39;:::i;:::-;7180:3;7196:165;7210:6;7207:1;7204:13;7196:165;;;7288:14;;7275:11;;;7268:35;7331:16;;;;7225:10;;7196:165;;;7200:3;;7390:6;7385:3;7381:16;7374:23;;6936:471;;;;;;;7423:32;7451:3;7443:6;7423:32;:::i;:::-;7416:39;6464:997;-1:-1:-1;;;;;6464:997:1:o;7466:203::-;-1:-1:-1;;;;;7630:32:1;;;;7612:51;;7600:2;7585:18;;7567:102::o;7674:490::-;-1:-1:-1;;;;;7943:15:1;;;7925:34;;7995:15;;7990:2;7975:18;;7968:43;8042:2;8027:18;;8020:34;;;8090:3;8085:2;8070:18;;8063:31;;;7674:490;;8111:47;;8138:19;;8130:6;8111:47;:::i;:::-;8103:55;7877:287;-1:-1:-1;;;;;;7877:287:1:o;8169:274::-;-1:-1:-1;;;;;8361:32:1;;;;8343:51;;8425:2;8410:18;;8403:34;8331:2;8316:18;;8298:145::o;8448:187::-;8613:14;;8606:22;8588:41;;8576:2;8561:18;;8543:92::o;8640:221::-;;8789:2;8778:9;8771:21;8809:46;8851:2;8840:9;8836:18;8828:6;8809:46;:::i;8866:407::-;9068:2;9050:21;;;9107:2;9087:18;;;9080:30;9146:34;9141:2;9126:18;;9119:62;-1:-1:-1;;;9212:2:1;9197:18;;9190:41;9263:3;9248:19;;9040:233::o;9278:414::-;9480:2;9462:21;;;9519:2;9499:18;;;9492:30;9558:34;9553:2;9538:18;;9531:62;-1:-1:-1;;;9624:2:1;9609:18;;9602:48;9682:3;9667:19;;9452:240::o;9697:402::-;9899:2;9881:21;;;9938:2;9918:18;;;9911:30;9977:34;9972:2;9957:18;;9950:62;-1:-1:-1;;;10043:2:1;10028:18;;10021:36;10089:3;10074:19;;9871:228::o;10104:352::-;10306:2;10288:21;;;10345:2;10325:18;;;10318:30;10384;10379:2;10364:18;;10357:58;10447:2;10432:18;;10278:178::o;10461:400::-;10663:2;10645:21;;;10702:2;10682:18;;;10675:30;10741:34;10736:2;10721:18;;10714:62;-1:-1:-1;;;10807:2:1;10792:18;;10785:34;10851:3;10836:19;;10635:226::o;10866:349::-;11068:2;11050:21;;;11107:2;11087:18;;;11080:30;11146:27;11141:2;11126:18;;11119:55;11206:2;11191:18;;11040:175::o;11220:408::-;11422:2;11404:21;;;11461:2;11441:18;;;11434:30;11500:34;11495:2;11480:18;;11473:62;-1:-1:-1;;;11566:2:1;11551:18;;11544:42;11618:3;11603:19;;11394:234::o;11633:337::-;11835:2;11817:21;;;11874:2;11854:18;;;11847:30;-1:-1:-1;;;11908:2:1;11893:18;;11886:43;11961:2;11946:18;;11807:163::o;11975:420::-;12177:2;12159:21;;;12216:2;12196:18;;;12189:30;12255:34;12250:2;12235:18;;12228:62;12326:26;12321:2;12306:18;;12299:54;12385:3;12370:19;;12149:246::o;12400:344::-;12602:2;12584:21;;;12641:2;12621:18;;;12614:30;-1:-1:-1;;;12675:2:1;12660:18;;12653:50;12735:2;12720:18;;12574:170::o;12749:406::-;12951:2;12933:21;;;12990:2;12970:18;;;12963:30;13029:34;13024:2;13009:18;;13002:62;-1:-1:-1;;;13095:2:1;13080:18;;13073:40;13145:3;13130:19;;12923:232::o;13160:405::-;13362:2;13344:21;;;13401:2;13381:18;;;13374:30;13440:34;13435:2;13420:18;;13413:62;-1:-1:-1;;;13506:2:1;13491:18;;13484:39;13555:3;13540:19;;13334:231::o;13570:351::-;13772:2;13754:21;;;13811:2;13791:18;;;13784:30;13850:29;13845:2;13830:18;;13823:57;13912:2;13897:18;;13744:177::o;13926:353::-;14128:2;14110:21;;;14167:2;14147:18;;;14140:30;14206:31;14201:2;14186:18;;14179:59;14270:2;14255:18;;14100:179::o;14284:356::-;14486:2;14468:21;;;14505:18;;;14498:30;14564:34;14559:2;14544:18;;14537:62;14631:2;14616:18;;14458:182::o;14645:408::-;14847:2;14829:21;;;14886:2;14866:18;;;14859:30;14925:34;14920:2;14905:18;;14898:62;-1:-1:-1;;;14991:2:1;14976:18;;14969:42;15043:3;15028:19;;14819:234::o;15058:356::-;15260:2;15242:21;;;15279:18;;;15272:30;15338:34;15333:2;15318:18;;15311:62;15405:2;15390:18;;15232:182::o;15419:405::-;15621:2;15603:21;;;15660:2;15640:18;;;15633:30;15699:34;15694:2;15679:18;;15672:62;-1:-1:-1;;;15765:2:1;15750:18;;15743:39;15814:3;15799:19;;15593:231::o;15829:411::-;16031:2;16013:21;;;16070:2;16050:18;;;16043:30;16109:34;16104:2;16089:18;;16082:62;-1:-1:-1;;;16175:2:1;16160:18;;16153:45;16230:3;16215:19;;16003:237::o;16245:344::-;16447:2;16429:21;;;16486:2;16466:18;;;16459:30;-1:-1:-1;;;16520:2:1;16505:18;;16498:50;16580:2;16565:18;;16419:170::o;16594:342::-;16796:2;16778:21;;;16835:2;16815:18;;;16808:30;-1:-1:-1;;;16869:2:1;16854:18;;16847:48;16927:2;16912:18;;16768:168::o;16941:397::-;17143:2;17125:21;;;17182:2;17162:18;;;17155:30;17221:34;17216:2;17201:18;;17194:62;-1:-1:-1;;;17287:2:1;17272:18;;17265:31;17328:3;17313:19;;17115:223::o;17343:413::-;17545:2;17527:21;;;17584:2;17564:18;;;17557:30;17623:34;17618:2;17603:18;;17596:62;-1:-1:-1;;;17689:2:1;17674:18;;17667:47;17746:3;17731:19;;17517:239::o;17761:337::-;17963:2;17945:21;;;18002:2;17982:18;;;17975:30;-1:-1:-1;;;18036:2:1;18021:18;;18014:43;18089:2;18074:18;;17935:163::o;18103:338::-;18305:2;18287:21;;;18344:2;18324:18;;;18317:30;-1:-1:-1;;;18378:2:1;18363:18;;18356:44;18432:2;18417:18;;18277:164::o;18446:408::-;18648:2;18630:21;;;18687:2;18667:18;;;18660:30;18726:34;18721:2;18706:18;;18699:62;-1:-1:-1;;;18792:2:1;18777:18;;18770:42;18844:3;18829:19;;18620:234::o;18859:177::-;19005:25;;;18993:2;18978:18;;18960:76::o;19041:275::-;19112:2;19106:9;19177:2;19158:13;;-1:-1:-1;;19154:27:1;19142:40;;19212:18;19197:34;;19233:22;;;19194:62;19191:2;;;19259:18;;:::i;:::-;19295:2;19288:22;19086:230;;-1:-1:-1;19086:230:1:o;19321:129::-;;19389:17;;;19439:4;19423:21;;;19379:71::o;19455:128::-;;19526:1;19522:6;19519:1;19516:13;19513:2;;;19532:18;;:::i;:::-;-1:-1:-1;19568:9:1;;19503:80::o;19588:120::-;;19654:1;19644:2;;19659:18;;:::i;:::-;-1:-1:-1;19693:9:1;;19634:74::o;19713:168::-;;19819:1;19815;19811:6;19807:14;19804:1;19801:21;19796:1;19789:9;19782:17;19778:45;19775:2;;;19826:18;;:::i;:::-;-1:-1:-1;19866:9:1;;19765:116::o;19886:125::-;;19954:1;19951;19948:8;19945:2;;;19959:18;;:::i;:::-;-1:-1:-1;19996:9:1;;19935:76::o;20016:258::-;20088:1;20098:113;20112:6;20109:1;20106:13;20098:113;;;20188:11;;;20182:18;20169:11;;;20162:39;20134:2;20127:10;20098:113;;;20229:6;20226:1;20223:13;20220:2;;;-1:-1:-1;;20264:1:1;20246:16;;20239:27;20069:205::o;20279:380::-;20364:1;20354:12;;20411:1;20401:12;;;20422:2;;20476:4;20468:6;20464:17;20454:27;;20422:2;20529;20521:6;20518:14;20498:18;20495:38;20492:2;;;20575:10;20570:3;20566:20;20563:1;20556:31;20610:4;20607:1;20600:15;20638:4;20635:1;20628:15;20492:2;;20334:325;;;:::o;20664:135::-;;-1:-1:-1;;20724:17:1;;20721:2;;;20744:18;;:::i;:::-;-1:-1:-1;20791:1:1;20780:13;;20711:88::o;20804:112::-;;20862:1;20852:2;;20867:18;;:::i;:::-;-1:-1:-1;20901:9:1;;20842:74::o;20921:127::-;20982:10;20977:3;20973:20;20970:1;20963:31;21013:4;21010:1;21003:15;21037:4;21034:1;21027:15;21053:127;21114:10;21109:3;21105:20;21102:1;21095:31;21145:4;21142:1;21135:15;21169:4;21166:1;21159:15;21185:127;21246:10;21241:3;21237:20;21234:1;21227:31;21277:4;21274:1;21267:15;21301:4;21298:1;21291:15;21317:133;-1:-1:-1;;;;;21394:31:1;;21384:42;;21374:2;;21440:1;21437;21430:12;21455:133;-1:-1:-1;;;;;;21531:32:1;;21521:43;;21511:2;;21578:1;21575;21568:12

Swarm Source

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