ETH Price: $3,398.39 (+2.56%)

Meta Girlfriends (MG)
 

Overview

TokenID

2033

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Meta Girlfriends are coming to the Metaverse. Each one is randomly generated and beautifully crafted using over 600 traits, across 20 categories.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MetaGirlfriends

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.6;

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




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

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

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

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

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




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

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






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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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);
    }
}











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

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

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

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

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

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

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

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

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

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

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

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





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







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

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

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





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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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









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


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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





//  __  __      _           _____ _      _  __      _                _     
// |  \/  |    | |         / ____(_)    | |/ _|    (_)              | |    
// | \  / | ___| |_ __ _  | |  __ _ _ __| | |_ _ __ _  ___ _ __   __| |___ 
// | |\/| |/ _ \ __/ _` | | | |_ | | '__| |  _| '__| |/ _ \ '_ \ / _` / __|
// | |  | |  __/ || (_| | | |__| | | |  | | | | |  | |  __/ | | | (_| \__ \
// |_|  |_|\___|\__\__,_|  \_____|_|_|  |_|_| |_|  |_|\___|_| |_|\__,_|___/                                                                         
//
// Meta Girlfriends / 2021 






contract MetaGirlfriends is ERC721, Ownable {
    using Strings for uint;

    event PriceChanged(uint256 newPrice);
    event BaseURIChanged(string newUriPrefix, string newUriSuffix);
    event TokenCombined( uint256 tokenId, uint256 newtraits, uint256 parent1, uint256 parent2);

    uint public price = 0.08 ether;
    uint public constant maxSupply = 10000;
    uint public constant giveAwayCount = 200;    
    bool public mintingEnabled = true;
    bool public whitelistEnabled = true;
    uint public buyLimit = 10;
    uint256 public giveAwaysReserved;
    uint256 public tokensReserved;
    uint256 public tokensMinted;
    uint256 public tokensBurnt;

    mapping(address => uint256) public reservedCount;
    mapping(uint256 => uint16) private levels;

    bool public combineEnabled;

    string private _baseURIPrefix = "https://metagirlfriends.com/api/metadata/";
    string private _baseURISuffix = "";
    address private signerAddress = 0x77bFCca6F45B07047a34A31885Af86F11033665B;
    address private treasury = 0xAb22AD2eDF9774C4aAe550165397Ebc6050a1f4E;
    address private dev1 = 0xDB4AAC095f709a62Ec24479404fAE45D24ade34b;
    address private dev2 = 0x353d285681458962eD5830672cbDeFcBB9b888A7;

    constructor () ERC721('Meta Girlfriends', 'MG') {
    }

    function totalSupply() external view returns (uint256){
        return tokensMinted - tokensBurnt;
    }

    // ========================== Girlfriends   ==============================    

    function getLevel(uint256 tokenId) external view returns (uint16){
        require(_exists(tokenId), 'MG: non existent tokenId');        
        return levels[tokenId];
    }

    function _hashCombine(address sender, uint256 gfId1, uint256 gfId2, uint256 newId, uint256 newtraits, string memory nonce) internal pure returns(bytes32) {
        return keccak256(abi.encodePacked( "\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(sender, gfId1, gfId2, newId, newtraits, nonce))));         
    }

    function combineGirlfriends(uint256 gfId1, uint256 gfId2, uint256 newId, uint256 newtraits, uint8 v, bytes32 r, bytes32 s, string memory nonce) external {
        require(combineEnabled, "MG: Combining GirlFriends is not enabled");
        require( ownerOf(gfId1) == _msgSender() && ownerOf(gfId2) == _msgSender(), "MG: Must own these GirlFriends");

        require(gfId1 == newId || gfId2 == newId, "MG: Invalid ID");

        require(signerAddress == ecrecover( _hashCombine( _msgSender(), gfId1, gfId2, newId, newtraits, nonce) , v, r, s), "MG: invalid hash or signature");

        levels[newId] = levels[gfId1] > levels[gfId2] ? levels[gfId1] + 1 : levels[gfId2] + 1;

        emit TokenCombined( newId, newtraits, gfId1, gfId2 );

        _burn( (newId == gfId1)? gfId2: gfId1 );
        tokensBurnt++;
    }  

    // ========================== Minting ==============================

    function _mintQuantity(uint256 quantity) internal {
        for (uint i = 0; i < quantity; i++) {
            levels[tokensMinted+i+1]=1;
            _safeMint(_msgSender(), tokensMinted+i+1);
        }
        tokensMinted += quantity;
    }

    // owner can mint up to giveAwayCount tokens for giveaways
    function mintForGiveaways(uint256 quantity) external onlyOwner {
        require(quantity > 0, "MG: Invalid quantity");
        require(tokensMinted+quantity <= maxSupply - tokensReserved, "MG: Max supply exceeded");
        require(giveAwaysReserved+quantity <= giveAwayCount, "MG: givaway count exceeded");
        giveAwaysReserved += quantity;            

        _mintQuantity(quantity);
    }

    function _mint(uint256 quantity) internal {
        require(quantity > 0, "MG: Invalid quantity");        

        require(tokensMinted+quantity <= maxSupply - tokensReserved, "MG: Max supply exceeded");
        require(quantity <= buyLimit, "MG: Buy limit per txn exceeded");
        require(price*quantity == msg.value, "MG: invalid price");

        // No eth stays on contract, they go directly to treasury
        payable(treasury).transfer(msg.value);

        _mintQuantity(quantity);
    }  

    function _hashMaxCount(address sender, uint8 maxCount, string memory nonce) internal pure returns(bytes32) {
        return keccak256(abi.encodePacked( "\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(sender, maxCount, nonce))));         
    }

    function presaleMint( uint256 quantity, uint8 v, bytes32 r, bytes32 s, uint8 maxCount, string memory nonce) external payable {

        require(mintingEnabled && whitelistEnabled, "MG: Presale minting disabled"); 

        // verify ECDSA signature for parameters maxCount
        require(signerAddress == ecrecover( _hashMaxCount( _msgSender(), maxCount, nonce) , v, r, s), "MG: invalid hash or signature");
        require(maxCount <= 10, "MG: maxCount must be <= 10");

        require( balanceOf(_msgSender())+quantity <= uint256(maxCount), "MG: White list count exceeded");
        _mint(quantity);
    }

    function publicMint(uint256 quantity) external payable {
        require(mintingEnabled && !whitelistEnabled, "MG: Public minting disabled"); 
        // Prevent minting from smart contract
        require(_msgSender() == tx.origin, "MG: not EOA");
        _mint(quantity);
    }  

    function reserve(uint256 quantity) external payable {
        require(mintingEnabled && !whitelistEnabled, "MG: Public minting disabled"); 
        require(quantity > 0, "MG: Invalid quantity");

        require(tokensMinted+quantity <= maxSupply - tokensReserved, "MG: Max supply exceeded");
        require(reservedCount[_msgSender()]+quantity <= buyLimit, "MG: Maximum reservations exceeded");        
        require(price*quantity == msg.value, "MG: invalid price");

        // Prevent minting from smart contract
        require(_msgSender() == tx.origin, "MG: not EOA");

        // No eth stays on contract, they go directly to treasury
        payable(treasury).transfer(msg.value);        

        tokensReserved += quantity;
        reservedCount[_msgSender()] += uint16(quantity);
    }


    function claim() external {
        require(reservedCount[_msgSender()]>0, "MG: Nothing to claim");

        _mintQuantity(reservedCount[_msgSender()]);
        tokensReserved -= reservedCount[_msgSender()];
        reservedCount[_msgSender()] = 0;
    }


    // ========================== Other ==============================

    function withdraw() external onlyOwner{
        payable(_msgSender()).transfer(address(this).balance);
    }

    /*
    * @dev Gives access to dev or owner only
    */
    modifier devOrOwner() {
        _devOrOwner();
        _;
    }

    function _devOrOwner() internal view {
        require( (owner()==_msgSender())||(dev1==_msgSender())||(dev2==_msgSender()), "MG: Signer is not dev nor owner");
    }

    function setDevs(address newDev1, address newDev2) external onlyOwner{
        dev1 = newDev1;
        dev2 = newDev2;
    } 

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return bytes(_baseURIPrefix).length > 0 ? string(abi.encodePacked(_baseURIPrefix, tokenId.toString(), _baseURISuffix)) : "";
    }

    function setBaseURI(string memory newUriPrefix, string memory newUriSuffix) external devOrOwner{
        _baseURIPrefix = newUriPrefix;
        _baseURISuffix = newUriSuffix;
        emit BaseURIChanged(newUriPrefix, newUriSuffix);
    }

    function toggleWhitelist() external devOrOwner{
        whitelistEnabled = !whitelistEnabled;
    }  

    function setPrice(uint256 newPrice) external devOrOwner{
        price = newPrice;
        emit PriceChanged(newPrice);
    } 

    function setBuyLimit(uint256 newBuyLimit) external devOrOwner{
        buyLimit = newBuyLimit;
    }

    function setSigner(address newSigner) external devOrOwner{
        signerAddress = newSigner;
    }

    function toggleMinting() external devOrOwner{
        mintingEnabled = !mintingEnabled;
    }

    function toggleCombining() external devOrOwner{
        combineEnabled = !combineEnabled;
    } 
}

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":false,"internalType":"string","name":"newUriPrefix","type":"string"},{"indexed":false,"internalType":"string","name":"newUriSuffix","type":"string"}],"name":"BaseURIChanged","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":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"PriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newtraits","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"parent1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"parent2","type":"uint256"}],"name":"TokenCombined","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"combineEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gfId1","type":"uint256"},{"internalType":"uint256","name":"gfId2","type":"uint256"},{"internalType":"uint256","name":"newId","type":"uint256"},{"internalType":"uint256","name":"newtraits","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"string","name":"nonce","type":"string"}],"name":"combineGirlfriends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getLevel","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveAwayCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveAwaysReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintForGiveaways","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"maxCount","type":"uint8"},{"internalType":"string","name":"nonce","type":"string"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reservedCount","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":"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":"newUriPrefix","type":"string"},{"internalType":"string","name":"newUriSuffix","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBuyLimit","type":"uint256"}],"name":"setBuyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDev1","type":"address"},{"internalType":"address","name":"newDev2","type":"address"}],"name":"setDevs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigner","type":"address"}],"name":"setSigner","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":"toggleCombining","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensBurnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

67011c37937e0800006007556008805461ffff1916610101179055600a60095560e06040526029608081815290620031e560a03980516200004991601191602090910190620001de565b506040805160208101918290526000908190526200006a91601291620001de565b50601380546001600160a01b03199081167377bfcca6f45b07047a34a31885af86f11033665b1790915560148054821673ab22ad2edf9774c4aae550165397ebc6050a1f4e17905560158054821673db4aac095f709a62ec24479404fae45d24ade34b1790556016805490911673353d285681458962ed5830672cbdefcbb9b888a7179055348015620000fc57600080fd5b50604080518082018252601081526f4d657461204769726c667269656e647360801b6020808301918252835180850190945260028452614d4760f01b9084015281519192916200014f91600091620001de565b50805162000165906001906020840190620001de565b505050620001826200017c6200018860201b60201c565b6200018c565b620002c1565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001ec9062000284565b90600052602060002090601f0160209004810192826200021057600085556200025b565b82601f106200022b57805160ff19168380011785556200025b565b828001600101855582156200025b579182015b828111156200025b5782518255916020019190600101906200023e565b50620002699291506200026d565b5090565b5b808211156200026957600081556001016200026e565b600181811c908216806200029957607f821691505b60208210811415620002bb57634e487b7160e01b600052602260045260246000fd5b50919050565b612f1480620002d16000396000f3fe6080604052600436106102725760003560e01c80637e15144b1161014f578063a22cb465116100c1578063d5abeb011161007a578063d5abeb01146106e1578063d6526905146106f7578063db95f93c14610717578063dd31ee2d14610737578063e985e9c514610757578063f2fde38b146107a057600080fd5b8063a22cb46514610631578063b88d4fde14610651578063bfbe109e14610671578063c6ead8af14610691578063c87b56dd146106a7578063d2478c66146106c757600080fd5b806391b7f5ed1161011357806391b7f5ed1461058c5780639525d161146105ac57806395d89b41146105bf5780639b1c408f146105d45780639fd6db1214610601578063a035b1fe1461061b57600080fd5b80637e15144b146104fe578063819b25ba1461051357806381bbd0001461052657806386481d401461053b5780638da5cb5b1461056e57600080fd5b8063433adb05116101e85780636790a9de116101ac5780636790a9de1461045e5780636c19e7831461047e5780636de9f32b1461049e57806370a08231146104b4578063715018a6146104d45780637d55094d146104e957600080fd5b8063433adb05146103de5780634e71d92d146103f457806351fb012d14610409578063589210d9146104285780636352211e1461043e57600080fd5b806318160ddd1161023a57806318160ddd1461034c57806323b872dd146103615780632db1154414610381578063344fb88d146103945780633ccfd60b146103a957806342842e0e146103be57600080fd5b806301ffc9a71461027757806306fdde03146102ac578063081812fc146102ce578063095ea7b3146103065780631012f32c14610328575b600080fd5b34801561028357600080fd5b50610297610292366004612849565b6107c0565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c1610812565b6040516102a39190612bd4565b3480156102da57600080fd5b506102ee6102e93660046128e7565b6108a4565b6040516001600160a01b0390911681526020016102a3565b34801561031257600080fd5b5061032661032136600461281f565b61093e565b005b34801561033457600080fd5b5061033e600a5481565b6040519081526020016102a3565b34801561035857600080fd5b5061033e610a54565b34801561036d57600080fd5b5061032661037c36600461272b565b610a6b565b61032661038f3660046128e7565b610a9c565b3480156103a057600080fd5b5061033e60c881565b3480156103b557600080fd5b50610326610b4b565b3480156103ca57600080fd5b506103266103d936600461272b565b610ba1565b3480156103ea57600080fd5b5061033e600b5481565b34801561040057600080fd5b50610326610bbc565b34801561041557600080fd5b5060085461029790610100900460ff1681565b34801561043457600080fd5b5061033e60095481565b34801561044a57600080fd5b506102ee6104593660046128e7565b610c62565b34801561046a57600080fd5b50610326610479366004612883565b610cd9565b34801561048a57600080fd5b506103266104993660046126dd565b610d46565b3480156104aa57600080fd5b5061033e600c5481565b3480156104c057600080fd5b5061033e6104cf3660046126dd565b610d70565b3480156104e057600080fd5b50610326610df7565b3480156104f557600080fd5b50610326610e2d565b34801561050a57600080fd5b50610326610e49565b6103266105213660046128e7565b610e6e565b34801561053257600080fd5b506103266110ae565b34801561054757600080fd5b5061055b6105563660046128e7565b6110ca565b60405161ffff90911681526020016102a3565b34801561057a57600080fd5b506006546001600160a01b03166102ee565b34801561059857600080fd5b506103266105a73660046128e7565b611145565b6103266105ba366004612988565b611188565b3480156105cb57600080fd5b506102c161137c565b3480156105e057600080fd5b5061033e6105ef3660046126dd565b600e6020526000908152604090205481565b34801561060d57600080fd5b506008546102979060ff1681565b34801561062757600080fd5b5061033e60075481565b34801561063d57600080fd5b5061032661064c3660046127e3565b61138b565b34801561065d57600080fd5b5061032661066c366004612767565b611450565b34801561067d57600080fd5b5061032661068c3660046128e7565b611488565b34801561069d57600080fd5b5061033e600d5481565b3480156106b357600080fd5b506102c16106c23660046128e7565b61158c565b3480156106d357600080fd5b506010546102979060ff1681565b3480156106ed57600080fd5b5061033e61271081565b34801561070357600080fd5b50610326610712366004612900565b61166a565b34801561072357600080fd5b506103266107323660046126f8565b61195e565b34801561074357600080fd5b506103266107523660046128e7565b6119b6565b34801561076357600080fd5b506102976107723660046126f8565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107ac57600080fd5b506103266107bb3660046126dd565b6119c3565b60006001600160e01b031982166380ac58cd60e01b14806107f157506001600160e01b03198216635b5e139f60e01b145b8061080c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461082190612e06565b80601f016020809104026020016040519081016040528092919081815260200182805461084d90612e06565b801561089a5780601f1061086f5761010080835404028352916020019161089a565b820191906000526020600020905b81548152906001019060200180831161087d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109225760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061094982610c62565b9050806001600160a01b0316836001600160a01b031614156109b75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610919565b336001600160a01b03821614806109d357506109d38133610772565b610a455760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610919565b610a4f8383611a5b565b505050565b6000600d54600c54610a669190612dc3565b905090565b610a753382611ac9565b610a915760405162461bcd60e51b815260040161091990612d01565b610a4f838383611bc0565b60085460ff168015610ab65750600854610100900460ff16155b610b025760405162461bcd60e51b815260206004820152601b60248201527f4d473a205075626c6963206d696e74696e672064697361626c656400000000006044820152606401610919565b333214610b3f5760405162461bcd60e51b815260206004820152600b60248201526a4d473a206e6f7420454f4160a81b6044820152606401610919565b610b4881611d60565b50565b6006546001600160a01b03163314610b755760405162461bcd60e51b815260040161091990612c9e565b60405133904780156108fc02916000818181858888f19350505050158015610b48573d6000803e3d6000fd5b610a4f83838360405180602001604052806000815250611450565b336000908152600e6020526040902054610c0f5760405162461bcd60e51b81526020600482015260146024820152734d473a204e6f7468696e6720746f20636c61696d60601b6044820152606401610919565b336000908152600e6020526040902054610c2890611e9c565b336000908152600e6020526040812054600b805491929091610c4b908490612dc3565b9091555050336000908152600e6020526040812055565b6000818152600260205260408120546001600160a01b03168061080c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610919565b610ce1611f31565b8151610cf490601190602085019061257a565b508051610d0890601290602084019061257a565b507fc41b7cb64e5be01af4afc2641afc861432136270f4206b7773f229b658b966998282604051610d3a929190612be7565b60405180910390a15050565b610d4e611f31565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216610ddb5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610919565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610e215760405162461bcd60e51b815260040161091990612c9e565b610e2b6000611fb5565b565b610e35611f31565b6008805460ff19811660ff90911615179055565b610e51611f31565b6008805461ff001981166101009182900460ff1615909102179055565b60085460ff168015610e885750600854610100900460ff16155b610ed45760405162461bcd60e51b815260206004820152601b60248201527f4d473a205075626c6963206d696e74696e672064697361626c656400000000006044820152606401610919565b60008111610ef45760405162461bcd60e51b815260040161091990612cd3565b600b54610f0390612710612dc3565b81600c54610f119190612d78565b1115610f2f5760405162461bcd60e51b815260040161091990612c15565b600954336000908152600e6020526040902054610f4d908390612d78565b1115610fa55760405162461bcd60e51b815260206004820152602160248201527f4d473a204d6178696d756d207265736572766174696f6e7320657863656564656044820152601960fa1b6064820152608401610919565b3481600754610fb49190612da4565b14610ff55760405162461bcd60e51b81526020600482015260116024820152704d473a20696e76616c696420707269636560781b6044820152606401610919565b3332146110325760405162461bcd60e51b815260206004820152600b60248201526a4d473a206e6f7420454f4160a81b6044820152606401610919565b6014546040516001600160a01b03909116903480156108fc02916000818181858888f1935050505015801561106b573d6000803e3d6000fd5b5080600b600082825461107e9190612d78565b9091555050336000908152600e60205260408120805461ffff841692906110a6908490612d78565b909155505050565b6110b6611f31565b6010805460ff19811660ff90911615179055565b6000818152600260205260408120546001600160a01b031661112e5760405162461bcd60e51b815260206004820152601860248201527f4d473a206e6f6e206578697374656e7420746f6b656e496400000000000000006044820152606401610919565b506000908152600f602052604090205461ffff1690565b61114d611f31565b60078190556040518181527fa6dc15bdb68da224c66db4b3838d9a2b205138e8cff6774e57d0af91e196d6229060200160405180910390a150565b60085460ff1680156111a15750600854610100900460ff165b6111ed5760405162461bcd60e51b815260206004820152601c60248201527f4d473a2050726573616c65206d696e74696e672064697361626c6564000000006044820152606401610919565b60016111fa338484612007565b6040805160008152602081018083529290925260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611248573d6000803e3d6000fd5b5050604051601f1901516013546001600160a01b0390811691161490506112b15760405162461bcd60e51b815260206004820152601d60248201527f4d473a20696e76616c69642068617368206f72207369676e61747572650000006044820152606401610919565b600a8260ff1611156113055760405162461bcd60e51b815260206004820152601a60248201527f4d473a206d6178436f756e74206d757374206265203c3d2031300000000000006044820152606401610919565b60ff82168661131333610d70565b61131d9190612d78565b111561136b5760405162461bcd60e51b815260206004820152601d60248201527f4d473a205768697465206c69737420636f756e742065786365656465640000006044820152606401610919565b61137486611d60565b505050505050565b60606001805461082190612e06565b6001600160a01b0382163314156113e45760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610919565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61145a3383611ac9565b6114765760405162461bcd60e51b815260040161091990612d01565b61148284848484612086565b50505050565b6006546001600160a01b031633146114b25760405162461bcd60e51b815260040161091990612c9e565b600081116114d25760405162461bcd60e51b815260040161091990612cd3565b600b546114e190612710612dc3565b81600c546114ef9190612d78565b111561150d5760405162461bcd60e51b815260040161091990612c15565b60c881600a5461151d9190612d78565b111561156b5760405162461bcd60e51b815260206004820152601a60248201527f4d473a206769766177617920636f756e742065786365656465640000000000006044820152606401610919565b80600a600082825461157d9190612d78565b90915550610b48905081611e9c565b6000818152600260205260409020546060906001600160a01b031661160b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610919565b60006011805461161a90612e06565b905011611636576040518060200160405280600081525061080c565b6011611641836120b9565b601260405160200161165593929190612b64565b60405160208183030381529060405292915050565b60105460ff166116cd5760405162461bcd60e51b815260206004820152602860248201527f4d473a20436f6d62696e696e67204769726c467269656e6473206973206e6f7460448201526708195b98589b195960c21b6064820152608401610919565b336116d789610c62565b6001600160a01b03161480156116fd5750336116f288610c62565b6001600160a01b0316145b6117495760405162461bcd60e51b815260206004820152601e60248201527f4d473a204d757374206f776e207468657365204769726c467269656e647300006044820152606401610919565b8588148061175657508587145b6117935760405162461bcd60e51b815260206004820152600e60248201526d1351ce88125b9d985b1a5908125160921b6044820152606401610919565b60016117a3338a8a8a8a876121b7565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156117f1573d6000803e3d6000fd5b5050604051601f1901516013546001600160a01b03908116911614905061185a5760405162461bcd60e51b815260206004820152601d60248201527f4d473a20696e76616c69642068617368206f72207369676e61747572650000006044820152606401610919565b6000878152600f6020526040808220548a835291205461ffff9182169116116118a0576000878152600f602052604090205461189b9061ffff166001612d52565b6118be565b6000888152600f60205260409020546118be9061ffff166001612d52565b6000878152600f6020908152604091829020805461ffff191661ffff949094169390931790925580518881529182018790528101899052606081018890527fbc88f1fc139c089c9b3bab49b092f3d5a2a87294c201c5eb2b5ce70eb6eb26999060800160405180910390a161193f888714611939578861223f565b8761223f565b600d805490600061194f83612e41565b91905055505050505050505050565b6006546001600160a01b031633146119885760405162461bcd60e51b815260040161091990612c9e565b601580546001600160a01b039384166001600160a01b03199182161790915560168054929093169116179055565b6119be611f31565b600955565b6006546001600160a01b031633146119ed5760405162461bcd60e51b815260040161091990612c9e565b6001600160a01b038116611a525760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610919565b610b4881611fb5565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a9082610c62565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611b425760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610919565b6000611b4d83610c62565b9050806001600160a01b0316846001600160a01b03161480611b885750836001600160a01b0316611b7d846108a4565b6001600160a01b0316145b80611bb857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611bd382610c62565b6001600160a01b031614611c3b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610919565b6001600160a01b038216611c9d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610919565b611ca8600082611a5b565b6001600160a01b0383166000908152600360205260408120805460019290611cd1908490612dc3565b90915550506001600160a01b0382166000908152600360205260408120805460019290611cff908490612d78565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008111611d805760405162461bcd60e51b815260040161091990612cd3565b600b54611d8f90612710612dc3565b81600c54611d9d9190612d78565b1115611dbb5760405162461bcd60e51b815260040161091990612c15565b600954811115611e0d5760405162461bcd60e51b815260206004820152601e60248201527f4d473a20427579206c696d6974207065722074786e20657863656564656400006044820152606401610919565b3481600754611e1c9190612da4565b14611e5d5760405162461bcd60e51b81526020600482015260116024820152704d473a20696e76616c696420707269636560781b6044820152606401610919565b6014546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015611e96573d6000803e3d6000fd5b50610b48815b60005b81811015611f1e576001600f600083600c54611ebb9190612d78565b611ec6906001612d78565b81526020810191909152604001600020805461ffff191661ffff92909216919091179055611f0c3382600c54611efc9190612d78565b611f07906001612d78565b6122da565b80611f1681612e41565b915050611e9f565b5080600c60008282546110a69190612d78565b6006546001600160a01b0316331480611f5457506015546001600160a01b031633145b80611f6957506016546001600160a01b031633145b610e2b5760405162461bcd60e51b815260206004820152601f60248201527f4d473a205369676e6572206973206e6f7420646576206e6f72206f776e6572006044820152606401610919565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600083838360405160200161201e93929190612b1c565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c016040516020818303038152906040528051906020012090509392505050565b612091848484611bc0565b61209d848484846122f8565b6114825760405162461bcd60e51b815260040161091990612c4c565b6060816120dd5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561210757806120f181612e41565b91506121009050600a83612d90565b91506120e1565b60008167ffffffffffffffff81111561212257612122612eb2565b6040519080825280601f01601f19166020018201604052801561214c576020820181803683370190505b5090505b8415611bb857612161600183612dc3565b915061216e600a86612e5c565b612179906030612d78565b60f81b81838151811061218e5761218e612e9c565b60200101906001600160f81b031916908160001a9053506121b0600a86612d90565b9450612150565b60008686868686866040516020016121d496959493929190612ac8565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c016040516020818303038152906040528051906020012090509695505050505050565b600061224a82610c62565b9050612257600083611a5b565b6001600160a01b0381166000908152600360205260408120805460019290612280908490612dc3565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6122f4828260405180602001604052806000815250612405565b5050565b60006001600160a01b0384163b156123fa57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061233c903390899088908890600401612b97565b602060405180830381600087803b15801561235657600080fd5b505af1925050508015612386575060408051601f3d908101601f1916820190925261238391810190612866565b60015b6123e0573d8080156123b4576040519150601f19603f3d011682016040523d82523d6000602084013e6123b9565b606091505b5080516123d85760405162461bcd60e51b815260040161091990612c4c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611bb8565b506001949350505050565b61240f8383612438565b61241c60008484846122f8565b610a4f5760405162461bcd60e51b815260040161091990612c4c565b6001600160a01b03821661248e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610919565b6000818152600260205260409020546001600160a01b0316156124f35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610919565b6001600160a01b038216600090815260036020526040812080546001929061251c908490612d78565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461258690612e06565b90600052602060002090601f0160209004810192826125a857600085556125ee565b82601f106125c157805160ff19168380011785556125ee565b828001600101855582156125ee579182015b828111156125ee5782518255916020019190600101906125d3565b506125fa9291506125fe565b5090565b5b808211156125fa57600081556001016125ff565b600067ffffffffffffffff8084111561262e5761262e612eb2565b604051601f8501601f19908116603f0116810190828211818310171561265657612656612eb2565b8160405280935085815286868601111561266f57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146126a057600080fd5b919050565b600082601f8301126126b657600080fd5b6126c583833560208501612613565b9392505050565b803560ff811681146126a057600080fd5b6000602082840312156126ef57600080fd5b6126c582612689565b6000806040838503121561270b57600080fd5b61271483612689565b915061272260208401612689565b90509250929050565b60008060006060848603121561274057600080fd5b61274984612689565b925061275760208501612689565b9150604084013590509250925092565b6000806000806080858703121561277d57600080fd5b61278685612689565b935061279460208601612689565b925060408501359150606085013567ffffffffffffffff8111156127b757600080fd5b8501601f810187136127c857600080fd5b6127d787823560208401612613565b91505092959194509250565b600080604083850312156127f657600080fd5b6127ff83612689565b91506020830135801515811461281457600080fd5b809150509250929050565b6000806040838503121561283257600080fd5b61283b83612689565b946020939093013593505050565b60006020828403121561285b57600080fd5b81356126c581612ec8565b60006020828403121561287857600080fd5b81516126c581612ec8565b6000806040838503121561289657600080fd5b823567ffffffffffffffff808211156128ae57600080fd5b6128ba868387016126a5565b935060208501359150808211156128d057600080fd5b506128dd858286016126a5565b9150509250929050565b6000602082840312156128f957600080fd5b5035919050565b600080600080600080600080610100898b03121561291d57600080fd5b8835975060208901359650604089013595506060890135945061294260808a016126cc565b935060a0890135925060c0890135915060e089013567ffffffffffffffff81111561296c57600080fd5b6129788b828c016126a5565b9150509295985092959890939650565b60008060008060008060c087890312156129a157600080fd5b863595506129b1602088016126cc565b945060408701359350606087013592506129cd608088016126cc565b915060a087013567ffffffffffffffff8111156129e957600080fd5b6129f589828a016126a5565b9150509295509295509295565b60008151808452612a1a816020860160208601612dda565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680612a4857607f831692505b6020808410821415612a6a57634e487b7160e01b600052602260045260246000fd5b818015612a7e5760018114612a8f57612abc565b60ff19861689528489019650612abc565b60008881526020902060005b86811015612ab45781548b820152908501908301612a9b565b505084890196505b50505050505092915050565b6bffffffffffffffffffffffff198760601b16815285601482015284603482015283605482015282607482015260008251612b0a816094850160208701612dda565b91909101609401979650505050505050565b6bffffffffffffffffffffffff198460601b16815260ff60f81b8360f81b16601482015260008251612b55816015850160208701612dda565b91909101601501949350505050565b6000612b708286612a2e565b8451612b80818360208901612dda565b612b8c81830186612a2e565b979650505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bca90830184612a02565b9695505050505050565b6020815260006126c56020830184612a02565b604081526000612bfa6040830185612a02565b8281036020840152612c0c8185612a02565b95945050505050565b60208082526017908201527f4d473a204d617820737570706c79206578636565646564000000000000000000604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734d473a20496e76616c6964207175616e7469747960601b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600061ffff808316818516808303821115612d6f57612d6f612e70565b01949350505050565b60008219821115612d8b57612d8b612e70565b500190565b600082612d9f57612d9f612e86565b500490565b6000816000190483118215151615612dbe57612dbe612e70565b500290565b600082821015612dd557612dd5612e70565b500390565b60005b83811015612df5578181015183820152602001612ddd565b838111156114825750506000910152565b600181811c90821680612e1a57607f821691505b60208210811415612e3b57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e5557612e55612e70565b5060010190565b600082612e6b57612e6b612e86565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610b4857600080fdfea2646970667358221220ca41ce3a2ed02f12ab42569024d458da16ca77dbd3b68421dcf3fd201a8612be64736f6c6343000806003368747470733a2f2f6d6574616769726c667269656e64732e636f6d2f6170692f6d657461646174612f

Deployed Bytecode

0x6080604052600436106102725760003560e01c80637e15144b1161014f578063a22cb465116100c1578063d5abeb011161007a578063d5abeb01146106e1578063d6526905146106f7578063db95f93c14610717578063dd31ee2d14610737578063e985e9c514610757578063f2fde38b146107a057600080fd5b8063a22cb46514610631578063b88d4fde14610651578063bfbe109e14610671578063c6ead8af14610691578063c87b56dd146106a7578063d2478c66146106c757600080fd5b806391b7f5ed1161011357806391b7f5ed1461058c5780639525d161146105ac57806395d89b41146105bf5780639b1c408f146105d45780639fd6db1214610601578063a035b1fe1461061b57600080fd5b80637e15144b146104fe578063819b25ba1461051357806381bbd0001461052657806386481d401461053b5780638da5cb5b1461056e57600080fd5b8063433adb05116101e85780636790a9de116101ac5780636790a9de1461045e5780636c19e7831461047e5780636de9f32b1461049e57806370a08231146104b4578063715018a6146104d45780637d55094d146104e957600080fd5b8063433adb05146103de5780634e71d92d146103f457806351fb012d14610409578063589210d9146104285780636352211e1461043e57600080fd5b806318160ddd1161023a57806318160ddd1461034c57806323b872dd146103615780632db1154414610381578063344fb88d146103945780633ccfd60b146103a957806342842e0e146103be57600080fd5b806301ffc9a71461027757806306fdde03146102ac578063081812fc146102ce578063095ea7b3146103065780631012f32c14610328575b600080fd5b34801561028357600080fd5b50610297610292366004612849565b6107c0565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c1610812565b6040516102a39190612bd4565b3480156102da57600080fd5b506102ee6102e93660046128e7565b6108a4565b6040516001600160a01b0390911681526020016102a3565b34801561031257600080fd5b5061032661032136600461281f565b61093e565b005b34801561033457600080fd5b5061033e600a5481565b6040519081526020016102a3565b34801561035857600080fd5b5061033e610a54565b34801561036d57600080fd5b5061032661037c36600461272b565b610a6b565b61032661038f3660046128e7565b610a9c565b3480156103a057600080fd5b5061033e60c881565b3480156103b557600080fd5b50610326610b4b565b3480156103ca57600080fd5b506103266103d936600461272b565b610ba1565b3480156103ea57600080fd5b5061033e600b5481565b34801561040057600080fd5b50610326610bbc565b34801561041557600080fd5b5060085461029790610100900460ff1681565b34801561043457600080fd5b5061033e60095481565b34801561044a57600080fd5b506102ee6104593660046128e7565b610c62565b34801561046a57600080fd5b50610326610479366004612883565b610cd9565b34801561048a57600080fd5b506103266104993660046126dd565b610d46565b3480156104aa57600080fd5b5061033e600c5481565b3480156104c057600080fd5b5061033e6104cf3660046126dd565b610d70565b3480156104e057600080fd5b50610326610df7565b3480156104f557600080fd5b50610326610e2d565b34801561050a57600080fd5b50610326610e49565b6103266105213660046128e7565b610e6e565b34801561053257600080fd5b506103266110ae565b34801561054757600080fd5b5061055b6105563660046128e7565b6110ca565b60405161ffff90911681526020016102a3565b34801561057a57600080fd5b506006546001600160a01b03166102ee565b34801561059857600080fd5b506103266105a73660046128e7565b611145565b6103266105ba366004612988565b611188565b3480156105cb57600080fd5b506102c161137c565b3480156105e057600080fd5b5061033e6105ef3660046126dd565b600e6020526000908152604090205481565b34801561060d57600080fd5b506008546102979060ff1681565b34801561062757600080fd5b5061033e60075481565b34801561063d57600080fd5b5061032661064c3660046127e3565b61138b565b34801561065d57600080fd5b5061032661066c366004612767565b611450565b34801561067d57600080fd5b5061032661068c3660046128e7565b611488565b34801561069d57600080fd5b5061033e600d5481565b3480156106b357600080fd5b506102c16106c23660046128e7565b61158c565b3480156106d357600080fd5b506010546102979060ff1681565b3480156106ed57600080fd5b5061033e61271081565b34801561070357600080fd5b50610326610712366004612900565b61166a565b34801561072357600080fd5b506103266107323660046126f8565b61195e565b34801561074357600080fd5b506103266107523660046128e7565b6119b6565b34801561076357600080fd5b506102976107723660046126f8565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107ac57600080fd5b506103266107bb3660046126dd565b6119c3565b60006001600160e01b031982166380ac58cd60e01b14806107f157506001600160e01b03198216635b5e139f60e01b145b8061080c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461082190612e06565b80601f016020809104026020016040519081016040528092919081815260200182805461084d90612e06565b801561089a5780601f1061086f5761010080835404028352916020019161089a565b820191906000526020600020905b81548152906001019060200180831161087d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109225760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061094982610c62565b9050806001600160a01b0316836001600160a01b031614156109b75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610919565b336001600160a01b03821614806109d357506109d38133610772565b610a455760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610919565b610a4f8383611a5b565b505050565b6000600d54600c54610a669190612dc3565b905090565b610a753382611ac9565b610a915760405162461bcd60e51b815260040161091990612d01565b610a4f838383611bc0565b60085460ff168015610ab65750600854610100900460ff16155b610b025760405162461bcd60e51b815260206004820152601b60248201527f4d473a205075626c6963206d696e74696e672064697361626c656400000000006044820152606401610919565b333214610b3f5760405162461bcd60e51b815260206004820152600b60248201526a4d473a206e6f7420454f4160a81b6044820152606401610919565b610b4881611d60565b50565b6006546001600160a01b03163314610b755760405162461bcd60e51b815260040161091990612c9e565b60405133904780156108fc02916000818181858888f19350505050158015610b48573d6000803e3d6000fd5b610a4f83838360405180602001604052806000815250611450565b336000908152600e6020526040902054610c0f5760405162461bcd60e51b81526020600482015260146024820152734d473a204e6f7468696e6720746f20636c61696d60601b6044820152606401610919565b336000908152600e6020526040902054610c2890611e9c565b336000908152600e6020526040812054600b805491929091610c4b908490612dc3565b9091555050336000908152600e6020526040812055565b6000818152600260205260408120546001600160a01b03168061080c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610919565b610ce1611f31565b8151610cf490601190602085019061257a565b508051610d0890601290602084019061257a565b507fc41b7cb64e5be01af4afc2641afc861432136270f4206b7773f229b658b966998282604051610d3a929190612be7565b60405180910390a15050565b610d4e611f31565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216610ddb5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610919565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610e215760405162461bcd60e51b815260040161091990612c9e565b610e2b6000611fb5565b565b610e35611f31565b6008805460ff19811660ff90911615179055565b610e51611f31565b6008805461ff001981166101009182900460ff1615909102179055565b60085460ff168015610e885750600854610100900460ff16155b610ed45760405162461bcd60e51b815260206004820152601b60248201527f4d473a205075626c6963206d696e74696e672064697361626c656400000000006044820152606401610919565b60008111610ef45760405162461bcd60e51b815260040161091990612cd3565b600b54610f0390612710612dc3565b81600c54610f119190612d78565b1115610f2f5760405162461bcd60e51b815260040161091990612c15565b600954336000908152600e6020526040902054610f4d908390612d78565b1115610fa55760405162461bcd60e51b815260206004820152602160248201527f4d473a204d6178696d756d207265736572766174696f6e7320657863656564656044820152601960fa1b6064820152608401610919565b3481600754610fb49190612da4565b14610ff55760405162461bcd60e51b81526020600482015260116024820152704d473a20696e76616c696420707269636560781b6044820152606401610919565b3332146110325760405162461bcd60e51b815260206004820152600b60248201526a4d473a206e6f7420454f4160a81b6044820152606401610919565b6014546040516001600160a01b03909116903480156108fc02916000818181858888f1935050505015801561106b573d6000803e3d6000fd5b5080600b600082825461107e9190612d78565b9091555050336000908152600e60205260408120805461ffff841692906110a6908490612d78565b909155505050565b6110b6611f31565b6010805460ff19811660ff90911615179055565b6000818152600260205260408120546001600160a01b031661112e5760405162461bcd60e51b815260206004820152601860248201527f4d473a206e6f6e206578697374656e7420746f6b656e496400000000000000006044820152606401610919565b506000908152600f602052604090205461ffff1690565b61114d611f31565b60078190556040518181527fa6dc15bdb68da224c66db4b3838d9a2b205138e8cff6774e57d0af91e196d6229060200160405180910390a150565b60085460ff1680156111a15750600854610100900460ff165b6111ed5760405162461bcd60e51b815260206004820152601c60248201527f4d473a2050726573616c65206d696e74696e672064697361626c6564000000006044820152606401610919565b60016111fa338484612007565b6040805160008152602081018083529290925260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611248573d6000803e3d6000fd5b5050604051601f1901516013546001600160a01b0390811691161490506112b15760405162461bcd60e51b815260206004820152601d60248201527f4d473a20696e76616c69642068617368206f72207369676e61747572650000006044820152606401610919565b600a8260ff1611156113055760405162461bcd60e51b815260206004820152601a60248201527f4d473a206d6178436f756e74206d757374206265203c3d2031300000000000006044820152606401610919565b60ff82168661131333610d70565b61131d9190612d78565b111561136b5760405162461bcd60e51b815260206004820152601d60248201527f4d473a205768697465206c69737420636f756e742065786365656465640000006044820152606401610919565b61137486611d60565b505050505050565b60606001805461082190612e06565b6001600160a01b0382163314156113e45760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610919565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61145a3383611ac9565b6114765760405162461bcd60e51b815260040161091990612d01565b61148284848484612086565b50505050565b6006546001600160a01b031633146114b25760405162461bcd60e51b815260040161091990612c9e565b600081116114d25760405162461bcd60e51b815260040161091990612cd3565b600b546114e190612710612dc3565b81600c546114ef9190612d78565b111561150d5760405162461bcd60e51b815260040161091990612c15565b60c881600a5461151d9190612d78565b111561156b5760405162461bcd60e51b815260206004820152601a60248201527f4d473a206769766177617920636f756e742065786365656465640000000000006044820152606401610919565b80600a600082825461157d9190612d78565b90915550610b48905081611e9c565b6000818152600260205260409020546060906001600160a01b031661160b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610919565b60006011805461161a90612e06565b905011611636576040518060200160405280600081525061080c565b6011611641836120b9565b601260405160200161165593929190612b64565b60405160208183030381529060405292915050565b60105460ff166116cd5760405162461bcd60e51b815260206004820152602860248201527f4d473a20436f6d62696e696e67204769726c467269656e6473206973206e6f7460448201526708195b98589b195960c21b6064820152608401610919565b336116d789610c62565b6001600160a01b03161480156116fd5750336116f288610c62565b6001600160a01b0316145b6117495760405162461bcd60e51b815260206004820152601e60248201527f4d473a204d757374206f776e207468657365204769726c467269656e647300006044820152606401610919565b8588148061175657508587145b6117935760405162461bcd60e51b815260206004820152600e60248201526d1351ce88125b9d985b1a5908125160921b6044820152606401610919565b60016117a3338a8a8a8a876121b7565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156117f1573d6000803e3d6000fd5b5050604051601f1901516013546001600160a01b03908116911614905061185a5760405162461bcd60e51b815260206004820152601d60248201527f4d473a20696e76616c69642068617368206f72207369676e61747572650000006044820152606401610919565b6000878152600f6020526040808220548a835291205461ffff9182169116116118a0576000878152600f602052604090205461189b9061ffff166001612d52565b6118be565b6000888152600f60205260409020546118be9061ffff166001612d52565b6000878152600f6020908152604091829020805461ffff191661ffff949094169390931790925580518881529182018790528101899052606081018890527fbc88f1fc139c089c9b3bab49b092f3d5a2a87294c201c5eb2b5ce70eb6eb26999060800160405180910390a161193f888714611939578861223f565b8761223f565b600d805490600061194f83612e41565b91905055505050505050505050565b6006546001600160a01b031633146119885760405162461bcd60e51b815260040161091990612c9e565b601580546001600160a01b039384166001600160a01b03199182161790915560168054929093169116179055565b6119be611f31565b600955565b6006546001600160a01b031633146119ed5760405162461bcd60e51b815260040161091990612c9e565b6001600160a01b038116611a525760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610919565b610b4881611fb5565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a9082610c62565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611b425760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610919565b6000611b4d83610c62565b9050806001600160a01b0316846001600160a01b03161480611b885750836001600160a01b0316611b7d846108a4565b6001600160a01b0316145b80611bb857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611bd382610c62565b6001600160a01b031614611c3b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610919565b6001600160a01b038216611c9d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610919565b611ca8600082611a5b565b6001600160a01b0383166000908152600360205260408120805460019290611cd1908490612dc3565b90915550506001600160a01b0382166000908152600360205260408120805460019290611cff908490612d78565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008111611d805760405162461bcd60e51b815260040161091990612cd3565b600b54611d8f90612710612dc3565b81600c54611d9d9190612d78565b1115611dbb5760405162461bcd60e51b815260040161091990612c15565b600954811115611e0d5760405162461bcd60e51b815260206004820152601e60248201527f4d473a20427579206c696d6974207065722074786e20657863656564656400006044820152606401610919565b3481600754611e1c9190612da4565b14611e5d5760405162461bcd60e51b81526020600482015260116024820152704d473a20696e76616c696420707269636560781b6044820152606401610919565b6014546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015611e96573d6000803e3d6000fd5b50610b48815b60005b81811015611f1e576001600f600083600c54611ebb9190612d78565b611ec6906001612d78565b81526020810191909152604001600020805461ffff191661ffff92909216919091179055611f0c3382600c54611efc9190612d78565b611f07906001612d78565b6122da565b80611f1681612e41565b915050611e9f565b5080600c60008282546110a69190612d78565b6006546001600160a01b0316331480611f5457506015546001600160a01b031633145b80611f6957506016546001600160a01b031633145b610e2b5760405162461bcd60e51b815260206004820152601f60248201527f4d473a205369676e6572206973206e6f7420646576206e6f72206f776e6572006044820152606401610919565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600083838360405160200161201e93929190612b1c565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c016040516020818303038152906040528051906020012090509392505050565b612091848484611bc0565b61209d848484846122f8565b6114825760405162461bcd60e51b815260040161091990612c4c565b6060816120dd5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561210757806120f181612e41565b91506121009050600a83612d90565b91506120e1565b60008167ffffffffffffffff81111561212257612122612eb2565b6040519080825280601f01601f19166020018201604052801561214c576020820181803683370190505b5090505b8415611bb857612161600183612dc3565b915061216e600a86612e5c565b612179906030612d78565b60f81b81838151811061218e5761218e612e9c565b60200101906001600160f81b031916908160001a9053506121b0600a86612d90565b9450612150565b60008686868686866040516020016121d496959493929190612ac8565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c016040516020818303038152906040528051906020012090509695505050505050565b600061224a82610c62565b9050612257600083611a5b565b6001600160a01b0381166000908152600360205260408120805460019290612280908490612dc3565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6122f4828260405180602001604052806000815250612405565b5050565b60006001600160a01b0384163b156123fa57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061233c903390899088908890600401612b97565b602060405180830381600087803b15801561235657600080fd5b505af1925050508015612386575060408051601f3d908101601f1916820190925261238391810190612866565b60015b6123e0573d8080156123b4576040519150601f19603f3d011682016040523d82523d6000602084013e6123b9565b606091505b5080516123d85760405162461bcd60e51b815260040161091990612c4c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611bb8565b506001949350505050565b61240f8383612438565b61241c60008484846122f8565b610a4f5760405162461bcd60e51b815260040161091990612c4c565b6001600160a01b03821661248e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610919565b6000818152600260205260409020546001600160a01b0316156124f35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610919565b6001600160a01b038216600090815260036020526040812080546001929061251c908490612d78565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461258690612e06565b90600052602060002090601f0160209004810192826125a857600085556125ee565b82601f106125c157805160ff19168380011785556125ee565b828001600101855582156125ee579182015b828111156125ee5782518255916020019190600101906125d3565b506125fa9291506125fe565b5090565b5b808211156125fa57600081556001016125ff565b600067ffffffffffffffff8084111561262e5761262e612eb2565b604051601f8501601f19908116603f0116810190828211818310171561265657612656612eb2565b8160405280935085815286868601111561266f57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146126a057600080fd5b919050565b600082601f8301126126b657600080fd5b6126c583833560208501612613565b9392505050565b803560ff811681146126a057600080fd5b6000602082840312156126ef57600080fd5b6126c582612689565b6000806040838503121561270b57600080fd5b61271483612689565b915061272260208401612689565b90509250929050565b60008060006060848603121561274057600080fd5b61274984612689565b925061275760208501612689565b9150604084013590509250925092565b6000806000806080858703121561277d57600080fd5b61278685612689565b935061279460208601612689565b925060408501359150606085013567ffffffffffffffff8111156127b757600080fd5b8501601f810187136127c857600080fd5b6127d787823560208401612613565b91505092959194509250565b600080604083850312156127f657600080fd5b6127ff83612689565b91506020830135801515811461281457600080fd5b809150509250929050565b6000806040838503121561283257600080fd5b61283b83612689565b946020939093013593505050565b60006020828403121561285b57600080fd5b81356126c581612ec8565b60006020828403121561287857600080fd5b81516126c581612ec8565b6000806040838503121561289657600080fd5b823567ffffffffffffffff808211156128ae57600080fd5b6128ba868387016126a5565b935060208501359150808211156128d057600080fd5b506128dd858286016126a5565b9150509250929050565b6000602082840312156128f957600080fd5b5035919050565b600080600080600080600080610100898b03121561291d57600080fd5b8835975060208901359650604089013595506060890135945061294260808a016126cc565b935060a0890135925060c0890135915060e089013567ffffffffffffffff81111561296c57600080fd5b6129788b828c016126a5565b9150509295985092959890939650565b60008060008060008060c087890312156129a157600080fd5b863595506129b1602088016126cc565b945060408701359350606087013592506129cd608088016126cc565b915060a087013567ffffffffffffffff8111156129e957600080fd5b6129f589828a016126a5565b9150509295509295509295565b60008151808452612a1a816020860160208601612dda565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680612a4857607f831692505b6020808410821415612a6a57634e487b7160e01b600052602260045260246000fd5b818015612a7e5760018114612a8f57612abc565b60ff19861689528489019650612abc565b60008881526020902060005b86811015612ab45781548b820152908501908301612a9b565b505084890196505b50505050505092915050565b6bffffffffffffffffffffffff198760601b16815285601482015284603482015283605482015282607482015260008251612b0a816094850160208701612dda565b91909101609401979650505050505050565b6bffffffffffffffffffffffff198460601b16815260ff60f81b8360f81b16601482015260008251612b55816015850160208701612dda565b91909101601501949350505050565b6000612b708286612a2e565b8451612b80818360208901612dda565b612b8c81830186612a2e565b979650505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bca90830184612a02565b9695505050505050565b6020815260006126c56020830184612a02565b604081526000612bfa6040830185612a02565b8281036020840152612c0c8185612a02565b95945050505050565b60208082526017908201527f4d473a204d617820737570706c79206578636565646564000000000000000000604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734d473a20496e76616c6964207175616e7469747960601b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600061ffff808316818516808303821115612d6f57612d6f612e70565b01949350505050565b60008219821115612d8b57612d8b612e70565b500190565b600082612d9f57612d9f612e86565b500490565b6000816000190483118215151615612dbe57612dbe612e70565b500290565b600082821015612dd557612dd5612e70565b500390565b60005b83811015612df5578181015183820152602001612ddd565b838111156114825750506000910152565b600181811c90821680612e1a57607f821691505b60208210811415612e3b57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e5557612e55612e70565b5060010190565b600082612e6b57612e6b612e86565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610b4857600080fdfea2646970667358221220ca41ce3a2ed02f12ab42569024d458da16ca77dbd3b68421dcf3fd201a8612be64736f6c63430008060033

Deployed Bytecode Sourcemap

34813:8375:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22098:305;;;;;;;;;;-1:-1:-1;22098:305:0;;;;;:::i;:::-;;:::i;:::-;;;10117:14:1;;10110:22;10092:41;;10080:2;10065:18;22098:305:0;;;;;;;;23043:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24602:221::-;;;;;;;;;;-1:-1:-1;24602:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9415:32:1;;;9397:51;;9385:2;9370:18;24602:221:0;9352:102:1;24125:411:0;;;;;;;;;;-1:-1:-1;24125:411:0;;;;;:::i;:::-;;:::i;:::-;;35353:32;;;;;;;;;;;;;;;;;;;24338:25:1;;;24326:2;24311:18;35353:32:0;24293:76:1;36127:106:0;;;;;;;;;;;;;:::i;25492:339::-;;;;;;;;;;-1:-1:-1;25492:339:0;;;;;:::i;:::-;;:::i;39913:284::-;;;;;;:::i;:::-;;:::i;35188:40::-;;;;;;;;;;;;35225:3;35188:40;;41377:110;;;;;;;;;;;;;:::i;25902:185::-;;;;;;;;;;-1:-1:-1;25902:185:0;;;;;:::i;:::-;;:::i;35392:29::-;;;;;;;;;;;;;;;;41033:260;;;;;;;;;;;;;:::i;35279:35::-;;;;;;;;;;-1:-1:-1;35279:35:0;;;;;;;;;;;35321:25;;;;;;;;;;;;;;;;22737:239;;;;;;;;;;-1:-1:-1;22737:239:0;;;;;:::i;:::-;;:::i;42268:241::-;;;;;;;;;;-1:-1:-1;42268:241:0;;;;;:::i;:::-;;:::i;42875:101::-;;;;;;;;;;-1:-1:-1;42875:101:0;;;;;:::i;:::-;;:::i;35428:27::-;;;;;;;;;;;;;;;;22467:208;;;;;;;;;;-1:-1:-1;22467:208:0;;;;;:::i;:::-;;:::i;5142:103::-;;;;;;;;;;;;;:::i;42984:95::-;;;;;;;;;;;;;:::i;42517:101::-;;;;;;;;;;;;;:::i;40207:816::-;;;;;;:::i;:::-;;:::i;43087:97::-;;;;;;;;;;;;;:::i;36327:178::-;;;;;;;;;;-1:-1:-1;36327:178:0;;;;;:::i;:::-;;:::i;:::-;;;24173:6:1;24161:19;;;24143:38;;24131:2;24116:18;36327:178:0;24098:89:1;4491:87:0;;;;;;;;;;-1:-1:-1;4564:6:0;;-1:-1:-1;;;;;4564:6:0;4491:87;;42628:128;;;;;;;;;;-1:-1:-1;42628:128:0;;;;;:::i;:::-;;:::i;39286:619::-;;;;;;:::i;:::-;;:::i;23212:104::-;;;;;;;;;;;;;:::i;35497:48::-;;;;;;;;;;-1:-1:-1;35497:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;35239:33;;;;;;;;;;-1:-1:-1;35239:33:0;;;;;;;;35106:30;;;;;;;;;;;;;;;;24895:295;;;;;;;;;;-1:-1:-1;24895:295:0;;;;;:::i;:::-;;:::i;26158:328::-;;;;;;;;;;-1:-1:-1;26158:328:0;;;;;:::i;:::-;;:::i;38085:406::-;;;;;;;;;;-1:-1:-1;38085:406:0;;;;;:::i;:::-;;:::i;35462:26::-;;;;;;;;;;;;;;;;41943:317;;;;;;;;;;-1:-1:-1;41943:317:0;;;;;:::i;:::-;;:::i;35602:26::-;;;;;;;;;;-1:-1:-1;35602:26:0;;;;;;;;35143:38;;;;;;;;;;;;35176:5;35143:38;;36850:829;;;;;;;;;;-1:-1:-1;36850:829:0;;;;;:::i;:::-;;:::i;41807:127::-;;;;;;;;;;-1:-1:-1;41807:127:0;;;;;:::i;:::-;;:::i;42765:102::-;;;;;;;;;;-1:-1:-1;42765:102:0;;;;;:::i;:::-;;:::i;25261:164::-;;;;;;;;;;-1:-1:-1;25261:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25382:25:0;;;25358:4;25382:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25261:164;5400:201;;;;;;;;;;-1:-1:-1;5400:201:0;;;;;:::i;:::-;;:::i;22098:305::-;22200:4;-1:-1:-1;;;;;;22237:40:0;;-1:-1:-1;;;22237:40:0;;:105;;-1:-1:-1;;;;;;;22294:48:0;;-1:-1:-1;;;22294:48:0;22237:105;:158;;;-1:-1:-1;;;;;;;;;;20814:40:0;;;22359:36;22217:178;22098:305;-1:-1:-1;;22098:305:0:o;23043:100::-;23097:13;23130:5;23123:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23043:100;:::o;24602:221::-;24678:7;28085:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28085:16:0;24698:73;;;;-1:-1:-1;;;24698:73:0;;18909:2:1;24698:73:0;;;18891:21:1;18948:2;18928:18;;;18921:30;18987:34;18967:18;;;18960:62;-1:-1:-1;;;19038:18:1;;;19031:42;19090:19;;24698:73:0;;;;;;;;;-1:-1:-1;24791:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24791:24:0;;24602:221::o;24125:411::-;24206:13;24222:23;24237:7;24222:14;:23::i;:::-;24206:39;;24270:5;-1:-1:-1;;;;;24264:11:0;:2;-1:-1:-1;;;;;24264:11:0;;;24256:57;;;;-1:-1:-1;;;24256:57:0;;21626:2:1;24256:57:0;;;21608:21:1;21665:2;21645:18;;;21638:30;21704:34;21684:18;;;21677:62;-1:-1:-1;;;21755:18:1;;;21748:31;21796:19;;24256:57:0;21598:223:1;24256:57:0;3428:10;-1:-1:-1;;;;;24348:21:0;;;;:62;;-1:-1:-1;24373:37:0;24390:5;3428:10;25261:164;:::i;24373:37::-;24326:168;;;;-1:-1:-1;;;24326:168:0;;16191:2:1;24326:168:0;;;16173:21:1;16230:2;16210:18;;;16203:30;16269:34;16249:18;;;16242:62;16340:26;16320:18;;;16313:54;16384:19;;24326:168:0;16163:246:1;24326:168:0;24507:21;24516:2;24520:7;24507:8;:21::i;:::-;24195:341;24125:411;;:::o;36127:106::-;36173:7;36214:11;;36199:12;;:26;;;;:::i;:::-;36192:33;;36127:106;:::o;25492:339::-;25687:41;3428:10;25720:7;25687:18;:41::i;:::-;25679:103;;;;-1:-1:-1;;;25679:103:0;;;;;;;:::i;:::-;25795:28;25805:4;25811:2;25815:7;25795:9;:28::i;39913:284::-;39987:14;;;;:35;;;;-1:-1:-1;40006:16:0;;;;;;;40005:17;39987:35;39979:75;;;;-1:-1:-1;;;39979:75:0;;15422:2:1;39979:75:0;;;15404:21:1;15461:2;15441:18;;;15434:30;15500:29;15480:18;;;15473:57;15547:18;;39979:75:0;15394:177:1;39979:75:0;3428:10;40138:9;40122:25;40114:49;;;;-1:-1:-1;;;40114:49:0;;12897:2:1;40114:49:0;;;12879:21:1;12936:2;12916:18;;;12909:30;-1:-1:-1;;;12955:18:1;;;12948:41;13006:18;;40114:49:0;12869:161:1;40114:49:0;40174:15;40180:8;40174:5;:15::i;:::-;39913:284;:::o;41377:110::-;4564:6;;-1:-1:-1;;;;;4564:6:0;3428:10;4711:23;4703:68;;;;-1:-1:-1;;;4703:68:0;;;;;;;:::i;:::-;41426:53:::1;::::0;3428:10;;41457:21:::1;41426:53:::0;::::1;;;::::0;::::1;::::0;;;41457:21;3428:10;41426:53;::::1;;;;;;;;;;;;;::::0;::::1;;;;25902:185:::0;26040:39;26057:4;26063:2;26067:7;26040:39;;;;;;;;;;;;:16;:39::i;41033:260::-;3428:10;41106:1;41078:27;;;:13;:27;;;;;;41070:62;;;;-1:-1:-1;;;41070:62:0;;17790:2:1;41070:62:0;;;17772:21:1;17829:2;17809:18;;;17802:30;-1:-1:-1;;;17848:18:1;;;17841:50;17908:18;;41070:62:0;17762:170:1;41070:62:0;3428:10;41159:27;;;;:13;:27;;;;;;41145:42;;:13;:42::i;:::-;3428:10;41216:27;;;;:13;:27;;;;;;41198:14;:45;;41216:27;;41198:14;;:45;;41216:27;;41198:45;:::i;:::-;;;;-1:-1:-1;;3428:10:0;41284:1;41254:27;;;:13;:27;;;;;:31;41033:260::o;22737:239::-;22809:7;22845:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22845:16:0;22880:19;22872:73;;;;-1:-1:-1;;;22872:73:0;;17027:2:1;22872:73:0;;;17009:21:1;17066:2;17046:18;;;17039:30;17105:34;17085:18;;;17078:62;-1:-1:-1;;;17156:18:1;;;17149:39;17205:19;;22872:73:0;16999:231:1;42268:241:0;41590:13;:11;:13::i;:::-;42374:29;;::::1;::::0;:14:::1;::::0;:29:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;42414:29:0;;::::1;::::0;:14:::1;::::0;:29:::1;::::0;::::1;::::0;::::1;:::i;:::-;;42459:42;42474:12;42488;42459:42;;;;;;;:::i;:::-;;;;;;;;42268:241:::0;;:::o;42875:101::-;41590:13;:11;:13::i;:::-;42943::::1;:25:::0;;-1:-1:-1;;;;;;42943:25:0::1;-1:-1:-1::0;;;;;42943:25:0;;;::::1;::::0;;;::::1;::::0;;42875:101::o;22467:208::-;22539:7;-1:-1:-1;;;;;22567:19:0;;22559:74;;;;-1:-1:-1;;;22559:74:0;;16616:2:1;22559:74:0;;;16598:21:1;16655:2;16635:18;;;16628:30;16694:34;16674:18;;;16667:62;-1:-1:-1;;;16745:18:1;;;16738:40;16795:19;;22559:74:0;16588:232:1;22559:74:0;-1:-1:-1;;;;;;22651:16:0;;;;;:9;:16;;;;;;;22467:208::o;5142:103::-;4564:6;;-1:-1:-1;;;;;4564:6:0;3428:10;4711:23;4703:68;;;;-1:-1:-1;;;4703:68:0;;;;;;;:::i;:::-;5207:30:::1;5234:1;5207:18;:30::i;:::-;5142:103::o:0;42984:95::-;41590:13;:11;:13::i;:::-;43057:14:::1;::::0;;-1:-1:-1;;43039:32:0;::::1;43057:14;::::0;;::::1;43056:15;43039:32;::::0;;42984:95::o;42517:101::-;41590:13;:11;:13::i;:::-;42594:16:::1;::::0;;-1:-1:-1;;42574:36:0;::::1;42594:16;::::0;;;::::1;;;42593:17;42574:36:::0;;::::1;;::::0;;42517:101::o;40207:816::-;40278:14;;;;:35;;;;-1:-1:-1;40297:16:0;;;;;;;40296:17;40278:35;40270:75;;;;-1:-1:-1;;;40270:75:0;;15422:2:1;40270:75:0;;;15404:21:1;15461:2;15441:18;;;15434:30;15500:29;15480:18;;;15473:57;15547:18;;40270:75:0;15394:177:1;40270:75:0;40376:1;40365:8;:12;40357:45;;;;-1:-1:-1;;;40357:45:0;;;;;;;:::i;:::-;40460:14;;40448:26;;35176:5;40448:26;:::i;:::-;40436:8;40423:12;;:21;;;;:::i;:::-;:51;;40415:87;;;;-1:-1:-1;;;40415:87:0;;;;;;;:::i;:::-;40561:8;;3428:10;40521:27;;;;:13;:27;;;;;;:36;;40549:8;;40521:36;:::i;:::-;:48;;40513:94;;;;-1:-1:-1;;;40513:94:0;;21224:2:1;40513:94:0;;;21206:21:1;21263:2;21243:18;;;21236:30;21302:34;21282:18;;;21275:62;-1:-1:-1;;;21353:18:1;;;21346:31;21394:19;;40513:94:0;21196:223:1;40513:94:0;40652:9;40640:8;40634:5;;:14;;;;:::i;:::-;:27;40626:57;;;;-1:-1:-1;;;40626:57:0;;23497:2:1;40626:57:0;;;23479:21:1;23536:2;23516:18;;;23509:30;-1:-1:-1;;;23555:18:1;;;23548:47;23612:18;;40626:57:0;23469:167:1;40626:57:0;3428:10;40768:9;40752:25;40744:49;;;;-1:-1:-1;;;40744:49:0;;12897:2:1;40744:49:0;;;12879:21:1;12936:2;12916:18;;;12909:30;-1:-1:-1;;;12955:18:1;;;12948:41;13006:18;;40744:49:0;12869:161:1;40744:49:0;40881:8;;40873:37;;-1:-1:-1;;;;;40881:8:0;;;;40900:9;40873:37;;;;;40881:8;40873:37;40881:8;40873:37;40900:9;40881:8;40873:37;;;;;;;;;;;;;;;;;;;;;40949:8;40931:14;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;3428:10:0;40968:27;;;;:13;:27;;;;;:47;;;;;;:27;:47;;;;;:::i;:::-;;;;-1:-1:-1;;;40207:816:0:o;43087:97::-;41590:13;:11;:13::i;:::-;43162:14:::1;::::0;;-1:-1:-1;;43144:32:0;::::1;43162:14;::::0;;::::1;43161:15;43144:32;::::0;;43087:97::o;36327:178::-;36385:6;28085:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28085:16:0;36403:53;;;;-1:-1:-1;;;36403:53:0;;17437:2:1;36403:53:0;;;17419:21:1;17476:2;17456:18;;;17449:30;17515:26;17495:18;;;17488:54;17559:18;;36403:53:0;17409:174:1;36403:53:0;-1:-1:-1;36482:15:0;;;;:6;:15;;;;;;;;;36327:178::o;42628:128::-;41590:13;:11;:13::i;:::-;42694:5:::1;:16:::0;;;42726:22:::1;::::0;24338:25:1;;;42726:22:0::1;::::0;24326:2:1;24311:18;42726:22:0::1;;;;;;;42628:128:::0;:::o;39286:619::-;39432:14;;;;:34;;;;-1:-1:-1;39450:16:0;;;;;;;39432:34;39424:75;;;;-1:-1:-1;;;39424:75:0;;20509:2:1;39424:75:0;;;20491:21:1;20548:2;20528:18;;;20521:30;20587;20567:18;;;20560:58;20635:18;;39424:75:0;20481:178:1;39424:75:0;39597:67;39608:45;3428:10;39637:8;39647:5;39608:13;:45::i;:::-;39597:67;;;;;;;;;;;;10371:25:1;;;;10444:4;10432:17;;10412:18;;;10405:45;10466:18;;;10459:34;;;10509:18;;;10502:34;;;10343:19;;39597:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39597:67:0;;-1:-1:-1;;39597:67:0;;39580:13;;-1:-1:-1;;;;;39580:13:0;;;:84;;;;-1:-1:-1;39572:126:0;;;;-1:-1:-1;;;39572:126:0;;20866:2:1;39572:126:0;;;20848:21:1;20905:2;20885:18;;;20878:30;20944:31;20924:18;;;20917:59;20993:18;;39572:126:0;20838:179:1;39572:126:0;39729:2;39717:8;:14;;;;39709:53;;;;-1:-1:-1;;;39709:53:0;;15067:2:1;39709:53:0;;;15049:21:1;15106:2;15086:18;;;15079:30;15145:28;15125:18;;;15118:56;15191:18;;39709:53:0;15039:176:1;39709:53:0;39820:17;;;39808:8;39784:23;3428:10;22467:208;:::i;39784:23::-;:32;;;;:::i;:::-;:53;;39775:96;;;;-1:-1:-1;;;39775:96:0;;23843:2:1;39775:96:0;;;23825:21:1;23882:2;23862:18;;;23855:30;23921:31;23901:18;;;23894:59;23970:18;;39775:96:0;23815:179:1;39775:96:0;39882:15;39888:8;39882:5;:15::i;:::-;39286:619;;;;;;:::o;23212:104::-;23268:13;23301:7;23294:14;;;;;:::i;24895:295::-;-1:-1:-1;;;;;24998:24:0;;3428:10;24998:24;;24990:62;;;;-1:-1:-1;;;24990:62:0;;14354:2:1;24990:62:0;;;14336:21:1;14393:2;14373:18;;;14366:30;14432:27;14412:18;;;14405:55;14477:18;;24990:62:0;14326:175:1;24990:62:0;3428:10;25065:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25065:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25065:53:0;;;;;;;;;;25134:48;;10092:41:1;;;25065:42:0;;3428:10;25134:48;;10065:18:1;25134:48:0;;;;;;;24895:295;;:::o;26158:328::-;26333:41;3428:10;26366:7;26333:18;:41::i;:::-;26325:103;;;;-1:-1:-1;;;26325:103:0;;;;;;;:::i;:::-;26439:39;26453:4;26459:2;26463:7;26472:5;26439:13;:39::i;:::-;26158:328;;;;:::o;38085:406::-;4564:6;;-1:-1:-1;;;;;4564:6:0;3428:10;4711:23;4703:68;;;;-1:-1:-1;;;4703:68:0;;;;;;;:::i;:::-;38178:1:::1;38167:8;:12;38159:45;;;;-1:-1:-1::0;;;38159:45:0::1;;;;;;;:::i;:::-;38260:14;::::0;38248:26:::1;::::0;35176:5:::1;38248:26;:::i;:::-;38236:8;38223:12;;:21;;;;:::i;:::-;:51;;38215:87;;;;-1:-1:-1::0;;;38215:87:0::1;;;;;;;:::i;:::-;35225:3;38339:8;38321:17;;:26;;;;:::i;:::-;:43;;38313:82;;;::::0;-1:-1:-1;;;38313:82:0;;13594:2:1;38313:82:0::1;::::0;::::1;13576:21:1::0;13633:2;13613:18;;;13606:30;13672:28;13652:18;;;13645:56;13718:18;;38313:82:0::1;13566:176:1::0;38313:82:0::1;38427:8;38406:17;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;38460:23:0::1;::::0;-1:-1:-1;38474:8:0;38460:13:::1;:23::i;41943:317::-:0;28061:4;28085:16;;;:7;:16;;;;;;42016:13;;-1:-1:-1;;;;;28085:16:0;42042:76;;;;-1:-1:-1;;;42042:76:0;;20093:2:1;42042:76:0;;;20075:21:1;20132:2;20112:18;;;20105:30;20171:34;20151:18;;;20144:62;-1:-1:-1;;;20222:18:1;;;20215:45;20277:19;;42042:76:0;20065:237:1;42042:76:0;42167:1;42142:14;42136:28;;;;;:::i;:::-;;;:32;:116;;;;;;;;;;;;;;;;;42195:14;42211:18;:7;:16;:18::i;:::-;42231:14;42178:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42129:123;41943:317;-1:-1:-1;;41943:317:0:o;36850:829::-;37022:14;;;;37014:67;;;;-1:-1:-1;;;37014:67:0;;18500:2:1;37014:67:0;;;18482:21:1;18539:2;18519:18;;;18512:30;18578:34;18558:18;;;18551:62;-1:-1:-1;;;18629:18:1;;;18622:38;18677:19;;37014:67:0;18472:230:1;37014:67:0;3428:10;37101:14;37109:5;37101:7;:14::i;:::-;-1:-1:-1;;;;;37101:30:0;;:64;;;;-1:-1:-1;3428:10:0;37135:14;37143:5;37135:7;:14::i;:::-;-1:-1:-1;;;;;37135:30:0;;37101:64;37092:108;;;;-1:-1:-1;;;37092:108:0;;22795:2:1;37092:108:0;;;22777:21:1;22834:2;22814:18;;;22807:30;22873:32;22853:18;;;22846:60;22923:18;;37092:108:0;22767:180:1;37092:108:0;37230:5;37221;:14;:32;;;;37248:5;37239;:14;37221:32;37213:59;;;;-1:-1:-1;;;37213:59:0;;23154:2:1;37213:59:0;;;23136:21:1;23193:2;23173:18;;;23166:30;-1:-1:-1;;;23212:18:1;;;23205:44;23266:18;;37213:59:0;23126:164:1;37213:59:0;37310:88;37321:66;3428:10;37349:5;37356;37363;37370:9;37381:5;37321:12;:66::i;:::-;37310:88;;;;;;;;;;;;10371:25:1;;;;10444:4;10432:17;;10412:18;;;10405:45;10466:18;;;10459:34;;;10509:18;;;10502:34;;;10343:19;;37310:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37310:88:0;;-1:-1:-1;;37310:88:0;;37293:13;;-1:-1:-1;;;;;37293:13:0;;;:105;;;;-1:-1:-1;37285:147:0;;;;-1:-1:-1;;;37285:147:0;;20866:2:1;37285:147:0;;;20848:21:1;20905:2;20885:18;;;20878:30;20944:31;20924:18;;;20917:59;20993:18;;37285:147:0;20838:179:1;37285:147:0;37477:13;;;;:6;:13;;;;;;;37461;;;;;;37477;;;;37461;;:29;:69;;37513:13;;;;:6;:13;;;;;;:17;;:13;;;:17;:::i;:::-;37461:69;;;37493:13;;;;:6;:13;;;;;;:17;;:13;;;:17;:::i;:::-;37445:13;;;;:6;:13;;;;;;;;;:85;;-1:-1:-1;;37445:85:0;;;;;;;;;;;;;37548:47;;24605:25:1;;;24646:18;;;24639:34;;;24689:18;;24682:34;;;24747:2;24732:18;;24725:34;;;37548:47:0;;24592:3:1;24577:19;37548:47:0;;;;;;;37608:39;37625:5;37616;:14;37615:30;;37640:5;37608;:39::i;37615:30::-;37633:5;37608;:39::i;:::-;37658:11;:13;;;:11;:13;;;:::i;:::-;;;;;;36850:829;;;;;;;;:::o;41807:127::-;4564:6;;-1:-1:-1;;;;;4564:6:0;3428:10;4711:23;4703:68;;;;-1:-1:-1;;;4703:68:0;;;;;;;:::i;:::-;41887:4:::1;:14:::0;;-1:-1:-1;;;;;41887:14:0;;::::1;-1:-1:-1::0;;;;;;41887:14:0;;::::1;;::::0;;;41912:4:::1;:14:::0;;;;;::::1;::::0;::::1;;::::0;;41807:127::o;42765:102::-;41590:13;:11;:13::i;:::-;42837:8:::1;:22:::0;42765:102::o;5400:201::-;4564:6;;-1:-1:-1;;;;;4564:6:0;3428:10;4711:23;4703:68;;;;-1:-1:-1;;;4703:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5489:22:0;::::1;5481:73;;;::::0;-1:-1:-1;;;5481:73:0;;12490:2:1;5481:73:0::1;::::0;::::1;12472:21:1::0;12529:2;12509:18;;;12502:30;12568:34;12548:18;;;12541:62;-1:-1:-1;;;12619:18:1;;;12612:36;12665:19;;5481:73:0::1;12462:228:1::0;5481:73:0::1;5565:28;5584:8;5565:18;:28::i;31978:174::-:0;32053:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32053:29:0;-1:-1:-1;;;;;32053:29:0;;;;;;;;:24;;32107:23;32053:24;32107:14;:23::i;:::-;-1:-1:-1;;;;;32098:46:0;;;;;;;;;;;31978:174;;:::o;28290:348::-;28383:4;28085:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28085:16:0;28400:73;;;;-1:-1:-1;;;28400:73:0;;15778:2:1;28400:73:0;;;15760:21:1;15817:2;15797:18;;;15790:30;15856:34;15836:18;;;15829:62;-1:-1:-1;;;15907:18:1;;;15900:42;15959:19;;28400:73:0;15750:234:1;28400:73:0;28484:13;28500:23;28515:7;28500:14;:23::i;:::-;28484:39;;28553:5;-1:-1:-1;;;;;28542:16:0;:7;-1:-1:-1;;;;;28542:16:0;;:51;;;;28586:7;-1:-1:-1;;;;;28562:31:0;:20;28574:7;28562:11;:20::i;:::-;-1:-1:-1;;;;;28562:31:0;;28542:51;:87;;;-1:-1:-1;;;;;;25382:25:0;;;25358:4;25382:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28597:32;28534:96;28290:348;-1:-1:-1;;;;28290:348:0:o;31282:578::-;31441:4;-1:-1:-1;;;;;31414:31:0;:23;31429:7;31414:14;:23::i;:::-;-1:-1:-1;;;;;31414:31:0;;31406:85;;;;-1:-1:-1;;;31406:85:0;;19683:2:1;31406:85:0;;;19665:21:1;19722:2;19702:18;;;19695:30;19761:34;19741:18;;;19734:62;-1:-1:-1;;;19812:18:1;;;19805:39;19861:19;;31406:85:0;19655:231:1;31406:85:0;-1:-1:-1;;;;;31510:16:0;;31502:65;;;;-1:-1:-1;;;31502:65:0;;13949:2:1;31502:65:0;;;13931:21:1;13988:2;13968:18;;;13961:30;14027:34;14007:18;;;14000:62;-1:-1:-1;;;14078:18:1;;;14071:34;14122:19;;31502:65:0;13921:226:1;31502:65:0;31684:29;31701:1;31705:7;31684:8;:29::i;:::-;-1:-1:-1;;;;;31726:15:0;;;;;;:9;:15;;;;;:20;;31745:1;;31726:15;:20;;31745:1;;31726:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31757:13:0;;;;;;:9;:13;;;;;:18;;31774:1;;31757:13;:18;;31774:1;;31757:18;:::i;:::-;;;;-1:-1:-1;;31786:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31786:21:0;-1:-1:-1;;;;;31786:21:0;;;;;;;;;31825:27;;31786:16;;31825:27;;;;;;;31282:578;;;:::o;38499:509::-;38571:1;38560:8;:12;38552:45;;;;-1:-1:-1;;;38552:45:0;;;;;;;:::i;:::-;38663:14;;38651:26;;35176:5;38651:26;:::i;:::-;38639:8;38626:12;;:21;;;;:::i;:::-;:51;;38618:87;;;;-1:-1:-1;;;38618:87:0;;;;;;;:::i;:::-;38736:8;;38724;:20;;38716:63;;;;-1:-1:-1;;;38716:63:0;;14708:2:1;38716:63:0;;;14690:21:1;14747:2;14727:18;;;14720:30;14786:32;14766:18;;;14759:60;14836:18;;38716:63:0;14680:180:1;38716:63:0;38816:9;38804:8;38798:5;;:14;;;;:::i;:::-;:27;38790:57;;;;-1:-1:-1;;;38790:57:0;;23497:2:1;38790:57:0;;;23479:21:1;23536:2;23516:18;;;23509:30;-1:-1:-1;;;23555:18:1;;;23548:47;23612:18;;38790:57:0;23469:167:1;38790:57:0;38935:8;;38927:37;;-1:-1:-1;;;;;38935:8:0;;;;38954:9;38927:37;;;;;38935:8;38927:37;38935:8;38927:37;38954:9;38935:8;38927:37;;;;;;;;;;;;;;;;;;;;;38977:23;38991:8;37765:248;37831:6;37826:145;37847:8;37843:1;:12;37826:145;;;37902:1;37877:6;:24;37897:1;37884:12;;:14;;;;:::i;:::-;:16;;37899:1;37884:16;:::i;:::-;37877:24;;;;;;;;;;;-1:-1:-1;37877:24:0;:26;;-1:-1:-1;;37877:26:0;;;;;;;;;;;;37918:41;3428:10;37955:1;37942:12;;:14;;;;:::i;:::-;:16;;37957:1;37942:16;:::i;:::-;37918:9;:41::i;:::-;37857:3;;;;:::i;:::-;;;;37826:145;;;;37997:8;37981:12;;:24;;;;;;;:::i;41631:168::-;4564:6;;-1:-1:-1;;;;;4564:6:0;3428:10;41689:21;;41688:45;;-1:-1:-1;41714:4:0;;-1:-1:-1;;;;;41714:4:0;3428:10;41714:18;41688:45;:67;;;-1:-1:-1;41736:4:0;;-1:-1:-1;;;;;41736:4:0;3428:10;41736:18;41688:67;41679:112;;;;-1:-1:-1;;;41679:112:0;;11711:2:1;41679:112:0;;;11693:21:1;11750:2;11730:18;;;11723:30;11789:33;11769:18;;;11762:61;11840:18;;41679:112:0;11683:181:1;5761:191:0;5854:6;;;-1:-1:-1;;;;;5871:17:0;;;-1:-1:-1;;;;;;5871:17:0;;;;;;;5904:40;;5854:6;;;5871:17;5854:6;;5904:40;;5835:16;;5904:40;5824:128;5761:191;:::o;39018:260::-;39116:7;39234:6;39242:8;39252:5;39217:41;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;39217:41:0;;;;;;;;;;39207:52;;39217:41;39207:52;;;;9108:66:1;39153:107:0;;;9096:79:1;;;;9191:12;;;9184:28;9228:12;;39153:107:0;;;;;;;;;;;;39143:118;;;;;;39136:125;;39018:260;;;;;:::o;27368:315::-;27525:28;27535:4;27541:2;27545:7;27525:9;:28::i;:::-;27572:48;27595:4;27601:2;27605:7;27614:5;27572:22;:48::i;:::-;27564:111;;;;-1:-1:-1;;;27564:111:0;;;;;;;:::i;1044:723::-;1100:13;1321:10;1317:53;;-1:-1:-1;;1348:10:0;;;;;;;;;;;;-1:-1:-1;;;1348:10:0;;;;;1044:723::o;1317:53::-;1395:5;1380:12;1436:78;1443:9;;1436:78;;1469:8;;;;:::i;:::-;;-1:-1:-1;1492:10:0;;-1:-1:-1;1500:2:0;1492:10;;:::i;:::-;;;1436:78;;;1524:19;1556:6;1546:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1546:17:0;;1524:39;;1574:154;1581:10;;1574:154;;1608:11;1618:1;1608:11;;:::i;:::-;;-1:-1:-1;1677:10:0;1685:2;1677:5;:10;:::i;:::-;1664:24;;:2;:24;:::i;:::-;1651:39;;1634:6;1641;1634:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1634:56:0;;;;;;;;-1:-1:-1;1705:11:0;1714:2;1705:11;;:::i;:::-;;;1574:154;;36513:329;36658:7;36776:6;36784:5;36791;36798;36805:9;36816:5;36759:63;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;36759:63:0;;;;;;;;;;36749:74;;36759:63;36749:74;;;;9108:66:1;36695:129:0;;;9096:79:1;;;;9191:12;;;9184:28;9228:12;;36695:129:0;;;;;;;;;;;;36685:140;;;;;;36678:147;;36513:329;;;;;;;;:::o;30585:360::-;30645:13;30661:23;30676:7;30661:14;:23::i;:::-;30645:39;;30786:29;30803:1;30807:7;30786:8;:29::i;:::-;-1:-1:-1;;;;;30828:16:0;;;;;;:9;:16;;;;;:21;;30848:1;;30828:16;:21;;30848:1;;30828:21;:::i;:::-;;;;-1:-1:-1;;30867:16:0;;;;:7;:16;;;;;;30860:23;;-1:-1:-1;;;;;;30860:23:0;;;30901:36;30875:7;;30867:16;-1:-1:-1;;;;;30901:36:0;;;;;30867:16;;30901:36;30634:311;30585:360;:::o;28980:110::-;29056:26;29066:2;29070:7;29056:26;;;;;;;;;;;;:9;:26::i;:::-;28980:110;;:::o;32717:803::-;32872:4;-1:-1:-1;;;;;32893:13:0;;13200:20;13248:8;32889:624;;32929:72;;-1:-1:-1;;;32929:72:0;;-1:-1:-1;;;;;32929:36:0;;;;;:72;;3428:10;;32980:4;;32986:7;;32995:5;;32929:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32929:72:0;;;;;;;;-1:-1:-1;;32929:72:0;;;;;;;;;;;;:::i;:::-;;;32925:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33175:13:0;;33171:272;;33218:60;;-1:-1:-1;;;33218:60:0;;;;;;;:::i;33171:272::-;33393:6;33387:13;33378:6;33374:2;33370:15;33363:38;32925:533;-1:-1:-1;;;;;;33052:55:0;-1:-1:-1;;;33052:55:0;;-1:-1:-1;33045:62:0;;32889:624;-1:-1:-1;33497:4:0;32717:803;;;;;;:::o;29317:321::-;29447:18;29453:2;29457:7;29447:5;:18::i;:::-;29498:54;29529:1;29533:2;29537:7;29546:5;29498:22;:54::i;:::-;29476:154;;;;-1:-1:-1;;;29476:154:0;;;;;;;:::i;29974:382::-;-1:-1:-1;;;;;30054:16:0;;30046:61;;;;-1:-1:-1;;;30046:61:0;;18139:2:1;30046:61:0;;;18121:21:1;;;18158:18;;;18151:30;18217:34;18197:18;;;18190:62;18269:18;;30046:61:0;18111:182:1;30046:61:0;28061:4;28085:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28085:16:0;:30;30118:58;;;;-1:-1:-1;;;30118:58:0;;13237:2:1;30118:58:0;;;13219:21:1;13276:2;13256:18;;;13249:30;13315;13295:18;;;13288:58;13363:18;;30118:58:0;13209:178:1;30118:58:0;-1:-1:-1;;;;;30247:13:0;;;;;;:9;:13;;;;;:18;;30264:1;;30247:13;:18;;30264:1;;30247:18;:::i;:::-;;;;-1:-1:-1;;30276:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30276:21:0;-1:-1:-1;;;;;30276:21:0;;;;;;;;30315:33;;30276:16;;;30315:33;;30276:16;;30315:33;29974:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:221::-;871:5;924:3;917:4;909:6;905:17;901:27;891:2;;942:1;939;932:12;891:2;964:79;1039:3;1030:6;1017:20;1010:4;1002:6;998:17;964:79;:::i;:::-;955:88;881:168;-1:-1:-1;;;881:168:1:o;1054:156::-;1120:20;;1180:4;1169:16;;1159:27;;1149:2;;1200:1;1197;1190:12;1215:186;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:2;;;1343:1;1340;1333:12;1295:2;1366:29;1385:9;1366:29;:::i;1406:260::-;1474:6;1482;1535:2;1523:9;1514:7;1510:23;1506:32;1503:2;;;1551:1;1548;1541:12;1503:2;1574:29;1593:9;1574:29;:::i;:::-;1564:39;;1622:38;1656:2;1645:9;1641:18;1622:38;:::i;:::-;1612:48;;1493:173;;;;;:::o;1671:328::-;1748:6;1756;1764;1817:2;1805:9;1796:7;1792:23;1788:32;1785:2;;;1833:1;1830;1823:12;1785:2;1856:29;1875:9;1856:29;:::i;:::-;1846:39;;1904:38;1938:2;1927:9;1923:18;1904:38;:::i;:::-;1894:48;;1989:2;1978:9;1974:18;1961:32;1951:42;;1775:224;;;;;:::o;2004:666::-;2099:6;2107;2115;2123;2176:3;2164:9;2155:7;2151:23;2147:33;2144:2;;;2193:1;2190;2183:12;2144:2;2216:29;2235:9;2216:29;:::i;:::-;2206:39;;2264:38;2298:2;2287:9;2283:18;2264:38;:::i;:::-;2254:48;;2349:2;2338:9;2334:18;2321:32;2311:42;;2404:2;2393:9;2389:18;2376:32;2431:18;2423:6;2420:30;2417:2;;;2463:1;2460;2453:12;2417:2;2486:22;;2539:4;2531:13;;2527:27;-1:-1:-1;2517:2:1;;2568:1;2565;2558:12;2517:2;2591:73;2656:7;2651:2;2638:16;2633:2;2629;2625:11;2591:73;:::i;:::-;2581:83;;;2134:536;;;;;;;:::o;2675:347::-;2740:6;2748;2801:2;2789:9;2780:7;2776:23;2772:32;2769:2;;;2817:1;2814;2807:12;2769:2;2840:29;2859:9;2840:29;:::i;:::-;2830:39;;2919:2;2908:9;2904:18;2891:32;2966:5;2959:13;2952:21;2945:5;2942:32;2932:2;;2988:1;2985;2978:12;2932:2;3011:5;3001:15;;;2759:263;;;;;:::o;3027:254::-;3095:6;3103;3156:2;3144:9;3135:7;3131:23;3127:32;3124:2;;;3172:1;3169;3162:12;3124:2;3195:29;3214:9;3195:29;:::i;:::-;3185:39;3271:2;3256:18;;;;3243:32;;-1:-1:-1;;;3114:167:1:o;3286:245::-;3344:6;3397:2;3385:9;3376:7;3372:23;3368:32;3365:2;;;3413:1;3410;3403:12;3365:2;3452:9;3439:23;3471:30;3495:5;3471:30;:::i;3536:249::-;3605:6;3658:2;3646:9;3637:7;3633:23;3629:32;3626:2;;;3674:1;3671;3664:12;3626:2;3706:9;3700:16;3725:30;3749:5;3725:30;:::i;3790:543::-;3878:6;3886;3939:2;3927:9;3918:7;3914:23;3910:32;3907:2;;;3955:1;3952;3945:12;3907:2;3995:9;3982:23;4024:18;4065:2;4057:6;4054:14;4051:2;;;4081:1;4078;4071:12;4051:2;4104:50;4146:7;4137:6;4126:9;4122:22;4104:50;:::i;:::-;4094:60;;4207:2;4196:9;4192:18;4179:32;4163:48;;4236:2;4226:8;4223:16;4220:2;;;4252:1;4249;4242:12;4220:2;;4275:52;4319:7;4308:8;4297:9;4293:24;4275:52;:::i;:::-;4265:62;;;3897:436;;;;;:::o;4338:180::-;4397:6;4450:2;4438:9;4429:7;4425:23;4421:32;4418:2;;;4466:1;4463;4456:12;4418:2;-1:-1:-1;4489:23:1;;4408:110;-1:-1:-1;4408:110:1:o;4523:805::-;4653:6;4661;4669;4677;4685;4693;4701;4709;4762:3;4750:9;4741:7;4737:23;4733:33;4730:2;;;4779:1;4776;4769:12;4730:2;4815:9;4802:23;4792:33;;4872:2;4861:9;4857:18;4844:32;4834:42;;4923:2;4912:9;4908:18;4895:32;4885:42;;4974:2;4963:9;4959:18;4946:32;4936:42;;4997:37;5029:3;5018:9;5014:19;4997:37;:::i;:::-;4987:47;;5081:3;5070:9;5066:19;5053:33;5043:43;;5133:3;5122:9;5118:19;5105:33;5095:43;;5189:3;5178:9;5174:19;5161:33;5217:18;5209:6;5206:30;5203:2;;;5249:1;5246;5239:12;5203:2;5272:50;5314:7;5305:6;5294:9;5290:22;5272:50;:::i;:::-;5262:60;;;4720:608;;;;;;;;;;;:::o;5333:669::-;5443:6;5451;5459;5467;5475;5483;5536:3;5524:9;5515:7;5511:23;5507:33;5504:2;;;5553:1;5550;5543:12;5504:2;5589:9;5576:23;5566:33;;5618:36;5650:2;5639:9;5635:18;5618:36;:::i;:::-;5608:46;;5701:2;5690:9;5686:18;5673:32;5663:42;;5752:2;5741:9;5737:18;5724:32;5714:42;;5775:37;5807:3;5796:9;5792:19;5775:37;:::i;:::-;5765:47;;5863:3;5852:9;5848:19;5835:33;5891:18;5883:6;5880:30;5877:2;;;5923:1;5920;5913:12;5877:2;5946:50;5988:7;5979:6;5968:9;5964:22;5946:50;:::i;:::-;5936:60;;;5494:508;;;;;;;;:::o;6007:257::-;6048:3;6086:5;6080:12;6113:6;6108:3;6101:19;6129:63;6185:6;6178:4;6173:3;6169:14;6162:4;6155:5;6151:16;6129:63;:::i;:::-;6246:2;6225:15;-1:-1:-1;;6221:29:1;6212:39;;;;6253:4;6208:50;;6056:208;-1:-1:-1;;6056:208:1:o;6269:973::-;6354:12;;6319:3;;6409:1;6429:18;;;;6482;;;;6509:2;;6563:4;6555:6;6551:17;6541:27;;6509:2;6589;6637;6629:6;6626:14;6606:18;6603:38;6600:2;;;6683:10;6678:3;6674:20;6671:1;6664:31;6718:4;6715:1;6708:15;6746:4;6743:1;6736:15;6600:2;6777:18;6804:104;;;;6922:1;6917:319;;;;6770:466;;6804:104;-1:-1:-1;;6837:24:1;;6825:37;;6882:16;;;;-1:-1:-1;6804:104:1;;6917:319;24843:1;24836:14;;;24880:4;24867:18;;7011:1;7025:165;7039:6;7036:1;7033:13;7025:165;;;7117:14;;7104:11;;;7097:35;7160:16;;;;7054:10;;7025:165;;;7029:3;;7219:6;7214:3;7210:16;7203:23;;6770:466;;;;;;;6327:915;;;;:::o;7247:660::-;7573:26;7569:31;7560:6;7556:2;7552:15;7548:53;7543:3;7536:66;7632:6;7627:2;7622:3;7618:12;7611:28;7669:6;7664:2;7659:3;7655:12;7648:28;7706:6;7701:2;7696:3;7692:12;7685:28;7744:6;7738:3;7733;7729:13;7722:29;7518:3;7780:6;7774:13;7796:63;7852:6;7846:3;7841;7837:13;7830:4;7822:6;7818:17;7796:63;:::i;:::-;7879:16;;;;7897:3;7875:26;;7526:381;-1:-1:-1;;;;;;;7526:381:1:o;7912:488::-;8150:26;8146:31;8137:6;8133:2;8129:15;8125:53;8120:3;8113:66;8240:3;8235;8231:13;8222:6;8217:3;8213:16;8209:36;8204:2;8199:3;8195:12;8188:58;8095:3;8275:6;8269:13;8291:62;8346:6;8341:2;8336:3;8332:12;8325:4;8317:6;8313:17;8291:62;:::i;:::-;8373:16;;;;8391:2;8369:25;;8103:297;-1:-1:-1;;;;8103:297:1:o;8405:456::-;8626:3;8654:38;8688:3;8680:6;8654:38;:::i;:::-;8721:6;8715:13;8737:52;8782:6;8778:2;8771:4;8763:6;8759:17;8737:52;:::i;:::-;8805:50;8847:6;8843:2;8839:15;8831:6;8805:50;:::i;:::-;8798:57;8634:227;-1:-1:-1;;;;;;;8634:227:1:o;9459:488::-;-1:-1:-1;;;;;9728:15:1;;;9710:34;;9780:15;;9775:2;9760:18;;9753:43;9827:2;9812:18;;9805:34;;;9875:3;9870:2;9855:18;;9848:31;;;9653:4;;9896:45;;9921:19;;9913:6;9896:45;:::i;:::-;9888:53;9662:285;-1:-1:-1;;;;;;9662:285:1:o;10547:219::-;10696:2;10685:9;10678:21;10659:4;10716:44;10756:2;10745:9;10741:18;10733:6;10716:44;:::i;10771:381::-;10968:2;10957:9;10950:21;10931:4;10994:44;11034:2;11023:9;11019:18;11011:6;10994:44;:::i;:::-;11086:9;11078:6;11074:22;11069:2;11058:9;11054:18;11047:50;11114:32;11139:6;11131;11114:32;:::i;:::-;11106:40;10940:212;-1:-1:-1;;;;;10940:212:1:o;11157:347::-;11359:2;11341:21;;;11398:2;11378:18;;;11371:30;11437:25;11432:2;11417:18;;11410:53;11495:2;11480:18;;11331:173::o;11869:414::-;12071:2;12053:21;;;12110:2;12090:18;;;12083:30;12149:34;12144:2;12129:18;;12122:62;-1:-1:-1;;;12215:2:1;12200:18;;12193:48;12273:3;12258:19;;12043:240::o;19120:356::-;19322:2;19304:21;;;19341:18;;;19334:30;19400:34;19395:2;19380:18;;19373:62;19467:2;19452:18;;19294:182::o;21826:344::-;22028:2;22010:21;;;22067:2;22047:18;;;22040:30;-1:-1:-1;;;22101:2:1;22086:18;;22079:50;22161:2;22146:18;;22000:170::o;22175:413::-;22377:2;22359:21;;;22416:2;22396:18;;;22389:30;22455:34;22450:2;22435:18;;22428:62;-1:-1:-1;;;22521:2:1;22506:18;;22499:47;22578:3;22563:19;;22349:239::o;24896:224::-;24935:3;24963:6;24996:2;24993:1;24989:10;25026:2;25023:1;25019:10;25057:3;25053:2;25049:12;25044:3;25041:21;25038:2;;;25065:18;;:::i;:::-;25101:13;;24943:177;-1:-1:-1;;;;24943:177:1:o;25125:128::-;25165:3;25196:1;25192:6;25189:1;25186:13;25183:2;;;25202:18;;:::i;:::-;-1:-1:-1;25238:9:1;;25173:80::o;25258:120::-;25298:1;25324;25314:2;;25329:18;;:::i;:::-;-1:-1:-1;25363:9:1;;25304:74::o;25383:168::-;25423:7;25489:1;25485;25481:6;25477:14;25474:1;25471:21;25466:1;25459:9;25452:17;25448:45;25445:2;;;25496:18;;:::i;:::-;-1:-1:-1;25536:9:1;;25435:116::o;25556:125::-;25596:4;25624:1;25621;25618:8;25615:2;;;25629:18;;:::i;:::-;-1:-1:-1;25666:9:1;;25605:76::o;25686:258::-;25758:1;25768:113;25782:6;25779:1;25776:13;25768:113;;;25858:11;;;25852:18;25839:11;;;25832:39;25804:2;25797:10;25768:113;;;25899:6;25896:1;25893:13;25890:2;;;-1:-1:-1;;25934:1:1;25916:16;;25909:27;25739:205::o;25949:380::-;26028:1;26024:12;;;;26071;;;26092:2;;26146:4;26138:6;26134:17;26124:27;;26092:2;26199;26191:6;26188:14;26168:18;26165:38;26162:2;;;26245:10;26240:3;26236:20;26233:1;26226:31;26280:4;26277:1;26270:15;26308:4;26305:1;26298:15;26162:2;;26004:325;;;:::o;26334:135::-;26373:3;-1:-1:-1;;26394:17:1;;26391:2;;;26414:18;;:::i;:::-;-1:-1:-1;26461:1:1;26450:13;;26381:88::o;26474:112::-;26506:1;26532;26522:2;;26537:18;;:::i;:::-;-1:-1:-1;26571:9:1;;26512:74::o;26591:127::-;26652:10;26647:3;26643:20;26640:1;26633:31;26683:4;26680:1;26673:15;26707:4;26704:1;26697:15;26723:127;26784:10;26779:3;26775:20;26772:1;26765:31;26815:4;26812:1;26805:15;26839:4;26836:1;26829:15;26855:127;26916:10;26911:3;26907:20;26904:1;26897:31;26947:4;26944:1;26937:15;26971:4;26968:1;26961:15;26987:127;27048:10;27043:3;27039:20;27036:1;27029:31;27079:4;27076:1;27069:15;27103:4;27100:1;27093:15;27119:131;-1:-1:-1;;;;;;27193:32:1;;27183:43;;27173:2;;27240:1;27237;27230:12

Swarm Source

ipfs://ca41ce3a2ed02f12ab42569024d458da16ca77dbd3b68421dcf3fd201a8612be
Loading...
Loading
Loading...
Loading
[ 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.