ETH Price: $3,513.90 (+4.75%)

Token

Juicy Fruits (JF)
 

Overview

Max Total Supply

777 JF

Holders

250

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 JF
0xec0becfb61010241c982c119c373436890988119
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
JuicyFruits

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/2_Owner.sol

//Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)

pragma solidity 0.8.12;




contract JuicyFruits is ERC721, ERC721Enumerable, Ownable {

	
	uint public constant MAX_TOKENS = 2222;
	uint public constant MAX_TOKENS_VIP = 1;
	
	address private constant devAddress = 0xA2efE2b517Ed04b8f3707e47151b7F5b8621d833;
	
	uint private _currentToken = 0;
	
	uint public CURR_MINT_COST = 0.06 ether;
	
	//---- Round based supplies
	string private CURR_ROUND_NAME = "Presale";
	uint private CURR_ROUND_SUPPLY = 2072;
	uint private CURR_ROUND_TIME = 1649599200000;
	uint private maxMintAmount = 2;
	uint private nftPerAddressLimit = 2;
	bytes32 private verificationHash = 0x3b25f67d4e97f5c0030ea90ca2882dbcefa05d1ef454bb67a77533172f4c6f38;

	uint private currentVIPs = 0;
	
	bool public hasSaleStarted = false;
	bool public onlyWhitelisted = true;
	
	string public baseURI;
	
    uint256 private remaining = MAX_TOKENS;
    mapping(uint256 => uint256) private cache;
	
	constructor() ERC721("Juicy Fruits", "JF") {
		setBaseURI("http://api.juicyfruitsnft.com/juicy/");

	}

	function totalSupply() public view override returns(uint) {
		return _currentToken;
	}

	function _baseURI() internal view virtual override returns (string memory) {
		return baseURI;
	}

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }
	
	function walletOfOwner(address _owner) public view returns (uint256[] memory)
	{
		uint256 ownerTokenCount = balanceOf(_owner);
		uint256[] memory tokenIds = new uint256[](ownerTokenCount);
		for (uint256 i; i < ownerTokenCount; i++) {
			tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
		}
		return tokenIds;
	}

	function mintNFT(uint _mintAmount, bytes32[] memory proof) external payable {
		require(msg.value >= CURR_MINT_COST * _mintAmount, "Insufficient funds");
		require(hasSaleStarted == true, "Sale hasn't started");
		require(_mintAmount > 0, "Need to mint at least 1 NFT");
		require(_mintAmount <= maxMintAmount, "Max mint amount per transaction exceeded");
		require((_mintAmount + _currentToken) <= CURR_ROUND_SUPPLY, "We're at max supply!");
		require((_mintAmount  + balanceOf(msg.sender)) <= nftPerAddressLimit, "Max NFT per address exceeded");

        if(onlyWhitelisted == true) {
			bytes32 user = keccak256(abi.encodePacked(msg.sender));
			require(verify(user,proof), "User is not whitelisted");
        }

		for (uint256 i = 1; i <= _mintAmount; i++) {
			_currentToken++;
			CURR_ROUND_SUPPLY--;
			_safeMint(msg.sender, _currentToken);
		}
		
		
		require(payable(devAddress).send( ((msg.value / 100) * 10) ));
	}
	
	
   function getInformations() external view returns (string memory, uint, uint, uint, uint,uint,uint, bool,bool)
   {
		return (CURR_ROUND_NAME,CURR_ROUND_SUPPLY,CURR_ROUND_TIME,CURR_MINT_COST,maxMintAmount,nftPerAddressLimit, _currentToken, hasSaleStarted, onlyWhitelisted);
   }
	
	function verify(bytes32 user, bytes32[] memory proof) internal view returns (bool)
	{
		bytes32 computedHash = user;

		for (uint256 i = 0; i < proof.length; i++) {
			bytes32 proofElement = proof[i];

			if (computedHash <= proofElement) {
				computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
			} else {
				computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
			}
		}
		return computedHash == verificationHash;
	}

	//only owner functions
	
	function setNewRound(uint _supply, uint cost, string memory name, uint perTransactionLimit, uint perAddressLimit, uint theTime, bool isOnlyWhitelisted, bool saleState) external onlyOwner {
		require(_supply <= (MAX_TOKENS - _currentToken), "Exceeded supply");
		CURR_ROUND_SUPPLY = _supply;
		CURR_MINT_COST = cost;
		CURR_ROUND_NAME = name;
		maxMintAmount = perTransactionLimit;
		nftPerAddressLimit = perAddressLimit;
		CURR_ROUND_TIME = theTime;
		hasSaleStarted = saleState;
		onlyWhitelisted = isOnlyWhitelisted;
	}

	function setVerificationHash(bytes32 hash) external onlyOwner
	{
		verificationHash = hash;
	}	
	
	function setOnlyWhitelisted(bool _state) external onlyOwner {
		onlyWhitelisted = _state;
	}

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

	function reserveVIP(uint numTokens, address recipient) external onlyOwner {
		require((currentVIPs + numTokens) <= MAX_TOKENS_VIP, "Exceeded VIP supply");
		uint index;
		for(index = 1; index <= numTokens; index++) {
			_currentToken++;
			currentVIPs = currentVIPs + 1;
			uint theToken = currentVIPs + MAX_TOKENS;
			_safeMint(recipient, theToken);
		}
	}

	function Giveaways(uint numTokens, address recipient) external onlyOwner {
		require((_currentToken + numTokens) <= MAX_TOKENS, "Exceeded supply");
		uint index;
		for(index = 1; index <= numTokens; index++) {
			_currentToken++;
			_safeMint(recipient, _currentToken);
		}
	}

	function withdraw(uint amount) external onlyOwner {
		require(payable(msg.sender).send(amount));
	}
	
	
	function setSaleStarted(bool _state) external onlyOwner {
		hasSaleStarted = _state;
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CURR_MINT_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"Giveaways","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS_VIP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInformations","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reserveVIP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"perTransactionLimit","type":"uint256"},{"internalType":"uint256","name":"perAddressLimit","type":"uint256"},{"internalType":"uint256","name":"theTime","type":"uint256"},{"internalType":"bool","name":"isOnlyWhitelisted","type":"bool"},{"internalType":"bool","name":"saleState","type":"bool"}],"name":"setNewRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setSaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"setVerificationHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b5566d529ae9e860000600c556040518060400160405280600781526020017f50726573616c6500000000000000000000000000000000000000000000000000815250600d90805190602001906200006192919062000385565b50610818600e5565018013c63b00600f55600260105560026011557f3b25f67d4e97f5c0030ea90ca2882dbcefa05d1ef454bb67a77533172f4c6f3860001b60125560006013556000601460006101000a81548160ff0219169083151502179055506001601460016101000a81548160ff0219169083151502179055506108ae601655348015620000f157600080fd5b506040518060400160405280600c81526020017f4a756963792046727569747300000000000000000000000000000000000000008152506040518060400160405280600281526020017f4a4600000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200017692919062000385565b5080600190805190602001906200018f92919062000385565b505050620001b2620001a6620001e260201b60201c565b620001ea60201b60201c565b620001dc6040518060600160405280602481526020016200550560249139620002b060201b60201c565b6200051d565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002c0620001e260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002e66200035b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200033f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003369062000496565b60405180910390fd5b80601590805190602001906200035792919062000385565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200039390620004e7565b90600052602060002090601f016020900481019282620003b7576000855562000403565b82601f10620003d257805160ff191683800117855562000403565b8280016001018555821562000403579182015b8281111562000402578251825591602001919060010190620003e5565b5b50905062000412919062000416565b5090565b5b808211156200043157600081600090555060010162000417565b5090565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200047e60208362000435565b91506200048b8262000446565b602082019050919050565b60006020820190508181036000830152620004b1816200046f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200050057607f821691505b60208210811415620005175762000516620004b8565b5b50919050565b614fd8806200052d6000396000f3fe60806040526004361061020f5760003560e01c806370a0823111610118578063bff84fc5116100a0578063d62fd2961161006f578063d62fd296146107b3578063e985e9c5146107cf578063f2fde38b1461080c578063f47c84c514610835578063f79e66ba146108605761020f565b8063bff84fc5146106f9578063c342784414610722578063c87b56dd1461074d578063cc0b8d151461078a5761020f565b80639c70b512116100e75780639c70b5121461062a578063a22cb46514610655578063a854ffba1461067e578063aefbbc9d146106a7578063b88d4fde146106d05761020f565b806370a0823114610580578063715018a6146105bd5780638da5cb5b146105d457806395d89b41146105ff5761020f565b80633c5e310b1161019b5780634f6ccce71161016a5780634f6ccce71461048957806355f804b3146104c65780636352211e146104ef57806366e7ca181461052c5780636c0360eb146105555761020f565b80633c5e310b146103c75780633c952764146103fa57806342842e0e14610423578063438b63001461044c5761020f565b806318160ddd116101e257806318160ddd146102e25780631c8b232d1461030d57806323b872dd146103385780632e1a7d4d146103615780632f745c591461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906132c0565b61088b565b6040516102489190613308565b60405180910390f35b34801561025d57600080fd5b5061026661089d565b60405161027391906133bc565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190613414565b61092f565b6040516102b09190613482565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db91906134c9565b6109b4565b005b3480156102ee57600080fd5b506102f7610acc565b6040516103049190613518565b60405180910390f35b34801561031957600080fd5b50610322610ad6565b60405161032f9190613308565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a9190613533565b610ae9565b005b34801561036d57600080fd5b5061038860048036038101906103839190613414565b610b49565b005b34801561039657600080fd5b506103b160048036038101906103ac91906134c9565b610c06565b6040516103be9190613518565b60405180910390f35b3480156103d357600080fd5b506103dc610cab565b6040516103f199989796959493929190613586565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c9190613646565b610d96565b005b34801561042f57600080fd5b5061044a60048036038101906104459190613533565b610e2f565b005b34801561045857600080fd5b50610473600480360381019061046e9190613673565b610e4f565b604051610480919061375e565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab9190613414565b610efd565b6040516104bd9190613518565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e891906138b5565b610f6e565b005b3480156104fb57600080fd5b5061051660048036038101906105119190613414565b611004565b6040516105239190613482565b60405180910390f35b34801561053857600080fd5b50610553600480360381019061054e9190613934565b6110b6565b005b34801561056157600080fd5b5061056a61113c565b60405161057791906133bc565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613673565b6111ca565b6040516105b49190613518565b60405180910390f35b3480156105c957600080fd5b506105d2611282565b005b3480156105e057600080fd5b506105e961130a565b6040516105f69190613482565b60405180910390f35b34801561060b57600080fd5b50610614611334565b60405161062191906133bc565b60405180910390f35b34801561063657600080fd5b5061063f6113c6565b60405161064c9190613308565b60405180910390f35b34801561066157600080fd5b5061067c60048036038101906106779190613961565b6113d9565b005b34801561068a57600080fd5b506106a560048036038101906106a09190613646565b6113ef565b005b3480156106b357600080fd5b506106ce60048036038101906106c991906139a1565b611488565b005b3480156106dc57600080fd5b506106f760048036038101906106f29190613b14565b6115ce565b005b34801561070557600080fd5b50610720600480360381019061071b9190613b97565b611630565b005b34801561072e57600080fd5b5061073761176f565b6040516107449190613518565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f9190613414565b611775565b60405161078191906133bc565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613b97565b61181c565b005b6107cd60048036038101906107c89190613c9f565b611934565b005b3480156107db57600080fd5b506107f660048036038101906107f19190613cfb565b611c6a565b6040516108039190613308565b60405180910390f35b34801561081857600080fd5b50610833600480360381019061082e9190613673565b611cfe565b005b34801561084157600080fd5b5061084a611df6565b6040516108579190613518565b60405180910390f35b34801561086c57600080fd5b50610875611dfc565b6040516108829190613518565b60405180910390f35b600061089682611e01565b9050919050565b6060600080546108ac90613d6a565b80601f01602080910402602001604051908101604052809291908181526020018280546108d890613d6a565b80156109255780601f106108fa57610100808354040283529160200191610925565b820191906000526020600020905b81548152906001019060200180831161090857829003601f168201915b5050505050905090565b600061093a82611e7b565b610979576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097090613e0e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109bf82611004565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2790613ea0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4f611ee7565b73ffffffffffffffffffffffffffffffffffffffff161480610a7e5750610a7d81610a78611ee7565b611c6a565b5b610abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab490613f32565b60405180910390fd5b610ac78383611eef565b505050565b6000600b54905090565b601460009054906101000a900460ff1681565b610afa610af4611ee7565b82611fa8565b610b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3090613fc4565b60405180910390fd5b610b44838383612086565b505050565b610b51611ee7565b73ffffffffffffffffffffffffffffffffffffffff16610b6f61130a565b73ffffffffffffffffffffffffffffffffffffffff1614610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc90614030565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610c0357600080fd5b50565b6000610c11836111ca565b8210610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c49906140c2565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060600080600080600080600080600d600e54600f54600c54601054601154600b54601460009054906101000a900460ff16601460019054906101000a900460ff16888054610cf990613d6a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2590613d6a565b8015610d725780601f10610d4757610100808354040283529160200191610d72565b820191906000526020600020905b815481529060010190602001808311610d5557829003601f168201915b50505050509850985098509850985098509850985098509850909192939495969798565b610d9e611ee7565b73ffffffffffffffffffffffffffffffffffffffff16610dbc61130a565b73ffffffffffffffffffffffffffffffffffffffff1614610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0990614030565b60405180910390fd5b80601460016101000a81548160ff02191690831515021790555050565b610e4a838383604051806020016040528060008152506115ce565b505050565b60606000610e5c836111ca565b905060008167ffffffffffffffff811115610e7a57610e7961378a565b5b604051908082528060200260200182016040528015610ea85781602001602082028036833780820191505090505b50905060005b82811015610ef257610ec08582610c06565b828281518110610ed357610ed26140e2565b5b6020026020010181815250508080610eea90614140565b915050610eae565b508092505050919050565b6000610f076122ed565b8210610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f906141fb565b60405180910390fd5b60088281548110610f5c57610f5b6140e2565b5b90600052602060002001549050919050565b610f76611ee7565b73ffffffffffffffffffffffffffffffffffffffff16610f9461130a565b73ffffffffffffffffffffffffffffffffffffffff1614610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe190614030565b60405180910390fd5b80601590805190602001906110009291906131b1565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a49061428d565b60405180910390fd5b80915050919050565b6110be611ee7565b73ffffffffffffffffffffffffffffffffffffffff166110dc61130a565b73ffffffffffffffffffffffffffffffffffffffff1614611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990614030565b60405180910390fd5b8060128190555050565b6015805461114990613d6a565b80601f016020809104026020016040519081016040528092919081815260200182805461117590613d6a565b80156111c25780601f10611197576101008083540402835291602001916111c2565b820191906000526020600020905b8154815290600101906020018083116111a557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561123b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112329061431f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61128a611ee7565b73ffffffffffffffffffffffffffffffffffffffff166112a861130a565b73ffffffffffffffffffffffffffffffffffffffff16146112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590614030565b60405180910390fd5b61130860006122fa565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461134390613d6a565b80601f016020809104026020016040519081016040528092919081815260200182805461136f90613d6a565b80156113bc5780601f10611391576101008083540402835291602001916113bc565b820191906000526020600020905b81548152906001019060200180831161139f57829003601f168201915b5050505050905090565b601460019054906101000a900460ff1681565b6113eb6113e4611ee7565b83836123c0565b5050565b6113f7611ee7565b73ffffffffffffffffffffffffffffffffffffffff1661141561130a565b73ffffffffffffffffffffffffffffffffffffffff161461146b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146290614030565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b611490611ee7565b73ffffffffffffffffffffffffffffffffffffffff166114ae61130a565b73ffffffffffffffffffffffffffffffffffffffff1614611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fb90614030565b60405180910390fd5b600b546108ae611514919061433f565b881115611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d906143bf565b60405180910390fd5b87600e8190555086600c8190555085600d908051906020019061157a9291906131b1565b50846010819055508360118190555082600f8190555080601460006101000a81548160ff02191690831515021790555081601460016101000a81548160ff0219169083151502179055505050505050505050565b6115df6115d9611ee7565b83611fa8565b61161e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161590613fc4565b60405180910390fd5b61162a8484848461252d565b50505050565b611638611ee7565b73ffffffffffffffffffffffffffffffffffffffff1661165661130a565b73ffffffffffffffffffffffffffffffffffffffff16146116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614030565b60405180910390fd5b6001826013546116bc91906143df565b11156116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f490614481565b60405180910390fd5b6000600190505b82811161176a57600b600081548092919061171e90614140565b9190505550600160135461173291906143df565b60138190555060006108ae60135461174a91906143df565b90506117568382612589565b50808061176290614140565b915050611704565b505050565b600c5481565b606061178082611e7b565b6117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b690614513565b60405180910390fd5b60006117c96125a7565b905060008151116117e95760405180602001604052806000815250611814565b806117f384612639565b60405160200161180492919061456f565b6040516020818303038152906040525b915050919050565b611824611ee7565b73ffffffffffffffffffffffffffffffffffffffff1661184261130a565b73ffffffffffffffffffffffffffffffffffffffff1614611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90614030565b60405180910390fd5b6108ae82600b546118a991906143df565b11156118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e1906143bf565b60405180910390fd5b6000600190505b82811161192f57600b600081548092919061190b90614140565b919050555061191c82600b54612589565b808061192790614140565b9150506118f1565b505050565b81600c546119429190614593565b341015611984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197b90614639565b60405180910390fd5b60011515601460009054906101000a900460ff161515146119da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d1906146a5565b60405180910390fd5b60008211611a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1490614711565b60405180910390fd5b601054821115611a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a59906147a3565b60405180910390fd5b600e54600b5483611a7391906143df565b1115611ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aab9061480f565b60405180910390fd5b601154611ac0336111ca565b83611acb91906143df565b1115611b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b039061487b565b60405180910390fd5b60011515601460019054906101000a900460ff1615151415611b9e57600033604051602001611b3b91906148e3565b604051602081830303815290604052805190602001209050611b5d818361279a565b611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b939061494a565b60405180910390fd5b505b6000600190505b828111611bfb57600b6000815480929190611bbf90614140565b9190505550600e6000815480929190611bd79061496a565b9190505550611be833600b54612589565b8080611bf390614140565b915050611ba5565b5073a2efe2b517ed04b8f3707e47151b7f5b8621d83373ffffffffffffffffffffffffffffffffffffffff166108fc600a606434611c3991906149c3565b611c439190614593565b9081150290604051600060405180830381858888f19350505050611c6657600080fd5b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d06611ee7565b73ffffffffffffffffffffffffffffffffffffffff16611d2461130a565b73ffffffffffffffffffffffffffffffffffffffff1614611d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7190614030565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de190614a66565b60405180910390fd5b611df3816122fa565b50565b6108ae81565b600181565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e745750611e7382612851565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f6283611004565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611fb382611e7b565b611ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe990614af8565b60405180910390fd5b6000611ffd83611004565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061206c57508373ffffffffffffffffffffffffffffffffffffffff166120548461092f565b73ffffffffffffffffffffffffffffffffffffffff16145b8061207d575061207c8185611c6a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120a682611004565b73ffffffffffffffffffffffffffffffffffffffff16146120fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f390614b8a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561216c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216390614c1c565b60405180910390fd5b612177838383612933565b612182600082611eef565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121d2919061433f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461222991906143df565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122e8838383612943565b505050565b6000600880549050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561242f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242690614c88565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125209190613308565b60405180910390a3505050565b612538848484612086565b61254484848484612948565b612583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257a90614d1a565b60405180910390fd5b50505050565b6125a3828260405180602001604052806000815250612ad0565b5050565b6060601580546125b690613d6a565b80601f01602080910402602001604051908101604052809291908181526020018280546125e290613d6a565b801561262f5780601f106126045761010080835404028352916020019161262f565b820191906000526020600020905b81548152906001019060200180831161261257829003601f168201915b5050505050905090565b60606000821415612681576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612795565b600082905060005b600082146126b357808061269c90614140565b915050600a826126ac91906149c3565b9150612689565b60008167ffffffffffffffff8111156126cf576126ce61378a565b5b6040519080825280601f01601f1916602001820160405280156127015781602001600182028036833780820191505090505b5090505b6000851461278e5760018261271a919061433f565b9150600a856127299190614d3a565b603061273591906143df565b60f81b81838151811061274b5761274a6140e2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561278791906149c3565b9450612705565b8093505050505b919050565b60008083905060005b83518110156128425760008482815181106127c1576127c06140e2565b5b602002602001015190508083116128025782816040516020016127e5929190614d8c565b60405160208183030381529060405280519060200120925061282e565b8083604051602001612815929190614d8c565b6040516020818303038152906040528051906020012092505b50808061283a90614140565b9150506127a3565b50601254811491505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061291c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061292c575061292b82612b2b565b5b9050919050565b61293e838383612b95565b505050565b505050565b60006129698473ffffffffffffffffffffffffffffffffffffffff16612ca9565b15612ac3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612992611ee7565b8786866040518563ffffffff1660e01b81526004016129b49493929190614e0d565b6020604051808303816000875af19250505080156129f057506040513d601f19601f820116820180604052508101906129ed9190614e6e565b60015b612a73573d8060008114612a20576040519150601f19603f3d011682016040523d82523d6000602084013e612a25565b606091505b50600081511415612a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6290614d1a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ac8565b600190505b949350505050565b612ada8383612ccc565b612ae76000848484612948565b612b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1d90614d1a565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ba0838383612ea6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612be357612bde81612eab565b612c22565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c2157612c208382612ef4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c6557612c6081613061565b612ca4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ca357612ca28282613132565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3390614ee7565b60405180910390fd5b612d4581611e7b565b15612d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7c90614f53565b60405180910390fd5b612d9160008383612933565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612de191906143df565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ea260008383612943565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f01846111ca565b612f0b919061433f565b9050600060076000848152602001908152602001600020549050818114612ff0576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613075919061433f565b90506000600960008481526020019081526020016000205490506000600883815481106130a5576130a46140e2565b5b9060005260206000200154905080600883815481106130c7576130c66140e2565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061311657613115614f73565b5b6001900381819060005260206000200160009055905550505050565b600061313d836111ca565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546131bd90613d6a565b90600052602060002090601f0160209004810192826131df5760008555613226565b82601f106131f857805160ff1916838001178555613226565b82800160010185558215613226579182015b8281111561322557825182559160200191906001019061320a565b5b5090506132339190613237565b5090565b5b80821115613250576000816000905550600101613238565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61329d81613268565b81146132a857600080fd5b50565b6000813590506132ba81613294565b92915050565b6000602082840312156132d6576132d561325e565b5b60006132e4848285016132ab565b91505092915050565b60008115159050919050565b613302816132ed565b82525050565b600060208201905061331d60008301846132f9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561335d578082015181840152602081019050613342565b8381111561336c576000848401525b50505050565b6000601f19601f8301169050919050565b600061338e82613323565b613398818561332e565b93506133a881856020860161333f565b6133b181613372565b840191505092915050565b600060208201905081810360008301526133d68184613383565b905092915050565b6000819050919050565b6133f1816133de565b81146133fc57600080fd5b50565b60008135905061340e816133e8565b92915050565b60006020828403121561342a5761342961325e565b5b6000613438848285016133ff565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061346c82613441565b9050919050565b61347c81613461565b82525050565b60006020820190506134976000830184613473565b92915050565b6134a681613461565b81146134b157600080fd5b50565b6000813590506134c38161349d565b92915050565b600080604083850312156134e0576134df61325e565b5b60006134ee858286016134b4565b92505060206134ff858286016133ff565b9150509250929050565b613512816133de565b82525050565b600060208201905061352d6000830184613509565b92915050565b60008060006060848603121561354c5761354b61325e565b5b600061355a868287016134b4565b935050602061356b868287016134b4565b925050604061357c868287016133ff565b9150509250925092565b60006101208201905081810360008301526135a1818c613383565b90506135b0602083018b613509565b6135bd604083018a613509565b6135ca6060830189613509565b6135d76080830188613509565b6135e460a0830187613509565b6135f160c0830186613509565b6135fe60e08301856132f9565b61360c6101008301846132f9565b9a9950505050505050505050565b613623816132ed565b811461362e57600080fd5b50565b6000813590506136408161361a565b92915050565b60006020828403121561365c5761365b61325e565b5b600061366a84828501613631565b91505092915050565b6000602082840312156136895761368861325e565b5b6000613697848285016134b4565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136d5816133de565b82525050565b60006136e783836136cc565b60208301905092915050565b6000602082019050919050565b600061370b826136a0565b61371581856136ab565b9350613720836136bc565b8060005b8381101561375157815161373888826136db565b9750613743836136f3565b925050600181019050613724565b5085935050505092915050565b600060208201905081810360008301526137788184613700565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137c282613372565b810181811067ffffffffffffffff821117156137e1576137e061378a565b5b80604052505050565b60006137f4613254565b905061380082826137b9565b919050565b600067ffffffffffffffff8211156138205761381f61378a565b5b61382982613372565b9050602081019050919050565b82818337600083830152505050565b600061385861385384613805565b6137ea565b90508281526020810184848401111561387457613873613785565b5b61387f848285613836565b509392505050565b600082601f83011261389c5761389b613780565b5b81356138ac848260208601613845565b91505092915050565b6000602082840312156138cb576138ca61325e565b5b600082013567ffffffffffffffff8111156138e9576138e8613263565b5b6138f584828501613887565b91505092915050565b6000819050919050565b613911816138fe565b811461391c57600080fd5b50565b60008135905061392e81613908565b92915050565b60006020828403121561394a5761394961325e565b5b60006139588482850161391f565b91505092915050565b600080604083850312156139785761397761325e565b5b6000613986858286016134b4565b925050602061399785828601613631565b9150509250929050565b600080600080600080600080610100898b0312156139c2576139c161325e565b5b60006139d08b828c016133ff565b98505060206139e18b828c016133ff565b975050604089013567ffffffffffffffff811115613a0257613a01613263565b5b613a0e8b828c01613887565b9650506060613a1f8b828c016133ff565b9550506080613a308b828c016133ff565b94505060a0613a418b828c016133ff565b93505060c0613a528b828c01613631565b92505060e0613a638b828c01613631565b9150509295985092959890939650565b600067ffffffffffffffff821115613a8e57613a8d61378a565b5b613a9782613372565b9050602081019050919050565b6000613ab7613ab284613a73565b6137ea565b905082815260208101848484011115613ad357613ad2613785565b5b613ade848285613836565b509392505050565b600082601f830112613afb57613afa613780565b5b8135613b0b848260208601613aa4565b91505092915050565b60008060008060808587031215613b2e57613b2d61325e565b5b6000613b3c878288016134b4565b9450506020613b4d878288016134b4565b9350506040613b5e878288016133ff565b925050606085013567ffffffffffffffff811115613b7f57613b7e613263565b5b613b8b87828801613ae6565b91505092959194509250565b60008060408385031215613bae57613bad61325e565b5b6000613bbc858286016133ff565b9250506020613bcd858286016134b4565b9150509250929050565b600067ffffffffffffffff821115613bf257613bf161378a565b5b602082029050602081019050919050565b600080fd5b6000613c1b613c1684613bd7565b6137ea565b90508083825260208201905060208402830185811115613c3e57613c3d613c03565b5b835b81811015613c675780613c53888261391f565b845260208401935050602081019050613c40565b5050509392505050565b600082601f830112613c8657613c85613780565b5b8135613c96848260208601613c08565b91505092915050565b60008060408385031215613cb657613cb561325e565b5b6000613cc4858286016133ff565b925050602083013567ffffffffffffffff811115613ce557613ce4613263565b5b613cf185828601613c71565b9150509250929050565b60008060408385031215613d1257613d1161325e565b5b6000613d20858286016134b4565b9250506020613d31858286016134b4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613d8257607f821691505b60208210811415613d9657613d95613d3b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613df8602c8361332e565b9150613e0382613d9c565b604082019050919050565b60006020820190508181036000830152613e2781613deb565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e8a60218361332e565b9150613e9582613e2e565b604082019050919050565b60006020820190508181036000830152613eb981613e7d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613f1c60388361332e565b9150613f2782613ec0565b604082019050919050565b60006020820190508181036000830152613f4b81613f0f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613fae60318361332e565b9150613fb982613f52565b604082019050919050565b60006020820190508181036000830152613fdd81613fa1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061401a60208361332e565b915061402582613fe4565b602082019050919050565b600060208201905081810360008301526140498161400d565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006140ac602b8361332e565b91506140b782614050565b604082019050919050565b600060208201905081810360008301526140db8161409f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061414b826133de565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561417e5761417d614111565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006141e5602c8361332e565b91506141f082614189565b604082019050919050565b60006020820190508181036000830152614214816141d8565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061427760298361332e565b91506142828261421b565b604082019050919050565b600060208201905081810360008301526142a68161426a565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614309602a8361332e565b9150614314826142ad565b604082019050919050565b60006020820190508181036000830152614338816142fc565b9050919050565b600061434a826133de565b9150614355836133de565b92508282101561436857614367614111565b5b828203905092915050565b7f457863656564656420737570706c790000000000000000000000000000000000600082015250565b60006143a9600f8361332e565b91506143b482614373565b602082019050919050565b600060208201905081810360008301526143d88161439c565b9050919050565b60006143ea826133de565b91506143f5836133de565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561442a57614429614111565b5b828201905092915050565b7f45786365656465642056495020737570706c7900000000000000000000000000600082015250565b600061446b60138361332e565b915061447682614435565b602082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006144fd602f8361332e565b9150614508826144a1565b604082019050919050565b6000602082019050818103600083015261452c816144f0565b9050919050565b600081905092915050565b600061454982613323565b6145538185614533565b935061456381856020860161333f565b80840191505092915050565b600061457b828561453e565b9150614587828461453e565b91508190509392505050565b600061459e826133de565b91506145a9836133de565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145e2576145e1614111565b5b828202905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b600061462360128361332e565b915061462e826145ed565b602082019050919050565b6000602082019050818103600083015261465281614616565b9050919050565b7f53616c65206861736e2774207374617274656400000000000000000000000000600082015250565b600061468f60138361332e565b915061469a82614659565b602082019050919050565b600060208201905081810360008301526146be81614682565b9050919050565b7f4e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b60006146fb601b8361332e565b9150614706826146c5565b602082019050919050565b6000602082019050818103600083015261472a816146ee565b9050919050565b7f4d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e2060008201527f6578636565646564000000000000000000000000000000000000000000000000602082015250565b600061478d60288361332e565b915061479882614731565b604082019050919050565b600060208201905081810360008301526147bc81614780565b9050919050565b7f5765277265206174206d617820737570706c7921000000000000000000000000600082015250565b60006147f960148361332e565b9150614804826147c3565b602082019050919050565b60006020820190508181036000830152614828816147ec565b9050919050565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000614865601c8361332e565b91506148708261482f565b602082019050919050565b6000602082019050818103600083015261489481614858565b9050919050565b60008160601b9050919050565b60006148b38261489b565b9050919050565b60006148c5826148a8565b9050919050565b6148dd6148d882613461565b6148ba565b82525050565b60006148ef82846148cc565b60148201915081905092915050565b7f55736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b600061493460178361332e565b915061493f826148fe565b602082019050919050565b6000602082019050818103600083015261496381614927565b9050919050565b6000614975826133de565b9150600082141561498957614988614111565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149ce826133de565b91506149d9836133de565b9250826149e9576149e8614994565b5b828204905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a5060268361332e565b9150614a5b826149f4565b604082019050919050565b60006020820190508181036000830152614a7f81614a43565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614ae2602c8361332e565b9150614aed82614a86565b604082019050919050565b60006020820190508181036000830152614b1181614ad5565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614b7460258361332e565b9150614b7f82614b18565b604082019050919050565b60006020820190508181036000830152614ba381614b67565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614c0660248361332e565b9150614c1182614baa565b604082019050919050565b60006020820190508181036000830152614c3581614bf9565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614c7260198361332e565b9150614c7d82614c3c565b602082019050919050565b60006020820190508181036000830152614ca181614c65565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614d0460328361332e565b9150614d0f82614ca8565b604082019050919050565b60006020820190508181036000830152614d3381614cf7565b9050919050565b6000614d45826133de565b9150614d50836133de565b925082614d6057614d5f614994565b5b828206905092915050565b6000819050919050565b614d86614d81826138fe565b614d6b565b82525050565b6000614d988285614d75565b602082019150614da88284614d75565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000614ddf82614db8565b614de98185614dc3565b9350614df981856020860161333f565b614e0281613372565b840191505092915050565b6000608082019050614e226000830187613473565b614e2f6020830186613473565b614e3c6040830185613509565b8181036060830152614e4e8184614dd4565b905095945050505050565b600081519050614e6881613294565b92915050565b600060208284031215614e8457614e8361325e565b5b6000614e9284828501614e59565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614ed160208361332e565b9150614edc82614e9b565b602082019050919050565b60006020820190508181036000830152614f0081614ec4565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614f3d601c8361332e565b9150614f4882614f07565b602082019050919050565b60006020820190508181036000830152614f6c81614f30565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122019a9accb46167342c97273e3cd3e99523912182ab0360dceefa7fcefc396ed8d64736f6c634300080c0033687474703a2f2f6170692e6a756963796672756974736e66742e636f6d2f6a756963792f

Deployed Bytecode

0x60806040526004361061020f5760003560e01c806370a0823111610118578063bff84fc5116100a0578063d62fd2961161006f578063d62fd296146107b3578063e985e9c5146107cf578063f2fde38b1461080c578063f47c84c514610835578063f79e66ba146108605761020f565b8063bff84fc5146106f9578063c342784414610722578063c87b56dd1461074d578063cc0b8d151461078a5761020f565b80639c70b512116100e75780639c70b5121461062a578063a22cb46514610655578063a854ffba1461067e578063aefbbc9d146106a7578063b88d4fde146106d05761020f565b806370a0823114610580578063715018a6146105bd5780638da5cb5b146105d457806395d89b41146105ff5761020f565b80633c5e310b1161019b5780634f6ccce71161016a5780634f6ccce71461048957806355f804b3146104c65780636352211e146104ef57806366e7ca181461052c5780636c0360eb146105555761020f565b80633c5e310b146103c75780633c952764146103fa57806342842e0e14610423578063438b63001461044c5761020f565b806318160ddd116101e257806318160ddd146102e25780631c8b232d1461030d57806323b872dd146103385780632e1a7d4d146103615780632f745c591461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906132c0565b61088b565b6040516102489190613308565b60405180910390f35b34801561025d57600080fd5b5061026661089d565b60405161027391906133bc565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190613414565b61092f565b6040516102b09190613482565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db91906134c9565b6109b4565b005b3480156102ee57600080fd5b506102f7610acc565b6040516103049190613518565b60405180910390f35b34801561031957600080fd5b50610322610ad6565b60405161032f9190613308565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a9190613533565b610ae9565b005b34801561036d57600080fd5b5061038860048036038101906103839190613414565b610b49565b005b34801561039657600080fd5b506103b160048036038101906103ac91906134c9565b610c06565b6040516103be9190613518565b60405180910390f35b3480156103d357600080fd5b506103dc610cab565b6040516103f199989796959493929190613586565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c9190613646565b610d96565b005b34801561042f57600080fd5b5061044a60048036038101906104459190613533565b610e2f565b005b34801561045857600080fd5b50610473600480360381019061046e9190613673565b610e4f565b604051610480919061375e565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab9190613414565b610efd565b6040516104bd9190613518565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e891906138b5565b610f6e565b005b3480156104fb57600080fd5b5061051660048036038101906105119190613414565b611004565b6040516105239190613482565b60405180910390f35b34801561053857600080fd5b50610553600480360381019061054e9190613934565b6110b6565b005b34801561056157600080fd5b5061056a61113c565b60405161057791906133bc565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613673565b6111ca565b6040516105b49190613518565b60405180910390f35b3480156105c957600080fd5b506105d2611282565b005b3480156105e057600080fd5b506105e961130a565b6040516105f69190613482565b60405180910390f35b34801561060b57600080fd5b50610614611334565b60405161062191906133bc565b60405180910390f35b34801561063657600080fd5b5061063f6113c6565b60405161064c9190613308565b60405180910390f35b34801561066157600080fd5b5061067c60048036038101906106779190613961565b6113d9565b005b34801561068a57600080fd5b506106a560048036038101906106a09190613646565b6113ef565b005b3480156106b357600080fd5b506106ce60048036038101906106c991906139a1565b611488565b005b3480156106dc57600080fd5b506106f760048036038101906106f29190613b14565b6115ce565b005b34801561070557600080fd5b50610720600480360381019061071b9190613b97565b611630565b005b34801561072e57600080fd5b5061073761176f565b6040516107449190613518565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f9190613414565b611775565b60405161078191906133bc565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613b97565b61181c565b005b6107cd60048036038101906107c89190613c9f565b611934565b005b3480156107db57600080fd5b506107f660048036038101906107f19190613cfb565b611c6a565b6040516108039190613308565b60405180910390f35b34801561081857600080fd5b50610833600480360381019061082e9190613673565b611cfe565b005b34801561084157600080fd5b5061084a611df6565b6040516108579190613518565b60405180910390f35b34801561086c57600080fd5b50610875611dfc565b6040516108829190613518565b60405180910390f35b600061089682611e01565b9050919050565b6060600080546108ac90613d6a565b80601f01602080910402602001604051908101604052809291908181526020018280546108d890613d6a565b80156109255780601f106108fa57610100808354040283529160200191610925565b820191906000526020600020905b81548152906001019060200180831161090857829003601f168201915b5050505050905090565b600061093a82611e7b565b610979576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097090613e0e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109bf82611004565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2790613ea0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4f611ee7565b73ffffffffffffffffffffffffffffffffffffffff161480610a7e5750610a7d81610a78611ee7565b611c6a565b5b610abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab490613f32565b60405180910390fd5b610ac78383611eef565b505050565b6000600b54905090565b601460009054906101000a900460ff1681565b610afa610af4611ee7565b82611fa8565b610b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3090613fc4565b60405180910390fd5b610b44838383612086565b505050565b610b51611ee7565b73ffffffffffffffffffffffffffffffffffffffff16610b6f61130a565b73ffffffffffffffffffffffffffffffffffffffff1614610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc90614030565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610c0357600080fd5b50565b6000610c11836111ca565b8210610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c49906140c2565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060600080600080600080600080600d600e54600f54600c54601054601154600b54601460009054906101000a900460ff16601460019054906101000a900460ff16888054610cf990613d6a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2590613d6a565b8015610d725780601f10610d4757610100808354040283529160200191610d72565b820191906000526020600020905b815481529060010190602001808311610d5557829003601f168201915b50505050509850985098509850985098509850985098509850909192939495969798565b610d9e611ee7565b73ffffffffffffffffffffffffffffffffffffffff16610dbc61130a565b73ffffffffffffffffffffffffffffffffffffffff1614610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0990614030565b60405180910390fd5b80601460016101000a81548160ff02191690831515021790555050565b610e4a838383604051806020016040528060008152506115ce565b505050565b60606000610e5c836111ca565b905060008167ffffffffffffffff811115610e7a57610e7961378a565b5b604051908082528060200260200182016040528015610ea85781602001602082028036833780820191505090505b50905060005b82811015610ef257610ec08582610c06565b828281518110610ed357610ed26140e2565b5b6020026020010181815250508080610eea90614140565b915050610eae565b508092505050919050565b6000610f076122ed565b8210610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f906141fb565b60405180910390fd5b60088281548110610f5c57610f5b6140e2565b5b90600052602060002001549050919050565b610f76611ee7565b73ffffffffffffffffffffffffffffffffffffffff16610f9461130a565b73ffffffffffffffffffffffffffffffffffffffff1614610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe190614030565b60405180910390fd5b80601590805190602001906110009291906131b1565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a49061428d565b60405180910390fd5b80915050919050565b6110be611ee7565b73ffffffffffffffffffffffffffffffffffffffff166110dc61130a565b73ffffffffffffffffffffffffffffffffffffffff1614611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990614030565b60405180910390fd5b8060128190555050565b6015805461114990613d6a565b80601f016020809104026020016040519081016040528092919081815260200182805461117590613d6a565b80156111c25780601f10611197576101008083540402835291602001916111c2565b820191906000526020600020905b8154815290600101906020018083116111a557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561123b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112329061431f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61128a611ee7565b73ffffffffffffffffffffffffffffffffffffffff166112a861130a565b73ffffffffffffffffffffffffffffffffffffffff16146112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590614030565b60405180910390fd5b61130860006122fa565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461134390613d6a565b80601f016020809104026020016040519081016040528092919081815260200182805461136f90613d6a565b80156113bc5780601f10611391576101008083540402835291602001916113bc565b820191906000526020600020905b81548152906001019060200180831161139f57829003601f168201915b5050505050905090565b601460019054906101000a900460ff1681565b6113eb6113e4611ee7565b83836123c0565b5050565b6113f7611ee7565b73ffffffffffffffffffffffffffffffffffffffff1661141561130a565b73ffffffffffffffffffffffffffffffffffffffff161461146b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146290614030565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b611490611ee7565b73ffffffffffffffffffffffffffffffffffffffff166114ae61130a565b73ffffffffffffffffffffffffffffffffffffffff1614611504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fb90614030565b60405180910390fd5b600b546108ae611514919061433f565b881115611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d906143bf565b60405180910390fd5b87600e8190555086600c8190555085600d908051906020019061157a9291906131b1565b50846010819055508360118190555082600f8190555080601460006101000a81548160ff02191690831515021790555081601460016101000a81548160ff0219169083151502179055505050505050505050565b6115df6115d9611ee7565b83611fa8565b61161e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161590613fc4565b60405180910390fd5b61162a8484848461252d565b50505050565b611638611ee7565b73ffffffffffffffffffffffffffffffffffffffff1661165661130a565b73ffffffffffffffffffffffffffffffffffffffff16146116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614030565b60405180910390fd5b6001826013546116bc91906143df565b11156116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f490614481565b60405180910390fd5b6000600190505b82811161176a57600b600081548092919061171e90614140565b9190505550600160135461173291906143df565b60138190555060006108ae60135461174a91906143df565b90506117568382612589565b50808061176290614140565b915050611704565b505050565b600c5481565b606061178082611e7b565b6117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b690614513565b60405180910390fd5b60006117c96125a7565b905060008151116117e95760405180602001604052806000815250611814565b806117f384612639565b60405160200161180492919061456f565b6040516020818303038152906040525b915050919050565b611824611ee7565b73ffffffffffffffffffffffffffffffffffffffff1661184261130a565b73ffffffffffffffffffffffffffffffffffffffff1614611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90614030565b60405180910390fd5b6108ae82600b546118a991906143df565b11156118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e1906143bf565b60405180910390fd5b6000600190505b82811161192f57600b600081548092919061190b90614140565b919050555061191c82600b54612589565b808061192790614140565b9150506118f1565b505050565b81600c546119429190614593565b341015611984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197b90614639565b60405180910390fd5b60011515601460009054906101000a900460ff161515146119da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d1906146a5565b60405180910390fd5b60008211611a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1490614711565b60405180910390fd5b601054821115611a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a59906147a3565b60405180910390fd5b600e54600b5483611a7391906143df565b1115611ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aab9061480f565b60405180910390fd5b601154611ac0336111ca565b83611acb91906143df565b1115611b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b039061487b565b60405180910390fd5b60011515601460019054906101000a900460ff1615151415611b9e57600033604051602001611b3b91906148e3565b604051602081830303815290604052805190602001209050611b5d818361279a565b611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b939061494a565b60405180910390fd5b505b6000600190505b828111611bfb57600b6000815480929190611bbf90614140565b9190505550600e6000815480929190611bd79061496a565b9190505550611be833600b54612589565b8080611bf390614140565b915050611ba5565b5073a2efe2b517ed04b8f3707e47151b7f5b8621d83373ffffffffffffffffffffffffffffffffffffffff166108fc600a606434611c3991906149c3565b611c439190614593565b9081150290604051600060405180830381858888f19350505050611c6657600080fd5b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d06611ee7565b73ffffffffffffffffffffffffffffffffffffffff16611d2461130a565b73ffffffffffffffffffffffffffffffffffffffff1614611d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7190614030565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de190614a66565b60405180910390fd5b611df3816122fa565b50565b6108ae81565b600181565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e745750611e7382612851565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f6283611004565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611fb382611e7b565b611ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe990614af8565b60405180910390fd5b6000611ffd83611004565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061206c57508373ffffffffffffffffffffffffffffffffffffffff166120548461092f565b73ffffffffffffffffffffffffffffffffffffffff16145b8061207d575061207c8185611c6a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120a682611004565b73ffffffffffffffffffffffffffffffffffffffff16146120fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f390614b8a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561216c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216390614c1c565b60405180910390fd5b612177838383612933565b612182600082611eef565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121d2919061433f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461222991906143df565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122e8838383612943565b505050565b6000600880549050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561242f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242690614c88565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125209190613308565b60405180910390a3505050565b612538848484612086565b61254484848484612948565b612583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257a90614d1a565b60405180910390fd5b50505050565b6125a3828260405180602001604052806000815250612ad0565b5050565b6060601580546125b690613d6a565b80601f01602080910402602001604051908101604052809291908181526020018280546125e290613d6a565b801561262f5780601f106126045761010080835404028352916020019161262f565b820191906000526020600020905b81548152906001019060200180831161261257829003601f168201915b5050505050905090565b60606000821415612681576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612795565b600082905060005b600082146126b357808061269c90614140565b915050600a826126ac91906149c3565b9150612689565b60008167ffffffffffffffff8111156126cf576126ce61378a565b5b6040519080825280601f01601f1916602001820160405280156127015781602001600182028036833780820191505090505b5090505b6000851461278e5760018261271a919061433f565b9150600a856127299190614d3a565b603061273591906143df565b60f81b81838151811061274b5761274a6140e2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561278791906149c3565b9450612705565b8093505050505b919050565b60008083905060005b83518110156128425760008482815181106127c1576127c06140e2565b5b602002602001015190508083116128025782816040516020016127e5929190614d8c565b60405160208183030381529060405280519060200120925061282e565b8083604051602001612815929190614d8c565b6040516020818303038152906040528051906020012092505b50808061283a90614140565b9150506127a3565b50601254811491505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061291c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061292c575061292b82612b2b565b5b9050919050565b61293e838383612b95565b505050565b505050565b60006129698473ffffffffffffffffffffffffffffffffffffffff16612ca9565b15612ac3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612992611ee7565b8786866040518563ffffffff1660e01b81526004016129b49493929190614e0d565b6020604051808303816000875af19250505080156129f057506040513d601f19601f820116820180604052508101906129ed9190614e6e565b60015b612a73573d8060008114612a20576040519150601f19603f3d011682016040523d82523d6000602084013e612a25565b606091505b50600081511415612a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6290614d1a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ac8565b600190505b949350505050565b612ada8383612ccc565b612ae76000848484612948565b612b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1d90614d1a565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612ba0838383612ea6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612be357612bde81612eab565b612c22565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c2157612c208382612ef4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c6557612c6081613061565b612ca4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ca357612ca28282613132565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3390614ee7565b60405180910390fd5b612d4581611e7b565b15612d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7c90614f53565b60405180910390fd5b612d9160008383612933565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612de191906143df565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ea260008383612943565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f01846111ca565b612f0b919061433f565b9050600060076000848152602001908152602001600020549050818114612ff0576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613075919061433f565b90506000600960008481526020019081526020016000205490506000600883815481106130a5576130a46140e2565b5b9060005260206000200154905080600883815481106130c7576130c66140e2565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061311657613115614f73565b5b6001900381819060005260206000200160009055905550505050565b600061313d836111ca565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546131bd90613d6a565b90600052602060002090601f0160209004810192826131df5760008555613226565b82601f106131f857805160ff1916838001178555613226565b82800160010185558215613226579182015b8281111561322557825182559160200191906001019061320a565b5b5090506132339190613237565b5090565b5b80821115613250576000816000905550600101613238565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61329d81613268565b81146132a857600080fd5b50565b6000813590506132ba81613294565b92915050565b6000602082840312156132d6576132d561325e565b5b60006132e4848285016132ab565b91505092915050565b60008115159050919050565b613302816132ed565b82525050565b600060208201905061331d60008301846132f9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561335d578082015181840152602081019050613342565b8381111561336c576000848401525b50505050565b6000601f19601f8301169050919050565b600061338e82613323565b613398818561332e565b93506133a881856020860161333f565b6133b181613372565b840191505092915050565b600060208201905081810360008301526133d68184613383565b905092915050565b6000819050919050565b6133f1816133de565b81146133fc57600080fd5b50565b60008135905061340e816133e8565b92915050565b60006020828403121561342a5761342961325e565b5b6000613438848285016133ff565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061346c82613441565b9050919050565b61347c81613461565b82525050565b60006020820190506134976000830184613473565b92915050565b6134a681613461565b81146134b157600080fd5b50565b6000813590506134c38161349d565b92915050565b600080604083850312156134e0576134df61325e565b5b60006134ee858286016134b4565b92505060206134ff858286016133ff565b9150509250929050565b613512816133de565b82525050565b600060208201905061352d6000830184613509565b92915050565b60008060006060848603121561354c5761354b61325e565b5b600061355a868287016134b4565b935050602061356b868287016134b4565b925050604061357c868287016133ff565b9150509250925092565b60006101208201905081810360008301526135a1818c613383565b90506135b0602083018b613509565b6135bd604083018a613509565b6135ca6060830189613509565b6135d76080830188613509565b6135e460a0830187613509565b6135f160c0830186613509565b6135fe60e08301856132f9565b61360c6101008301846132f9565b9a9950505050505050505050565b613623816132ed565b811461362e57600080fd5b50565b6000813590506136408161361a565b92915050565b60006020828403121561365c5761365b61325e565b5b600061366a84828501613631565b91505092915050565b6000602082840312156136895761368861325e565b5b6000613697848285016134b4565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136d5816133de565b82525050565b60006136e783836136cc565b60208301905092915050565b6000602082019050919050565b600061370b826136a0565b61371581856136ab565b9350613720836136bc565b8060005b8381101561375157815161373888826136db565b9750613743836136f3565b925050600181019050613724565b5085935050505092915050565b600060208201905081810360008301526137788184613700565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137c282613372565b810181811067ffffffffffffffff821117156137e1576137e061378a565b5b80604052505050565b60006137f4613254565b905061380082826137b9565b919050565b600067ffffffffffffffff8211156138205761381f61378a565b5b61382982613372565b9050602081019050919050565b82818337600083830152505050565b600061385861385384613805565b6137ea565b90508281526020810184848401111561387457613873613785565b5b61387f848285613836565b509392505050565b600082601f83011261389c5761389b613780565b5b81356138ac848260208601613845565b91505092915050565b6000602082840312156138cb576138ca61325e565b5b600082013567ffffffffffffffff8111156138e9576138e8613263565b5b6138f584828501613887565b91505092915050565b6000819050919050565b613911816138fe565b811461391c57600080fd5b50565b60008135905061392e81613908565b92915050565b60006020828403121561394a5761394961325e565b5b60006139588482850161391f565b91505092915050565b600080604083850312156139785761397761325e565b5b6000613986858286016134b4565b925050602061399785828601613631565b9150509250929050565b600080600080600080600080610100898b0312156139c2576139c161325e565b5b60006139d08b828c016133ff565b98505060206139e18b828c016133ff565b975050604089013567ffffffffffffffff811115613a0257613a01613263565b5b613a0e8b828c01613887565b9650506060613a1f8b828c016133ff565b9550506080613a308b828c016133ff565b94505060a0613a418b828c016133ff565b93505060c0613a528b828c01613631565b92505060e0613a638b828c01613631565b9150509295985092959890939650565b600067ffffffffffffffff821115613a8e57613a8d61378a565b5b613a9782613372565b9050602081019050919050565b6000613ab7613ab284613a73565b6137ea565b905082815260208101848484011115613ad357613ad2613785565b5b613ade848285613836565b509392505050565b600082601f830112613afb57613afa613780565b5b8135613b0b848260208601613aa4565b91505092915050565b60008060008060808587031215613b2e57613b2d61325e565b5b6000613b3c878288016134b4565b9450506020613b4d878288016134b4565b9350506040613b5e878288016133ff565b925050606085013567ffffffffffffffff811115613b7f57613b7e613263565b5b613b8b87828801613ae6565b91505092959194509250565b60008060408385031215613bae57613bad61325e565b5b6000613bbc858286016133ff565b9250506020613bcd858286016134b4565b9150509250929050565b600067ffffffffffffffff821115613bf257613bf161378a565b5b602082029050602081019050919050565b600080fd5b6000613c1b613c1684613bd7565b6137ea565b90508083825260208201905060208402830185811115613c3e57613c3d613c03565b5b835b81811015613c675780613c53888261391f565b845260208401935050602081019050613c40565b5050509392505050565b600082601f830112613c8657613c85613780565b5b8135613c96848260208601613c08565b91505092915050565b60008060408385031215613cb657613cb561325e565b5b6000613cc4858286016133ff565b925050602083013567ffffffffffffffff811115613ce557613ce4613263565b5b613cf185828601613c71565b9150509250929050565b60008060408385031215613d1257613d1161325e565b5b6000613d20858286016134b4565b9250506020613d31858286016134b4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613d8257607f821691505b60208210811415613d9657613d95613d3b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613df8602c8361332e565b9150613e0382613d9c565b604082019050919050565b60006020820190508181036000830152613e2781613deb565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e8a60218361332e565b9150613e9582613e2e565b604082019050919050565b60006020820190508181036000830152613eb981613e7d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613f1c60388361332e565b9150613f2782613ec0565b604082019050919050565b60006020820190508181036000830152613f4b81613f0f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613fae60318361332e565b9150613fb982613f52565b604082019050919050565b60006020820190508181036000830152613fdd81613fa1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061401a60208361332e565b915061402582613fe4565b602082019050919050565b600060208201905081810360008301526140498161400d565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006140ac602b8361332e565b91506140b782614050565b604082019050919050565b600060208201905081810360008301526140db8161409f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061414b826133de565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561417e5761417d614111565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006141e5602c8361332e565b91506141f082614189565b604082019050919050565b60006020820190508181036000830152614214816141d8565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061427760298361332e565b91506142828261421b565b604082019050919050565b600060208201905081810360008301526142a68161426a565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614309602a8361332e565b9150614314826142ad565b604082019050919050565b60006020820190508181036000830152614338816142fc565b9050919050565b600061434a826133de565b9150614355836133de565b92508282101561436857614367614111565b5b828203905092915050565b7f457863656564656420737570706c790000000000000000000000000000000000600082015250565b60006143a9600f8361332e565b91506143b482614373565b602082019050919050565b600060208201905081810360008301526143d88161439c565b9050919050565b60006143ea826133de565b91506143f5836133de565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561442a57614429614111565b5b828201905092915050565b7f45786365656465642056495020737570706c7900000000000000000000000000600082015250565b600061446b60138361332e565b915061447682614435565b602082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006144fd602f8361332e565b9150614508826144a1565b604082019050919050565b6000602082019050818103600083015261452c816144f0565b9050919050565b600081905092915050565b600061454982613323565b6145538185614533565b935061456381856020860161333f565b80840191505092915050565b600061457b828561453e565b9150614587828461453e565b91508190509392505050565b600061459e826133de565b91506145a9836133de565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145e2576145e1614111565b5b828202905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b600061462360128361332e565b915061462e826145ed565b602082019050919050565b6000602082019050818103600083015261465281614616565b9050919050565b7f53616c65206861736e2774207374617274656400000000000000000000000000600082015250565b600061468f60138361332e565b915061469a82614659565b602082019050919050565b600060208201905081810360008301526146be81614682565b9050919050565b7f4e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b60006146fb601b8361332e565b9150614706826146c5565b602082019050919050565b6000602082019050818103600083015261472a816146ee565b9050919050565b7f4d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e2060008201527f6578636565646564000000000000000000000000000000000000000000000000602082015250565b600061478d60288361332e565b915061479882614731565b604082019050919050565b600060208201905081810360008301526147bc81614780565b9050919050565b7f5765277265206174206d617820737570706c7921000000000000000000000000600082015250565b60006147f960148361332e565b9150614804826147c3565b602082019050919050565b60006020820190508181036000830152614828816147ec565b9050919050565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000614865601c8361332e565b91506148708261482f565b602082019050919050565b6000602082019050818103600083015261489481614858565b9050919050565b60008160601b9050919050565b60006148b38261489b565b9050919050565b60006148c5826148a8565b9050919050565b6148dd6148d882613461565b6148ba565b82525050565b60006148ef82846148cc565b60148201915081905092915050565b7f55736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b600061493460178361332e565b915061493f826148fe565b602082019050919050565b6000602082019050818103600083015261496381614927565b9050919050565b6000614975826133de565b9150600082141561498957614988614111565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149ce826133de565b91506149d9836133de565b9250826149e9576149e8614994565b5b828204905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a5060268361332e565b9150614a5b826149f4565b604082019050919050565b60006020820190508181036000830152614a7f81614a43565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614ae2602c8361332e565b9150614aed82614a86565b604082019050919050565b60006020820190508181036000830152614b1181614ad5565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614b7460258361332e565b9150614b7f82614b18565b604082019050919050565b60006020820190508181036000830152614ba381614b67565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614c0660248361332e565b9150614c1182614baa565b604082019050919050565b60006020820190508181036000830152614c3581614bf9565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614c7260198361332e565b9150614c7d82614c3c565b602082019050919050565b60006020820190508181036000830152614ca181614c65565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614d0460328361332e565b9150614d0f82614ca8565b604082019050919050565b60006020820190508181036000830152614d3381614cf7565b9050919050565b6000614d45826133de565b9150614d50836133de565b925082614d6057614d5f614994565b5b828206905092915050565b6000819050919050565b614d86614d81826138fe565b614d6b565b82525050565b6000614d988285614d75565b602082019150614da88284614d75565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000614ddf82614db8565b614de98185614dc3565b9350614df981856020860161333f565b614e0281613372565b840191505092915050565b6000608082019050614e226000830187613473565b614e2f6020830186613473565b614e3c6040830185613509565b8181036060830152614e4e8184614dd4565b905095945050505050565b600081519050614e6881613294565b92915050565b600060208284031215614e8457614e8361325e565b5b6000614e9284828501614e59565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614ed160208361332e565b9150614edc82614e9b565b602082019050919050565b60006020820190508181036000830152614f0081614ec4565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614f3d601c8361332e565b9150614f4882614f07565b602082019050919050565b60006020820190508181036000830152614f6c81614f30565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122019a9accb46167342c97273e3cd3e99523912182ab0360dceefa7fcefc396ed8d64736f6c634300080c0033

Deployed Bytecode Sourcemap

45657:5361:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46875:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26134:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27693:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27216:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46675:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46362:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28443:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50816:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39622:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48526:280;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;49958:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28853:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47246:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40144:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50057:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25828:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49854:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46441:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25558:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4730:103;;;;;;;;;;;;;:::i;:::-;;4079:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26303:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46400:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27986:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50926:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49318:531;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29109:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50157:366;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45936:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26478:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50528:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47569:946;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28212:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4988:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45724:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45766:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46875:176;46978:4;47007:36;47031:11;47007:23;:36::i;:::-;47000:43;;46875:176;;;:::o;26134:100::-;26188:13;26221:5;26214:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26134:100;:::o;27693:221::-;27769:7;27797:16;27805:7;27797;:16::i;:::-;27789:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27882:15;:24;27898:7;27882:24;;;;;;;;;;;;;;;;;;;;;27875:31;;27693:221;;;:::o;27216:411::-;27297:13;27313:23;27328:7;27313:14;:23::i;:::-;27297:39;;27361:5;27355:11;;:2;:11;;;;27347:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27455:5;27439:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27464:37;27481:5;27488:12;:10;:12::i;:::-;27464:16;:37::i;:::-;27439:62;27417:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27598:21;27607:2;27611:7;27598:8;:21::i;:::-;27286:341;27216:411;;:::o;46675:88::-;46727:4;46745:13;;46738:20;;46675:88;:::o;46362:34::-;;;;;;;;;;;;;:::o;28443:339::-;28638:41;28657:12;:10;:12::i;:::-;28671:7;28638:18;:41::i;:::-;28630:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28746:28;28756:4;28762:2;28766:7;28746:9;:28::i;:::-;28443:339;;;:::o;50816:101::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50887:10:::1;50879:24;;:32;50904:6;50879:32;;;;;;;;;;;;;;;;;;;;;;;50871:41;;;::::0;::::1;;50816:101:::0;:::o;39622:256::-;39719:7;39755:23;39772:5;39755:16;:23::i;:::-;39747:5;:31;39739:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;39844:12;:19;39857:5;39844:19;;;;;;;;;;;;;;;:26;39864:5;39844:26;;;;;;;;;;;;39837:33;;39622:256;;;;:::o;48526:280::-;48576:13;48591:4;48597;48603;48609;48614;48619;48625;48630;48653:15;48669:17;;48687:15;;48703:14;;48718:13;;48732:18;;48752:13;;48767:14;;;;;;;;;;;48783:15;;;;;;;;;;;48645:154;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48526:280;;;;;;;;;:::o;49958:94::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50041:6:::1;50023:15;;:24;;;;;;;;;;;;;;;;;;49958:94:::0;:::o;28853:185::-;28991:39;29008:4;29014:2;29018:7;28991:39;;;;;;;;;;;;:16;:39::i;:::-;28853:185;;;:::o;47246:318::-;47306:16;47331:23;47357:17;47367:6;47357:9;:17::i;:::-;47331:43;;47379:25;47421:15;47407:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47379:58;;47447:9;47442:98;47462:15;47458:1;:19;47442:98;;;47504:30;47524:6;47532:1;47504:19;:30::i;:::-;47490:8;47499:1;47490:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;47479:3;;;;;:::i;:::-;;;;47442:98;;;;47551:8;47544:15;;;;47246:318;;;:::o;40144:233::-;40219:7;40255:30;:28;:30::i;:::-;40247:5;:38;40239:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40352:10;40363:5;40352:17;;;;;;;;:::i;:::-;;;;;;;;;;40345:24;;40144:233;;;:::o;50057:95::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50136:11:::1;50126:7;:21;;;;;;;;;;;;:::i;:::-;;50057:95:::0;:::o;25828:239::-;25900:7;25920:13;25936:7;:16;25944:7;25936:16;;;;;;;;;;;;;;;;;;;;;25920:32;;25988:1;25971:19;;:5;:19;;;;25963:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26054:5;26047:12;;;25828:239;;;:::o;49854:97::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49942:4:::1;49923:16;:23;;;;49854:97:::0;:::o;46441:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25558:208::-;25630:7;25675:1;25658:19;;:5;:19;;;;25650:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25742:9;:16;25752:5;25742:16;;;;;;;;;;;;;;;;25735:23;;25558:208;;;:::o;4730:103::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;4079:87::-;4125:7;4152:6;;;;;;;;;;;4145:13;;4079:87;:::o;26303:104::-;26359:13;26392:7;26385:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26303:104;:::o;46400:34::-;;;;;;;;;;;;;:::o;27986:155::-;28081:52;28100:12;:10;:12::i;:::-;28114:8;28124;28081:18;:52::i;:::-;27986:155;;:::o;50926:89::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51004:6:::1;50987:14;;:23;;;;;;;;;;;;;;;;;;50926:89:::0;:::o;49318:531::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49543:13:::1;;45758:4;49530:26;;;;:::i;:::-;49518:7;:39;;49510:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;49602:7;49582:17;:27;;;;49631:4;49614:14;:21;;;;49658:4;49640:15;:22;;;;;;;;;;;;:::i;:::-;;49683:19;49667:13;:35;;;;49728:15;49707:18;:36;;;;49766:7;49748:15;:25;;;;49795:9;49778:14;;:26;;;;;;;;;;;;;;;;;;49827:17;49809:15;;:35;;;;;;;;;;;;;;;;;;49318:531:::0;;;;;;;;:::o;29109:328::-;29284:41;29303:12;:10;:12::i;:::-;29317:7;29284:18;:41::i;:::-;29276:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29390:39;29404:4;29410:2;29414:7;29423:5;29390:13;:39::i;:::-;29109:328;;;;:::o;50157:366::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45804:1:::1;50259:9;50245:11;;:23;;;;:::i;:::-;50244:43;;50236:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;50316:10;50343:1;50335:9;;50331:188;50355:9;50346:5;:18;50331:188;;50381:13;;:15;;;;;;;;;:::i;:::-;;;;;;50430:1;50416:11;;:15;;;;:::i;:::-;50402:11;:29;;;;50437:13;45758:4;50453:11;;:24;;;;:::i;:::-;50437:40;;50483:30;50493:9;50504:8;50483:9;:30::i;:::-;50375:144;50366:7;;;;;:::i;:::-;;;;50331:188;;;50231:292;50157:366:::0;;:::o;45936:39::-;;;;:::o;26478:334::-;26551:13;26585:16;26593:7;26585;:16::i;:::-;26577:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;26666:21;26690:10;:8;:10::i;:::-;26666:34;;26742:1;26724:7;26718:21;:25;:86;;;;;;;;;;;;;;;;;26770:7;26779:18;:7;:16;:18::i;:::-;26753:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26718:86;26711:93;;;26478:334;;;:::o;50528:283::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45758:4:::1;50631:9;50615:13;;:25;;;;:::i;:::-;50614:41;;50606:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;50680:10;50707:1;50699:9;;50695:112;50719:9;50710:5;:18;50695:112;;50745:13;;:15;;;;;;;;;:::i;:::-;;;;;;50766:35;50776:9;50787:13;;50766:9;:35::i;:::-;50730:7;;;;;:::i;:::-;;;;50695:112;;;50601:210;50528:283:::0;;:::o;47569:946::-;47688:11;47671:14;;:28;;;;:::i;:::-;47658:9;:41;;47650:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;47753:4;47735:22;;:14;;;;;;;;;;;:22;;;47727:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;47808:1;47794:11;:15;47786:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;47869:13;;47854:11;:28;;47846:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;47973:17;;47955:13;;47941:11;:27;;;;:::i;:::-;47940:50;;47932:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;48070:18;;48044:21;48054:10;48044:9;:21::i;:::-;48029:11;:36;;;;:::i;:::-;48028:60;;48020:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;48156:4;48137:23;;:15;;;;;;;;;;;:23;;;48134:160;;;48168:12;48210:10;48193:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;48183:39;;;;;;48168:54;;48236:18;48243:4;48248:5;48236:6;:18::i;:::-;48228:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;48162:132;48134:160;48305:9;48317:1;48305:13;;48300:137;48325:11;48320:1;:16;48300:137;;48349:13;;:15;;;;;;;;;:::i;:::-;;;;;;48370:17;;:19;;;;;;;;;:::i;:::-;;;;;;48395:36;48405:10;48417:13;;48395:9;:36::i;:::-;48338:3;;;;;:::i;:::-;;;;48300:137;;;;45850:42;48457:24;;:52;48504:2;48497:3;48485:9;:15;;;;:::i;:::-;48484:22;;;;:::i;:::-;48457:52;;;;;;;;;;;;;;;;;;;;;;;48449:61;;;;;;47569:946;;:::o;28212:164::-;28309:4;28333:18;:25;28352:5;28333:25;;;;;;;;;;;;;;;:35;28359:8;28333:35;;;;;;;;;;;;;;;;;;;;;;;;;28326:42;;28212:164;;;;:::o;4988:201::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5097:1:::1;5077:22;;:8;:22;;;;5069:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;45724:38::-;45758:4;45724:38;:::o;45766:39::-;45804:1;45766:39;:::o;39314:224::-;39416:4;39455:35;39440:50;;;:11;:50;;;;:90;;;;39494:36;39518:11;39494:23;:36::i;:::-;39440:90;39433:97;;39314:224;;;:::o;30947:127::-;31012:4;31064:1;31036:30;;:7;:16;31044:7;31036:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31029:37;;30947:127;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;35093:174::-;35195:2;35168:15;:24;35184:7;35168:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35251:7;35247:2;35213:46;;35222:23;35237:7;35222:14;:23::i;:::-;35213:46;;;;;;;;;;;;35093:174;;:::o;31241:348::-;31334:4;31359:16;31367:7;31359;:16::i;:::-;31351:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31435:13;31451:23;31466:7;31451:14;:23::i;:::-;31435:39;;31504:5;31493:16;;:7;:16;;;:51;;;;31537:7;31513:31;;:20;31525:7;31513:11;:20::i;:::-;:31;;;31493:51;:87;;;;31548:32;31565:5;31572:7;31548:16;:32::i;:::-;31493:87;31485:96;;;31241:348;;;;:::o;34350:625::-;34509:4;34482:31;;:23;34497:7;34482:14;:23::i;:::-;:31;;;34474:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34588:1;34574:16;;:2;:16;;;;34566:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34644:39;34665:4;34671:2;34675:7;34644:20;:39::i;:::-;34748:29;34765:1;34769:7;34748:8;:29::i;:::-;34809:1;34790:9;:15;34800:4;34790:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34838:1;34821:9;:13;34831:2;34821:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34869:2;34850:7;:16;34858:7;34850:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34908:7;34904:2;34889:27;;34898:4;34889:27;;;;;;;;;;;;34929:38;34949:4;34955:2;34959:7;34929:19;:38::i;:::-;34350:625;;;:::o;39954:113::-;40015:7;40042:10;:17;;;;40035:24;;39954:113;:::o;5349:191::-;5423:16;5442:6;;;;;;;;;;;5423:25;;5468:8;5459:6;;:17;;;;;;;;;;;;;;;;;;5523:8;5492:40;;5513:8;5492:40;;;;;;;;;;;;5412:128;5349:191;:::o;35409:315::-;35564:8;35555:17;;:5;:17;;;;35547:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35651:8;35613:18;:25;35632:5;35613:25;;;;;;;;;;;;;;;:35;35639:8;35613:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35697:8;35675:41;;35690:5;35675:41;;;35707:8;35675:41;;;;;;:::i;:::-;;;;;;;;35409:315;;;:::o;30319:::-;30476:28;30486:4;30492:2;30496:7;30476:9;:28::i;:::-;30523:48;30546:4;30552:2;30556:7;30565:5;30523:22;:48::i;:::-;30515:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30319:315;;;;:::o;31931:110::-;32007:26;32017:2;32021:7;32007:26;;;;;;;;;;;;:9;:26::i;:::-;31931:110;;:::o;46768:99::-;46828:13;46855:7;46848:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46768:99;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;48812:473::-;48889:4;48902:20;48925:4;48902:27;;48941:9;48936:301;48960:5;:12;48956:1;:16;48936:301;;;48985:20;49008:5;49014:1;49008:8;;;;;;;;:::i;:::-;;;;;;;;48985:31;;49044:12;49028;:28;49024:208;;49107:12;49121;49090:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49080:55;;;;;;49065:70;;49024:208;;;49197:12;49211;49180:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49170:55;;;;;;49155:70;;49024:208;48979:258;48974:3;;;;;:::i;:::-;;;;48936:301;;;;49264:16;;49248:12;:32;49241:39;;;48812:473;;;;:::o;25189:305::-;25291:4;25343:25;25328:40;;;:11;:40;;;;:105;;;;25400:33;25385:48;;;:11;:48;;;;25328:105;:158;;;;25450:36;25474:11;25450:23;:36::i;:::-;25328:158;25308:178;;25189:305;;;:::o;47059:181::-;47187:45;47214:4;47220:2;47224:7;47187:26;:45::i;:::-;47059:181;;;:::o;38171:125::-;;;;:::o;36289:799::-;36444:4;36465:15;:2;:13;;;:15::i;:::-;36461:620;;;36517:2;36501:36;;;36538:12;:10;:12::i;:::-;36552:4;36558:7;36567:5;36501:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36497:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36760:1;36743:6;:13;:18;36739:272;;;36786:60;;;;;;;;;;:::i;:::-;;;;;;;;36739:272;36961:6;36955:13;36946:6;36942:2;36938:15;36931:38;36497:529;36634:41;;;36624:51;;;:6;:51;;;;36617:58;;;;;36461:620;37065:4;37058:11;;36289:799;;;;;;;:::o;32268:321::-;32398:18;32404:2;32408:7;32398:5;:18::i;:::-;32449:54;32480:1;32484:2;32488:7;32497:5;32449:22;:54::i;:::-;32427:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32268:321;;;:::o;16863:157::-;16948:4;16987:25;16972:40;;;:11;:40;;;;16965:47;;16863:157;;;:::o;40990:589::-;41134:45;41161:4;41167:2;41171:7;41134:26;:45::i;:::-;41212:1;41196:18;;:4;:18;;;41192:187;;;41231:40;41263:7;41231:31;:40::i;:::-;41192:187;;;41301:2;41293:10;;:4;:10;;;41289:90;;41320:47;41353:4;41359:7;41320:32;:47::i;:::-;41289:90;41192:187;41407:1;41393:16;;:2;:16;;;41389:183;;;41426:45;41463:7;41426:36;:45::i;:::-;41389:183;;;41499:4;41493:10;;:2;:10;;;41489:83;;41520:40;41548:2;41552:7;41520:27;:40::i;:::-;41489:83;41389:183;40990:589;;;:::o;6780:326::-;6840:4;7097:1;7075:7;:19;;;:23;7068:30;;6780:326;;;:::o;32925:439::-;33019:1;33005:16;;:2;:16;;;;32997:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33078:16;33086:7;33078;:16::i;:::-;33077:17;33069:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33140:45;33169:1;33173:2;33177:7;33140:20;:45::i;:::-;33215:1;33198:9;:13;33208:2;33198:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33246:2;33227:7;:16;33235:7;33227:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33291:7;33287:2;33266:33;;33283:1;33266:33;;;;;;;;;;;;33312:44;33340:1;33344:2;33348:7;33312:19;:44::i;:::-;32925:439;;:::o;37660:126::-;;;;:::o;42302:164::-;42406:10;:17;;;;42379:15;:24;42395:7;42379:24;;;;;;;;;;;:44;;;;42434:10;42450:7;42434:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42302:164;:::o;43093:988::-;43359:22;43409:1;43384:22;43401:4;43384:16;:22::i;:::-;:26;;;;:::i;:::-;43359:51;;43421:18;43442:17;:26;43460:7;43442:26;;;;;;;;;;;;43421:47;;43589:14;43575:10;:28;43571:328;;43620:19;43642:12;:18;43655:4;43642:18;;;;;;;;;;;;;;;:34;43661:14;43642:34;;;;;;;;;;;;43620:56;;43726:11;43693:12;:18;43706:4;43693:18;;;;;;;;;;;;;;;:30;43712:10;43693:30;;;;;;;;;;;:44;;;;43843:10;43810:17;:30;43828:11;43810:30;;;;;;;;;;;:43;;;;43605:294;43571:328;43995:17;:26;44013:7;43995:26;;;;;;;;;;;43988:33;;;44039:12;:18;44052:4;44039:18;;;;;;;;;;;;;;;:34;44058:14;44039:34;;;;;;;;;;;44032:41;;;43174:907;;43093:988;;:::o;44376:1079::-;44629:22;44674:1;44654:10;:17;;;;:21;;;;:::i;:::-;44629:46;;44686:18;44707:15;:24;44723:7;44707:24;;;;;;;;;;;;44686:45;;45058:19;45080:10;45091:14;45080:26;;;;;;;;:::i;:::-;;;;;;;;;;45058:48;;45144:11;45119:10;45130;45119:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45255:10;45224:15;:28;45240:11;45224:28;;;;;;;;;;;:41;;;;45396:15;:24;45412:7;45396:24;;;;;;;;;;;45389:31;;;45431:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44447:1008;;;44376:1079;:::o;41880:221::-;41965:14;41982:20;41999:2;41982:16;:20::i;:::-;41965:37;;42040:7;42013:12;:16;42026:2;42013:16;;;;;;;;;;;;;;;:24;42030:6;42013:24;;;;;;;;;;;:34;;;;42087:6;42058:17;:26;42076:7;42058:26;;;;;;;;;;;:35;;;;41954:147;41880:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:1175::-;6240:4;6278:3;6267:9;6263:19;6255:27;;6328:9;6322:4;6318:20;6314:1;6303:9;6299:17;6292:47;6356:78;6429:4;6420:6;6356:78;:::i;:::-;6348:86;;6444:72;6512:2;6501:9;6497:18;6488:6;6444:72;:::i;:::-;6526;6594:2;6583:9;6579:18;6570:6;6526:72;:::i;:::-;6608;6676:2;6665:9;6661:18;6652:6;6608:72;:::i;:::-;6690:73;6758:3;6747:9;6743:19;6734:6;6690:73;:::i;:::-;6773;6841:3;6830:9;6826:19;6817:6;6773:73;:::i;:::-;6856;6924:3;6913:9;6909:19;6900:6;6856:73;:::i;:::-;6939:67;7001:3;6990:9;6986:19;6977:6;6939:67;:::i;:::-;7016;7078:3;7067:9;7063:19;7054:6;7016:67;:::i;:::-;5915:1175;;;;;;;;;;;;:::o;7096:116::-;7166:21;7181:5;7166:21;:::i;:::-;7159:5;7156:32;7146:60;;7202:1;7199;7192:12;7146:60;7096:116;:::o;7218:133::-;7261:5;7299:6;7286:20;7277:29;;7315:30;7339:5;7315:30;:::i;:::-;7218:133;;;;:::o;7357:323::-;7413:6;7462:2;7450:9;7441:7;7437:23;7433:32;7430:119;;;7468:79;;:::i;:::-;7430:119;7588:1;7613:50;7655:7;7646:6;7635:9;7631:22;7613:50;:::i;:::-;7603:60;;7559:114;7357:323;;;;:::o;7686:329::-;7745:6;7794:2;7782:9;7773:7;7769:23;7765:32;7762:119;;;7800:79;;:::i;:::-;7762:119;7920:1;7945:53;7990:7;7981:6;7970:9;7966:22;7945:53;:::i;:::-;7935:63;;7891:117;7686:329;;;;:::o;8021:114::-;8088:6;8122:5;8116:12;8106:22;;8021:114;;;:::o;8141:184::-;8240:11;8274:6;8269:3;8262:19;8314:4;8309:3;8305:14;8290:29;;8141:184;;;;:::o;8331:132::-;8398:4;8421:3;8413:11;;8451:4;8446:3;8442:14;8434:22;;8331:132;;;:::o;8469:108::-;8546:24;8564:5;8546:24;:::i;:::-;8541:3;8534:37;8469:108;;:::o;8583:179::-;8652:10;8673:46;8715:3;8707:6;8673:46;:::i;:::-;8751:4;8746:3;8742:14;8728:28;;8583:179;;;;:::o;8768:113::-;8838:4;8870;8865:3;8861:14;8853:22;;8768:113;;;:::o;8917:732::-;9036:3;9065:54;9113:5;9065:54;:::i;:::-;9135:86;9214:6;9209:3;9135:86;:::i;:::-;9128:93;;9245:56;9295:5;9245:56;:::i;:::-;9324:7;9355:1;9340:284;9365:6;9362:1;9359:13;9340:284;;;9441:6;9435:13;9468:63;9527:3;9512:13;9468:63;:::i;:::-;9461:70;;9554:60;9607:6;9554:60;:::i;:::-;9544:70;;9400:224;9387:1;9384;9380:9;9375:14;;9340:284;;;9344:14;9640:3;9633:10;;9041:608;;;8917:732;;;;:::o;9655:373::-;9798:4;9836:2;9825:9;9821:18;9813:26;;9885:9;9879:4;9875:20;9871:1;9860:9;9856:17;9849:47;9913:108;10016:4;10007:6;9913:108;:::i;:::-;9905:116;;9655:373;;;;:::o;10034:117::-;10143:1;10140;10133:12;10157:117;10266:1;10263;10256:12;10280:180;10328:77;10325:1;10318:88;10425:4;10422:1;10415:15;10449:4;10446:1;10439:15;10466:281;10549:27;10571:4;10549:27;:::i;:::-;10541:6;10537:40;10679:6;10667:10;10664:22;10643:18;10631:10;10628:34;10625:62;10622:88;;;10690:18;;:::i;:::-;10622:88;10730:10;10726:2;10719:22;10509:238;10466:281;;:::o;10753:129::-;10787:6;10814:20;;:::i;:::-;10804:30;;10843:33;10871:4;10863:6;10843:33;:::i;:::-;10753:129;;;:::o;10888:308::-;10950:4;11040:18;11032:6;11029:30;11026:56;;;11062:18;;:::i;:::-;11026:56;11100:29;11122:6;11100:29;:::i;:::-;11092:37;;11184:4;11178;11174:15;11166:23;;10888:308;;;:::o;11202:154::-;11286:6;11281:3;11276;11263:30;11348:1;11339:6;11334:3;11330:16;11323:27;11202:154;;;:::o;11362:412::-;11440:5;11465:66;11481:49;11523:6;11481:49;:::i;:::-;11465:66;:::i;:::-;11456:75;;11554:6;11547:5;11540:21;11592:4;11585:5;11581:16;11630:3;11621:6;11616:3;11612:16;11609:25;11606:112;;;11637:79;;:::i;:::-;11606:112;11727:41;11761:6;11756:3;11751;11727:41;:::i;:::-;11446:328;11362:412;;;;;:::o;11794:340::-;11850:5;11899:3;11892:4;11884:6;11880:17;11876:27;11866:122;;11907:79;;:::i;:::-;11866:122;12024:6;12011:20;12049:79;12124:3;12116:6;12109:4;12101:6;12097:17;12049:79;:::i;:::-;12040:88;;11856:278;11794:340;;;;:::o;12140:509::-;12209:6;12258:2;12246:9;12237:7;12233:23;12229:32;12226:119;;;12264:79;;:::i;:::-;12226:119;12412:1;12401:9;12397:17;12384:31;12442:18;12434:6;12431:30;12428:117;;;12464:79;;:::i;:::-;12428:117;12569:63;12624:7;12615:6;12604:9;12600:22;12569:63;:::i;:::-;12559:73;;12355:287;12140:509;;;;:::o;12655:77::-;12692:7;12721:5;12710:16;;12655:77;;;:::o;12738:122::-;12811:24;12829:5;12811:24;:::i;:::-;12804:5;12801:35;12791:63;;12850:1;12847;12840:12;12791:63;12738:122;:::o;12866:139::-;12912:5;12950:6;12937:20;12928:29;;12966:33;12993:5;12966:33;:::i;:::-;12866:139;;;;:::o;13011:329::-;13070:6;13119:2;13107:9;13098:7;13094:23;13090:32;13087:119;;;13125:79;;:::i;:::-;13087:119;13245:1;13270:53;13315:7;13306:6;13295:9;13291:22;13270:53;:::i;:::-;13260:63;;13216:117;13011:329;;;;:::o;13346:468::-;13411:6;13419;13468:2;13456:9;13447:7;13443:23;13439:32;13436:119;;;13474:79;;:::i;:::-;13436:119;13594:1;13619:53;13664:7;13655:6;13644:9;13640:22;13619:53;:::i;:::-;13609:63;;13565:117;13721:2;13747:50;13789:7;13780:6;13769:9;13765:22;13747:50;:::i;:::-;13737:60;;13692:115;13346:468;;;;;:::o;13820:1517::-;13946:6;13954;13962;13970;13978;13986;13994;14002;14051:3;14039:9;14030:7;14026:23;14022:33;14019:120;;;14058:79;;:::i;:::-;14019:120;14178:1;14203:53;14248:7;14239:6;14228:9;14224:22;14203:53;:::i;:::-;14193:63;;14149:117;14305:2;14331:53;14376:7;14367:6;14356:9;14352:22;14331:53;:::i;:::-;14321:63;;14276:118;14461:2;14450:9;14446:18;14433:32;14492:18;14484:6;14481:30;14478:117;;;14514:79;;:::i;:::-;14478:117;14619:63;14674:7;14665:6;14654:9;14650:22;14619:63;:::i;:::-;14609:73;;14404:288;14731:2;14757:53;14802:7;14793:6;14782:9;14778:22;14757:53;:::i;:::-;14747:63;;14702:118;14859:3;14886:53;14931:7;14922:6;14911:9;14907:22;14886:53;:::i;:::-;14876:63;;14830:119;14988:3;15015:53;15060:7;15051:6;15040:9;15036:22;15015:53;:::i;:::-;15005:63;;14959:119;15117:3;15144:50;15186:7;15177:6;15166:9;15162:22;15144:50;:::i;:::-;15134:60;;15088:116;15243:3;15270:50;15312:7;15303:6;15292:9;15288:22;15270:50;:::i;:::-;15260:60;;15214:116;13820:1517;;;;;;;;;;;:::o;15343:307::-;15404:4;15494:18;15486:6;15483:30;15480:56;;;15516:18;;:::i;:::-;15480:56;15554:29;15576:6;15554:29;:::i;:::-;15546:37;;15638:4;15632;15628:15;15620:23;;15343:307;;;:::o;15656:410::-;15733:5;15758:65;15774:48;15815:6;15774:48;:::i;:::-;15758:65;:::i;:::-;15749:74;;15846:6;15839:5;15832:21;15884:4;15877:5;15873:16;15922:3;15913:6;15908:3;15904:16;15901:25;15898:112;;;15929:79;;:::i;:::-;15898:112;16019:41;16053:6;16048:3;16043;16019:41;:::i;:::-;15739:327;15656:410;;;;;:::o;16085:338::-;16140:5;16189:3;16182:4;16174:6;16170:17;16166:27;16156:122;;16197:79;;:::i;:::-;16156:122;16314:6;16301:20;16339:78;16413:3;16405:6;16398:4;16390:6;16386:17;16339:78;:::i;:::-;16330:87;;16146:277;16085:338;;;;:::o;16429:943::-;16524:6;16532;16540;16548;16597:3;16585:9;16576:7;16572:23;16568:33;16565:120;;;16604:79;;:::i;:::-;16565:120;16724:1;16749:53;16794:7;16785:6;16774:9;16770:22;16749:53;:::i;:::-;16739:63;;16695:117;16851:2;16877:53;16922:7;16913:6;16902:9;16898:22;16877:53;:::i;:::-;16867:63;;16822:118;16979:2;17005:53;17050:7;17041:6;17030:9;17026:22;17005:53;:::i;:::-;16995:63;;16950:118;17135:2;17124:9;17120:18;17107:32;17166:18;17158:6;17155:30;17152:117;;;17188:79;;:::i;:::-;17152:117;17293:62;17347:7;17338:6;17327:9;17323:22;17293:62;:::i;:::-;17283:72;;17078:287;16429:943;;;;;;;:::o;17378:474::-;17446:6;17454;17503:2;17491:9;17482:7;17478:23;17474:32;17471:119;;;17509:79;;:::i;:::-;17471:119;17629:1;17654:53;17699:7;17690:6;17679:9;17675:22;17654:53;:::i;:::-;17644:63;;17600:117;17756:2;17782:53;17827:7;17818:6;17807:9;17803:22;17782:53;:::i;:::-;17772:63;;17727:118;17378:474;;;;;:::o;17858:311::-;17935:4;18025:18;18017:6;18014:30;18011:56;;;18047:18;;:::i;:::-;18011:56;18097:4;18089:6;18085:17;18077:25;;18157:4;18151;18147:15;18139:23;;17858:311;;;:::o;18175:117::-;18284:1;18281;18274:12;18315:710;18411:5;18436:81;18452:64;18509:6;18452:64;:::i;:::-;18436:81;:::i;:::-;18427:90;;18537:5;18566:6;18559:5;18552:21;18600:4;18593:5;18589:16;18582:23;;18653:4;18645:6;18641:17;18633:6;18629:30;18682:3;18674:6;18671:15;18668:122;;;18701:79;;:::i;:::-;18668:122;18816:6;18799:220;18833:6;18828:3;18825:15;18799:220;;;18908:3;18937:37;18970:3;18958:10;18937:37;:::i;:::-;18932:3;18925:50;19004:4;18999:3;18995:14;18988:21;;18875:144;18859:4;18854:3;18850:14;18843:21;;18799:220;;;18803:21;18417:608;;18315:710;;;;;:::o;19048:370::-;19119:5;19168:3;19161:4;19153:6;19149:17;19145:27;19135:122;;19176:79;;:::i;:::-;19135:122;19293:6;19280:20;19318:94;19408:3;19400:6;19393:4;19385:6;19381:17;19318:94;:::i;:::-;19309:103;;19125:293;19048:370;;;;:::o;19424:684::-;19517:6;19525;19574:2;19562:9;19553:7;19549:23;19545:32;19542:119;;;19580:79;;:::i;:::-;19542:119;19700:1;19725:53;19770:7;19761:6;19750:9;19746:22;19725:53;:::i;:::-;19715:63;;19671:117;19855:2;19844:9;19840:18;19827:32;19886:18;19878:6;19875:30;19872:117;;;19908:79;;:::i;:::-;19872:117;20013:78;20083:7;20074:6;20063:9;20059:22;20013:78;:::i;:::-;20003:88;;19798:303;19424:684;;;;;:::o;20114:474::-;20182:6;20190;20239:2;20227:9;20218:7;20214:23;20210:32;20207:119;;;20245:79;;:::i;:::-;20207:119;20365:1;20390:53;20435:7;20426:6;20415:9;20411:22;20390:53;:::i;:::-;20380:63;;20336:117;20492:2;20518:53;20563:7;20554:6;20543:9;20539:22;20518:53;:::i;:::-;20508:63;;20463:118;20114:474;;;;;:::o;20594:180::-;20642:77;20639:1;20632:88;20739:4;20736:1;20729:15;20763:4;20760:1;20753:15;20780:320;20824:6;20861:1;20855:4;20851:12;20841:22;;20908:1;20902:4;20898:12;20929:18;20919:81;;20985:4;20977:6;20973:17;20963:27;;20919:81;21047:2;21039:6;21036:14;21016:18;21013:38;21010:84;;;21066:18;;:::i;:::-;21010:84;20831:269;20780:320;;;:::o;21106:231::-;21246:34;21242:1;21234:6;21230:14;21223:58;21315:14;21310:2;21302:6;21298:15;21291:39;21106:231;:::o;21343:366::-;21485:3;21506:67;21570:2;21565:3;21506:67;:::i;:::-;21499:74;;21582:93;21671:3;21582:93;:::i;:::-;21700:2;21695:3;21691:12;21684:19;;21343:366;;;:::o;21715:419::-;21881:4;21919:2;21908:9;21904:18;21896:26;;21968:9;21962:4;21958:20;21954:1;21943:9;21939:17;21932:47;21996:131;22122:4;21996:131;:::i;:::-;21988:139;;21715:419;;;:::o;22140:220::-;22280:34;22276:1;22268:6;22264:14;22257:58;22349:3;22344:2;22336:6;22332:15;22325:28;22140:220;:::o;22366:366::-;22508:3;22529:67;22593:2;22588:3;22529:67;:::i;:::-;22522:74;;22605:93;22694:3;22605:93;:::i;:::-;22723:2;22718:3;22714:12;22707:19;;22366:366;;;:::o;22738:419::-;22904:4;22942:2;22931:9;22927:18;22919:26;;22991:9;22985:4;22981:20;22977:1;22966:9;22962:17;22955:47;23019:131;23145:4;23019:131;:::i;:::-;23011:139;;22738:419;;;:::o;23163:243::-;23303:34;23299:1;23291:6;23287:14;23280:58;23372:26;23367:2;23359:6;23355:15;23348:51;23163:243;:::o;23412:366::-;23554:3;23575:67;23639:2;23634:3;23575:67;:::i;:::-;23568:74;;23651:93;23740:3;23651:93;:::i;:::-;23769:2;23764:3;23760:12;23753:19;;23412:366;;;:::o;23784:419::-;23950:4;23988:2;23977:9;23973:18;23965:26;;24037:9;24031:4;24027:20;24023:1;24012:9;24008:17;24001:47;24065:131;24191:4;24065:131;:::i;:::-;24057:139;;23784:419;;;:::o;24209:236::-;24349:34;24345:1;24337:6;24333:14;24326:58;24418:19;24413:2;24405:6;24401:15;24394:44;24209:236;:::o;24451:366::-;24593:3;24614:67;24678:2;24673:3;24614:67;:::i;:::-;24607:74;;24690:93;24779:3;24690:93;:::i;:::-;24808:2;24803:3;24799:12;24792:19;;24451:366;;;:::o;24823:419::-;24989:4;25027:2;25016:9;25012:18;25004:26;;25076:9;25070:4;25066:20;25062:1;25051:9;25047:17;25040:47;25104:131;25230:4;25104:131;:::i;:::-;25096:139;;24823:419;;;:::o;25248:182::-;25388:34;25384:1;25376:6;25372:14;25365:58;25248:182;:::o;25436:366::-;25578:3;25599:67;25663:2;25658:3;25599:67;:::i;:::-;25592:74;;25675:93;25764:3;25675:93;:::i;:::-;25793:2;25788:3;25784:12;25777:19;;25436:366;;;:::o;25808:419::-;25974:4;26012:2;26001:9;25997:18;25989:26;;26061:9;26055:4;26051:20;26047:1;26036:9;26032:17;26025:47;26089:131;26215:4;26089:131;:::i;:::-;26081:139;;25808:419;;;:::o;26233:230::-;26373:34;26369:1;26361:6;26357:14;26350:58;26442:13;26437:2;26429:6;26425:15;26418:38;26233:230;:::o;26469:366::-;26611:3;26632:67;26696:2;26691:3;26632:67;:::i;:::-;26625:74;;26708:93;26797:3;26708:93;:::i;:::-;26826:2;26821:3;26817:12;26810:19;;26469:366;;;:::o;26841:419::-;27007:4;27045:2;27034:9;27030:18;27022:26;;27094:9;27088:4;27084:20;27080:1;27069:9;27065:17;27058:47;27122:131;27248:4;27122:131;:::i;:::-;27114:139;;26841:419;;;:::o;27266:180::-;27314:77;27311:1;27304:88;27411:4;27408:1;27401:15;27435:4;27432:1;27425:15;27452:180;27500:77;27497:1;27490:88;27597:4;27594:1;27587:15;27621:4;27618:1;27611:15;27638:233;27677:3;27700:24;27718:5;27700:24;:::i;:::-;27691:33;;27746:66;27739:5;27736:77;27733:103;;;27816:18;;:::i;:::-;27733:103;27863:1;27856:5;27852:13;27845:20;;27638:233;;;:::o;27877:231::-;28017:34;28013:1;28005:6;28001:14;27994:58;28086:14;28081:2;28073:6;28069:15;28062:39;27877:231;:::o;28114:366::-;28256:3;28277:67;28341:2;28336:3;28277:67;:::i;:::-;28270:74;;28353:93;28442:3;28353:93;:::i;:::-;28471:2;28466:3;28462:12;28455:19;;28114:366;;;:::o;28486:419::-;28652:4;28690:2;28679:9;28675:18;28667:26;;28739:9;28733:4;28729:20;28725:1;28714:9;28710:17;28703:47;28767:131;28893:4;28767:131;:::i;:::-;28759:139;;28486:419;;;:::o;28911:228::-;29051:34;29047:1;29039:6;29035:14;29028:58;29120:11;29115:2;29107:6;29103:15;29096:36;28911:228;:::o;29145:366::-;29287:3;29308:67;29372:2;29367:3;29308:67;:::i;:::-;29301:74;;29384:93;29473:3;29384:93;:::i;:::-;29502:2;29497:3;29493:12;29486:19;;29145:366;;;:::o;29517:419::-;29683:4;29721:2;29710:9;29706:18;29698:26;;29770:9;29764:4;29760:20;29756:1;29745:9;29741:17;29734:47;29798:131;29924:4;29798:131;:::i;:::-;29790:139;;29517:419;;;:::o;29942:229::-;30082:34;30078:1;30070:6;30066:14;30059:58;30151:12;30146:2;30138:6;30134:15;30127:37;29942:229;:::o;30177:366::-;30319:3;30340:67;30404:2;30399:3;30340:67;:::i;:::-;30333:74;;30416:93;30505:3;30416:93;:::i;:::-;30534:2;30529:3;30525:12;30518:19;;30177:366;;;:::o;30549:419::-;30715:4;30753:2;30742:9;30738:18;30730:26;;30802:9;30796:4;30792:20;30788:1;30777:9;30773:17;30766:47;30830:131;30956:4;30830:131;:::i;:::-;30822:139;;30549:419;;;:::o;30974:191::-;31014:4;31034:20;31052:1;31034:20;:::i;:::-;31029:25;;31068:20;31086:1;31068:20;:::i;:::-;31063:25;;31107:1;31104;31101:8;31098:34;;;31112:18;;:::i;:::-;31098:34;31157:1;31154;31150:9;31142:17;;30974:191;;;;:::o;31171:165::-;31311:17;31307:1;31299:6;31295:14;31288:41;31171:165;:::o;31342:366::-;31484:3;31505:67;31569:2;31564:3;31505:67;:::i;:::-;31498:74;;31581:93;31670:3;31581:93;:::i;:::-;31699:2;31694:3;31690:12;31683:19;;31342:366;;;:::o;31714:419::-;31880:4;31918:2;31907:9;31903:18;31895:26;;31967:9;31961:4;31957:20;31953:1;31942:9;31938:17;31931:47;31995:131;32121:4;31995:131;:::i;:::-;31987:139;;31714:419;;;:::o;32139:305::-;32179:3;32198:20;32216:1;32198:20;:::i;:::-;32193:25;;32232:20;32250:1;32232:20;:::i;:::-;32227:25;;32386:1;32318:66;32314:74;32311:1;32308:81;32305:107;;;32392:18;;:::i;:::-;32305:107;32436:1;32433;32429:9;32422:16;;32139:305;;;;:::o;32450:169::-;32590:21;32586:1;32578:6;32574:14;32567:45;32450:169;:::o;32625:366::-;32767:3;32788:67;32852:2;32847:3;32788:67;:::i;:::-;32781:74;;32864:93;32953:3;32864:93;:::i;:::-;32982:2;32977:3;32973:12;32966:19;;32625:366;;;:::o;32997:419::-;33163:4;33201:2;33190:9;33186:18;33178:26;;33250:9;33244:4;33240:20;33236:1;33225:9;33221:17;33214:47;33278:131;33404:4;33278:131;:::i;:::-;33270:139;;32997:419;;;:::o;33422:234::-;33562:34;33558:1;33550:6;33546:14;33539:58;33631:17;33626:2;33618:6;33614:15;33607:42;33422:234;:::o;33662:366::-;33804:3;33825:67;33889:2;33884:3;33825:67;:::i;:::-;33818:74;;33901:93;33990:3;33901:93;:::i;:::-;34019:2;34014:3;34010:12;34003:19;;33662:366;;;:::o;34034:419::-;34200:4;34238:2;34227:9;34223:18;34215:26;;34287:9;34281:4;34277:20;34273:1;34262:9;34258:17;34251:47;34315:131;34441:4;34315:131;:::i;:::-;34307:139;;34034:419;;;:::o;34459:148::-;34561:11;34598:3;34583:18;;34459:148;;;;:::o;34613:377::-;34719:3;34747:39;34780:5;34747:39;:::i;:::-;34802:89;34884:6;34879:3;34802:89;:::i;:::-;34795:96;;34900:52;34945:6;34940:3;34933:4;34926:5;34922:16;34900:52;:::i;:::-;34977:6;34972:3;34968:16;34961:23;;34723:267;34613:377;;;;:::o;34996:435::-;35176:3;35198:95;35289:3;35280:6;35198:95;:::i;:::-;35191:102;;35310:95;35401:3;35392:6;35310:95;:::i;:::-;35303:102;;35422:3;35415:10;;34996:435;;;;;:::o;35437:348::-;35477:7;35500:20;35518:1;35500:20;:::i;:::-;35495:25;;35534:20;35552:1;35534:20;:::i;:::-;35529:25;;35722:1;35654:66;35650:74;35647:1;35644:81;35639:1;35632:9;35625:17;35621:105;35618:131;;;35729:18;;:::i;:::-;35618:131;35777:1;35774;35770:9;35759:20;;35437:348;;;;:::o;35791:168::-;35931:20;35927:1;35919:6;35915:14;35908:44;35791:168;:::o;35965:366::-;36107:3;36128:67;36192:2;36187:3;36128:67;:::i;:::-;36121:74;;36204:93;36293:3;36204:93;:::i;:::-;36322:2;36317:3;36313:12;36306:19;;35965:366;;;:::o;36337:419::-;36503:4;36541:2;36530:9;36526:18;36518:26;;36590:9;36584:4;36580:20;36576:1;36565:9;36561:17;36554:47;36618:131;36744:4;36618:131;:::i;:::-;36610:139;;36337:419;;;:::o;36762:169::-;36902:21;36898:1;36890:6;36886:14;36879:45;36762:169;:::o;36937:366::-;37079:3;37100:67;37164:2;37159:3;37100:67;:::i;:::-;37093:74;;37176:93;37265:3;37176:93;:::i;:::-;37294:2;37289:3;37285:12;37278:19;;36937:366;;;:::o;37309:419::-;37475:4;37513:2;37502:9;37498:18;37490:26;;37562:9;37556:4;37552:20;37548:1;37537:9;37533:17;37526:47;37590:131;37716:4;37590:131;:::i;:::-;37582:139;;37309:419;;;:::o;37734:177::-;37874:29;37870:1;37862:6;37858:14;37851:53;37734:177;:::o;37917:366::-;38059:3;38080:67;38144:2;38139:3;38080:67;:::i;:::-;38073:74;;38156:93;38245:3;38156:93;:::i;:::-;38274:2;38269:3;38265:12;38258:19;;37917:366;;;:::o;38289:419::-;38455:4;38493:2;38482:9;38478:18;38470:26;;38542:9;38536:4;38532:20;38528:1;38517:9;38513:17;38506:47;38570:131;38696:4;38570:131;:::i;:::-;38562:139;;38289:419;;;:::o;38714:227::-;38854:34;38850:1;38842:6;38838:14;38831:58;38923:10;38918:2;38910:6;38906:15;38899:35;38714:227;:::o;38947:366::-;39089:3;39110:67;39174:2;39169:3;39110:67;:::i;:::-;39103:74;;39186:93;39275:3;39186:93;:::i;:::-;39304:2;39299:3;39295:12;39288:19;;38947:366;;;:::o;39319:419::-;39485:4;39523:2;39512:9;39508:18;39500:26;;39572:9;39566:4;39562:20;39558:1;39547:9;39543:17;39536:47;39600:131;39726:4;39600:131;:::i;:::-;39592:139;;39319:419;;;:::o;39744:170::-;39884:22;39880:1;39872:6;39868:14;39861:46;39744:170;:::o;39920:366::-;40062:3;40083:67;40147:2;40142:3;40083:67;:::i;:::-;40076:74;;40159:93;40248:3;40159:93;:::i;:::-;40277:2;40272:3;40268:12;40261:19;;39920:366;;;:::o;40292:419::-;40458:4;40496:2;40485:9;40481:18;40473:26;;40545:9;40539:4;40535:20;40531:1;40520:9;40516:17;40509:47;40573:131;40699:4;40573:131;:::i;:::-;40565:139;;40292:419;;;:::o;40717:178::-;40857:30;40853:1;40845:6;40841:14;40834:54;40717:178;:::o;40901:366::-;41043:3;41064:67;41128:2;41123:3;41064:67;:::i;:::-;41057:74;;41140:93;41229:3;41140:93;:::i;:::-;41258:2;41253:3;41249:12;41242:19;;40901:366;;;:::o;41273:419::-;41439:4;41477:2;41466:9;41462:18;41454:26;;41526:9;41520:4;41516:20;41512:1;41501:9;41497:17;41490:47;41554:131;41680:4;41554:131;:::i;:::-;41546:139;;41273:419;;;:::o;41698:94::-;41731:8;41779:5;41775:2;41771:14;41750:35;;41698:94;;;:::o;41798:::-;41837:7;41866:20;41880:5;41866:20;:::i;:::-;41855:31;;41798:94;;;:::o;41898:100::-;41937:7;41966:26;41986:5;41966:26;:::i;:::-;41955:37;;41898:100;;;:::o;42004:157::-;42109:45;42129:24;42147:5;42129:24;:::i;:::-;42109:45;:::i;:::-;42104:3;42097:58;42004:157;;:::o;42167:256::-;42279:3;42294:75;42365:3;42356:6;42294:75;:::i;:::-;42394:2;42389:3;42385:12;42378:19;;42414:3;42407:10;;42167:256;;;;:::o;42429:173::-;42569:25;42565:1;42557:6;42553:14;42546:49;42429:173;:::o;42608:366::-;42750:3;42771:67;42835:2;42830:3;42771:67;:::i;:::-;42764:74;;42847:93;42936:3;42847:93;:::i;:::-;42965:2;42960:3;42956:12;42949:19;;42608:366;;;:::o;42980:419::-;43146:4;43184:2;43173:9;43169:18;43161:26;;43233:9;43227:4;43223:20;43219:1;43208:9;43204:17;43197:47;43261:131;43387:4;43261:131;:::i;:::-;43253:139;;42980:419;;;:::o;43405:171::-;43444:3;43467:24;43485:5;43467:24;:::i;:::-;43458:33;;43513:4;43506:5;43503:15;43500:41;;;43521:18;;:::i;:::-;43500:41;43568:1;43561:5;43557:13;43550:20;;43405:171;;;:::o;43582:180::-;43630:77;43627:1;43620:88;43727:4;43724:1;43717:15;43751:4;43748:1;43741:15;43768:185;43808:1;43825:20;43843:1;43825:20;:::i;:::-;43820:25;;43859:20;43877:1;43859:20;:::i;:::-;43854:25;;43898:1;43888:35;;43903:18;;:::i;:::-;43888:35;43945:1;43942;43938:9;43933:14;;43768:185;;;;:::o;43959:225::-;44099:34;44095:1;44087:6;44083:14;44076:58;44168:8;44163:2;44155:6;44151:15;44144:33;43959:225;:::o;44190:366::-;44332:3;44353:67;44417:2;44412:3;44353:67;:::i;:::-;44346:74;;44429:93;44518:3;44429:93;:::i;:::-;44547:2;44542:3;44538:12;44531:19;;44190:366;;;:::o;44562:419::-;44728:4;44766:2;44755:9;44751:18;44743:26;;44815:9;44809:4;44805:20;44801:1;44790:9;44786:17;44779:47;44843:131;44969:4;44843:131;:::i;:::-;44835:139;;44562:419;;;:::o;44987:231::-;45127:34;45123:1;45115:6;45111:14;45104:58;45196:14;45191:2;45183:6;45179:15;45172:39;44987:231;:::o;45224:366::-;45366:3;45387:67;45451:2;45446:3;45387:67;:::i;:::-;45380:74;;45463:93;45552:3;45463:93;:::i;:::-;45581:2;45576:3;45572:12;45565:19;;45224:366;;;:::o;45596:419::-;45762:4;45800:2;45789:9;45785:18;45777:26;;45849:9;45843:4;45839:20;45835:1;45824:9;45820:17;45813:47;45877:131;46003:4;45877:131;:::i;:::-;45869:139;;45596:419;;;:::o;46021:224::-;46161:34;46157:1;46149:6;46145:14;46138:58;46230:7;46225:2;46217:6;46213:15;46206:32;46021:224;:::o;46251:366::-;46393:3;46414:67;46478:2;46473:3;46414:67;:::i;:::-;46407:74;;46490:93;46579:3;46490:93;:::i;:::-;46608:2;46603:3;46599:12;46592:19;;46251:366;;;:::o;46623:419::-;46789:4;46827:2;46816:9;46812:18;46804:26;;46876:9;46870:4;46866:20;46862:1;46851:9;46847:17;46840:47;46904:131;47030:4;46904:131;:::i;:::-;46896:139;;46623:419;;;:::o;47048:223::-;47188:34;47184:1;47176:6;47172:14;47165:58;47257:6;47252:2;47244:6;47240:15;47233:31;47048:223;:::o;47277:366::-;47419:3;47440:67;47504:2;47499:3;47440:67;:::i;:::-;47433:74;;47516:93;47605:3;47516:93;:::i;:::-;47634:2;47629:3;47625:12;47618:19;;47277:366;;;:::o;47649:419::-;47815:4;47853:2;47842:9;47838:18;47830:26;;47902:9;47896:4;47892:20;47888:1;47877:9;47873:17;47866:47;47930:131;48056:4;47930:131;:::i;:::-;47922:139;;47649:419;;;:::o;48074:175::-;48214:27;48210:1;48202:6;48198:14;48191:51;48074:175;:::o;48255:366::-;48397:3;48418:67;48482:2;48477:3;48418:67;:::i;:::-;48411:74;;48494:93;48583:3;48494:93;:::i;:::-;48612:2;48607:3;48603:12;48596:19;;48255:366;;;:::o;48627:419::-;48793:4;48831:2;48820:9;48816:18;48808:26;;48880:9;48874:4;48870:20;48866:1;48855:9;48851:17;48844:47;48908:131;49034:4;48908:131;:::i;:::-;48900:139;;48627:419;;;:::o;49052:237::-;49192:34;49188:1;49180:6;49176:14;49169:58;49261:20;49256:2;49248:6;49244:15;49237:45;49052:237;:::o;49295:366::-;49437:3;49458:67;49522:2;49517:3;49458:67;:::i;:::-;49451:74;;49534:93;49623:3;49534:93;:::i;:::-;49652:2;49647:3;49643:12;49636:19;;49295:366;;;:::o;49667:419::-;49833:4;49871:2;49860:9;49856:18;49848:26;;49920:9;49914:4;49910:20;49906:1;49895:9;49891:17;49884:47;49948:131;50074:4;49948:131;:::i;:::-;49940:139;;49667:419;;;:::o;50092:176::-;50124:1;50141:20;50159:1;50141:20;:::i;:::-;50136:25;;50175:20;50193:1;50175:20;:::i;:::-;50170:25;;50214:1;50204:35;;50219:18;;:::i;:::-;50204:35;50260:1;50257;50253:9;50248:14;;50092:176;;;;:::o;50274:79::-;50313:7;50342:5;50331:16;;50274:79;;;:::o;50359:157::-;50464:45;50484:24;50502:5;50484:24;:::i;:::-;50464:45;:::i;:::-;50459:3;50452:58;50359:157;;:::o;50522:397::-;50662:3;50677:75;50748:3;50739:6;50677:75;:::i;:::-;50777:2;50772:3;50768:12;50761:19;;50790:75;50861:3;50852:6;50790:75;:::i;:::-;50890:2;50885:3;50881:12;50874:19;;50910:3;50903:10;;50522:397;;;;;:::o;50925:98::-;50976:6;51010:5;51004:12;50994:22;;50925:98;;;:::o;51029:168::-;51112:11;51146:6;51141:3;51134:19;51186:4;51181:3;51177:14;51162:29;;51029:168;;;;:::o;51203:360::-;51289:3;51317:38;51349:5;51317:38;:::i;:::-;51371:70;51434:6;51429:3;51371:70;:::i;:::-;51364:77;;51450:52;51495:6;51490:3;51483:4;51476:5;51472:16;51450:52;:::i;:::-;51527:29;51549:6;51527:29;:::i;:::-;51522:3;51518:39;51511:46;;51293:270;51203:360;;;;:::o;51569:640::-;51764:4;51802:3;51791:9;51787:19;51779:27;;51816:71;51884:1;51873:9;51869:17;51860:6;51816:71;:::i;:::-;51897:72;51965:2;51954:9;51950:18;51941:6;51897:72;:::i;:::-;51979;52047:2;52036:9;52032:18;52023:6;51979:72;:::i;:::-;52098:9;52092:4;52088:20;52083:2;52072:9;52068:18;52061:48;52126:76;52197:4;52188:6;52126:76;:::i;:::-;52118:84;;51569:640;;;;;;;:::o;52215:141::-;52271:5;52302:6;52296:13;52287:22;;52318:32;52344:5;52318:32;:::i;:::-;52215:141;;;;:::o;52362:349::-;52431:6;52480:2;52468:9;52459:7;52455:23;52451:32;52448:119;;;52486:79;;:::i;:::-;52448:119;52606:1;52631:63;52686:7;52677:6;52666:9;52662:22;52631:63;:::i;:::-;52621:73;;52577:127;52362:349;;;;:::o;52717:182::-;52857:34;52853:1;52845:6;52841:14;52834:58;52717:182;:::o;52905:366::-;53047:3;53068:67;53132:2;53127:3;53068:67;:::i;:::-;53061:74;;53144:93;53233:3;53144:93;:::i;:::-;53262:2;53257:3;53253:12;53246:19;;52905:366;;;:::o;53277:419::-;53443:4;53481:2;53470:9;53466:18;53458:26;;53530:9;53524:4;53520:20;53516:1;53505:9;53501:17;53494:47;53558:131;53684:4;53558:131;:::i;:::-;53550:139;;53277:419;;;:::o;53702:178::-;53842:30;53838:1;53830:6;53826:14;53819:54;53702:178;:::o;53886:366::-;54028:3;54049:67;54113:2;54108:3;54049:67;:::i;:::-;54042:74;;54125:93;54214:3;54125:93;:::i;:::-;54243:2;54238:3;54234:12;54227:19;;53886:366;;;:::o;54258:419::-;54424:4;54462:2;54451:9;54447:18;54439:26;;54511:9;54505:4;54501:20;54497:1;54486:9;54482:17;54475:47;54539:131;54665:4;54539:131;:::i;:::-;54531:139;;54258:419;;;:::o;54683:180::-;54731:77;54728:1;54721:88;54828:4;54825:1;54818:15;54852:4;54849:1;54842:15

Swarm Source

ipfs://19a9accb46167342c97273e3cd3e99523912182ab0360dceefa7fcefc396ed8d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.