ETH Price: $2,917.88 (+2.70%)
 

Overview

Max Total Supply

5,555 TUBZ

Holders

914

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
*拉屎不擦屁股.eth
Balance
5 TUBZ
0xa61595d90dd496970C56E5cFF8e85f1d315643Fe
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:
TubzSocialClub

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.9.9 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT
// 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/token/ERC721/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

    /**
     * @dev 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// 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/utils/[email protected]

// 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/utils/[email protected]

// 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/utils/[email protected]

// 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/introspection/[email protected]

// 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/[email protected]

// OpenZeppelin Contracts (last updated v4.6.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 overridden 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 || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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/[email protected]

// 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/[email protected]

// 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 @openzeppelin/contracts/interfaces/[email protected]

// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


// File @openzeppelin/contracts/token/common/[email protected]

// OpenZeppelin Contracts (last updated v4.6.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `tokenId` must be already minted.
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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

pragma solidity ^0.8.0;



/**
 * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment
 * information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC721Royalty is ERC2981, ERC721 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);
        _resetTokenRoyalty(tokenId);
    }
}


// File @openzeppelin/contracts/access/[email protected]

// 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/cryptography/[email protected]

// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


// File contracts/TubzSocialClub.sol


//   _______    _         _____            _       _  _____ _       _
//  |__   __|  | |       / ____|          (_)     | |/ ____| |     | |
//     | |_   _| |__ ___| (___   ___   ___ _  __ _| | |    | |_   _| |__
//     | | | | | '_ \_  /\___ \ / _ \ / __| |/ _` | | |    | | | | | '_ \
//     | | |_| | |_) / / ____) | (_) | (__| | (_| | | |____| | |_| | |_) |
//     |_|\__,_|_.__/___|_____/ \___/ \___|_|\__,_|_|\_____|_|\__,_|_.__/
//

pragma solidity ^0.8.4;





contract TubzSocialClub is ERC721Enumerable, ERC721Royalty, Ownable {
    using Strings for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private tokenCounter;

    string public baseURI;
    string public baseExtension = ".json";

    uint256 public constant maxSupply = 5555;
    uint256 public constant maxMint = 5;

    uint96 public constant royaltiesPercentage = 10;

    uint256 public presalePrice = 0.08 ether;
    uint256 public mainsalePrice = 0.10 ether;

    bool public isPresale = true;

    mapping(address => bool) public whitelistClaimed;
    bytes32 public merkleRoot;

    address public presaleFundsReceiver;
    address public mainsaleFundsReceiver;

    constructor(
        string memory baseURI_,
        address royaltiesReceiver,
        address presaleFundsReceiver_,
        address mainsaleFundsReceiver_,
        bytes32 merkleRoot_
    ) ERC721("TubzSocialClub", "TUBZ") {
        setBaseURI(baseURI_);
        _setDefaultRoyalty(royaltiesReceiver, royaltiesPercentage * 100);

        presaleFundsReceiver = presaleFundsReceiver_;
        mainsaleFundsReceiver = mainsaleFundsReceiver_;

        merkleRoot = merkleRoot_;
    }

    // ********** internal

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

    // ********** public

    function mint(uint256 amount) public payable {
        require(!isPresale, "Main sale not active");
        require(amount > 0 && amount <= maxMint, "Not valid amount");
        require(msg.value >= mainsalePrice * amount, "Not enough ETH");
        require(
            tokenCounter.current() + amount <= maxSupply,
            "Not enough NFTs"
        );

        unchecked {
            for (uint256 i = 0; i < amount; i++) {
                tokenCounter.increment();
                _safeMint(_msgSender(), tokenCounter.current());
            }
        }
    }

    function mintPresale(uint256 amount, bytes32[] calldata merkleProof)
        public
        payable
    {
        require(isPresale, "Presale not active");
        require(amount > 0 && amount <= maxMint, "Not valid amount");
        require(msg.value >= presalePrice * amount, "Not enough ETH");
        require(
            tokenCounter.current() + amount <= maxSupply,
            "Not enough NFTs"
        );
        require(!whitelistClaimed[_msgSender()], "Address already used");

        bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
        require(
            MerkleProof.verify(merkleProof, merkleRoot, leaf),
            "Address not whitelisted"
        );

        whitelistClaimed[_msgSender()] = true;

        unchecked {
            for (uint256 i = 0; i < amount; i++) {
                tokenCounter.increment();
                _safeMint(_msgSender(), tokenCounter.current());
            }
        }
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(tokenId), "Token ID doesn't exist");

        string memory currentBaseURI = _baseURI();

        return
            string(
                abi.encodePacked(
                    currentBaseURI,
                    "/",
                    tokenId.toString(),
                    baseExtension
                )
            );
    }

    // ********** only owner

    function airdrop(address to) public onlyOwner {
        require(tokenCounter.current() + 1 <= maxSupply, "Not enough NFTs");

        tokenCounter.increment();
        _safeMint(to, tokenCounter.current());
    }

    function setIsPresale(bool isPresale_) public onlyOwner {
        require(address(this).balance == 0, "Not zero balance");
        isPresale = isPresale_;
    }

    function setMerkleRoot(bytes32 merkleRoot_) public onlyOwner {
        merkleRoot = merkleRoot_;
    }

    function setPricing(uint256 presalePrice_, uint256 mainsalePrice_)
        public
        onlyOwner
    {
        presalePrice = presalePrice_;
        mainsalePrice = mainsalePrice_;
    }

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

    function withdraw() public payable onlyOwner {
        address receiver = isPresale
            ? presaleFundsReceiver
            : mainsaleFundsReceiver;
        (bool os, ) = payable(receiver).call{value: address(this).balance}("");
        require(os);
    }

    // ************ Fix overrides
    function _burn(uint256 tokenId) internal override(ERC721, ERC721Royalty) {
        super._burn(tokenId);
    }

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

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"address","name":"royaltiesReceiver","type":"address"},{"internalType":"address","name":"presaleFundsReceiver_","type":"address"},{"internalType":"address","name":"mainsaleFundsReceiver_","type":"address"},{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainsaleFundsReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainsalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleFundsReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltiesPercentage","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPresale_","type":"bool"}],"name":"setIsPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"presalePrice_","type":"uint256"},{"internalType":"uint256","name":"mainsalePrice_","type":"uint256"}],"name":"setPricing","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":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600f9080519060200190620000519291906200058e565b5067011c37937e08000060105567016345785d8a00006011556001601260006101000a81548160ff0219169083151502179055503480156200009257600080fd5b5060405162005bdb38038062005bdb8339818101604052810190620000b89190620006de565b6040518060400160405280600e81526020017f5475627a536f6369616c436c75620000000000000000000000000000000000008152506040518060400160405280600481526020017f5455425a0000000000000000000000000000000000000000000000000000000081525081600290805190602001906200013c9291906200058e565b508060039080519060200190620001559291906200058e565b505050620001786200016c6200023e60201b60201c565b6200024660201b60201c565b62000189856200030c60201b60201c565b620001aa846064600a6200019e9190620008c4565b620003b760201b60201c565b82601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601481905550505050505062000b7c565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200031c6200023e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003426200055a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200039b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200039290620007ee565b60405180910390fd5b80600e9080519060200190620003b39291906200058e565b5050565b620003c76200058460201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000428576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200041f9062000810565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200049b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004929062000832565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000612710905090565b8280546200059c906200099d565b90600052602060002090601f016020900481019282620005c057600085556200060c565b82601f10620005db57805160ff19168380011785556200060c565b828001600101855582156200060c579182015b828111156200060b578251825591602001919060010190620005ee565b5b5090506200061b91906200061f565b5090565b5b808211156200063a57600081600090555060010162000620565b5090565b6000620006556200064f846200087d565b62000854565b9050828152602081018484840111156200066e57600080fd5b6200067b84828562000967565b509392505050565b600081519050620006948162000b48565b92915050565b600081519050620006ab8162000b62565b92915050565b600082601f830112620006c357600080fd5b8151620006d58482602086016200063e565b91505092915050565b600080600080600060a08688031215620006f757600080fd5b600086015167ffffffffffffffff8111156200071257600080fd5b6200072088828901620006b1565b9550506020620007338882890162000683565b9450506040620007468882890162000683565b9350506060620007598882890162000683565b92505060806200076c888289016200069a565b9150509295509295909350565b600062000788602083620008b3565b9150620007958262000aa7565b602082019050919050565b6000620007af602a83620008b3565b9150620007bc8262000ad0565b604082019050919050565b6000620007d6601983620008b3565b9150620007e38262000b1f565b602082019050919050565b60006020820190508181036000830152620008098162000779565b9050919050565b600060208201905081810360008301526200082b81620007a0565b9050919050565b600060208201905081810360008301526200084d81620007c7565b9050919050565b60006200086062000873565b90506200086e8282620009d3565b919050565b6000604051905090565b600067ffffffffffffffff8211156200089b576200089a62000a67565b5b620008a68262000a96565b9050602081019050919050565b600082825260208201905092915050565b6000620008d1826200094f565b9150620008de836200094f565b9250816bffffffffffffffffffffffff048311821515161562000906576200090562000a09565b5b828202905092915050565b60006200091e826200092f565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b60005b83811015620009875780820151818401526020810190506200096a565b8381111562000997576000848401525b50505050565b60006002820490506001821680620009b657607f821691505b60208210811415620009cd57620009cc62000a38565b5b50919050565b620009de8262000a96565b810181811067ffffffffffffffff8211171562000a0057620009ff62000a67565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b62000b538162000911565b811462000b5f57600080fd5b50565b62000b6d8162000925565b811462000b7957600080fd5b50565b61504f8062000b8c6000396000f3fe60806040526004361061023a5760003560e01c806370a082311161012e578063b88d4fde116100ab578063cafa8dfe1161006f578063cafa8dfe1461084a578063d5abeb0114610875578063db4bec44146108a0578063e985e9c5146108dd578063f2fde38b1461091a5761023a565b8063b88d4fde14610767578063bfc1773314610790578063c6682862146107b9578063c87b56dd146107e4578063ca05588a146108215761023a565b80638def4a28116100f25780638def4a28146106a157806395364a84146106cc57806395d89b41146106f7578063a0712d6814610722578063a22cb4651461073e5761023a565b806370a08231146105ce578063715018a61461060b5780637501f741146106225780637cb647591461064d5780638da5cb5b146106765761023a565b80632a55205a116101bc57806343901f5b1161018057806343901f5b146104d55780634f6ccce71461050057806355f804b31461053d5780636352211e146105665780636c0360eb146105a35761023a565b80632a55205a146103fc5780632eb4a7ab1461043a5780632f745c59146104655780633ccfd60b146104a257806342842e0e146104ac5761023a565b8063095ea7b311610203578063095ea7b31461033a5780630c0a6b5e1461036357806318160ddd1461037f57806321860a05146103aa57806323b872dd146103d35761023a565b80620e7fa81461023f578063010eac6a1461026a57806301ffc9a71461029557806306fdde03146102d2578063081812fc146102fd575b600080fd5b34801561024b57600080fd5b50610254610943565b604051610261919061447a565b60405180910390f35b34801561027657600080fd5b5061027f610949565b60405161028c919061447a565b60405180910390f35b3480156102a157600080fd5b506102bc60048036038101906102b7919061393e565b61094f565b6040516102c991906140e2565b60405180910390f35b3480156102de57600080fd5b506102e7610961565b6040516102f49190614118565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f91906139d1565b6109f3565b6040516103319190614052565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c91906138b0565b610a78565b005b61037d600480360381019061037891906139fa565b610b90565b005b34801561038b57600080fd5b50610394610ecd565b6040516103a1919061447a565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc9190613745565b610eda565b005b3480156103df57600080fd5b506103fa60048036038101906103f591906137aa565b610fd0565b005b34801561040857600080fd5b50610423600480360381019061041e9190613a52565b611030565b6040516104319291906140b9565b60405180910390f35b34801561044657600080fd5b5061044f61121b565b60405161045c91906140fd565b60405180910390f35b34801561047157600080fd5b5061048c600480360381019061048791906138b0565b611221565b604051610499919061447a565b60405180910390f35b6104aa6112c6565b005b3480156104b857600080fd5b506104d360048036038101906104ce91906137aa565b611420565b005b3480156104e157600080fd5b506104ea611440565b6040516104f79190614052565b60405180910390f35b34801561050c57600080fd5b50610527600480360381019061052291906139d1565b611466565b604051610534919061447a565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f9190613990565b6114fd565b005b34801561057257600080fd5b5061058d600480360381019061058891906139d1565b611593565b60405161059a9190614052565b60405180910390f35b3480156105af57600080fd5b506105b8611645565b6040516105c59190614118565b60405180910390f35b3480156105da57600080fd5b506105f560048036038101906105f09190613745565b6116d3565b604051610602919061447a565b60405180910390f35b34801561061757600080fd5b5061062061178b565b005b34801561062e57600080fd5b50610637611813565b604051610644919061447a565b60405180910390f35b34801561065957600080fd5b50610674600480360381019061066f9190613915565b611818565b005b34801561068257600080fd5b5061068b61189e565b6040516106989190614052565b60405180910390f35b3480156106ad57600080fd5b506106b66118c8565b6040516106c39190614052565b60405180910390f35b3480156106d857600080fd5b506106e16118ee565b6040516106ee91906140e2565b60405180910390f35b34801561070357600080fd5b5061070c611901565b6040516107199190614118565b60405180910390f35b61073c600480360381019061073791906139d1565b611993565b005b34801561074a57600080fd5b5061076560048036038101906107609190613874565b611b1c565b005b34801561077357600080fd5b5061078e600480360381019061078991906137f9565b611b32565b005b34801561079c57600080fd5b506107b760048036038101906107b291906138ec565b611b94565b005b3480156107c557600080fd5b506107ce611c70565b6040516107db9190614118565b60405180910390f35b3480156107f057600080fd5b5061080b600480360381019061080691906139d1565b611cfe565b6040516108189190614118565b60405180910390f35b34801561082d57600080fd5b5061084860048036038101906108439190613a52565b611d89565b005b34801561085657600080fd5b5061085f611e17565b60405161086c9190614495565b60405180910390f35b34801561088157600080fd5b5061088a611e1c565b604051610897919061447a565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c29190613745565b611e22565b6040516108d491906140e2565b60405180910390f35b3480156108e957600080fd5b5061090460048036038101906108ff919061376e565b611e42565b60405161091191906140e2565b60405180910390f35b34801561092657600080fd5b50610941600480360381019061093c9190613745565b611ed6565b005b60105481565b60115481565b600061095a82611fce565b9050919050565b60606002805461097090614787565b80601f016020809104026020016040519081016040528092919081815260200182805461099c90614787565b80156109e95780601f106109be576101008083540402835291602001916109e9565b820191906000526020600020905b8154815290600101906020018083116109cc57829003601f168201915b5050505050905090565b60006109fe82611fe0565b610a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a349061433a565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a8382611593565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aeb906143da565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b1361204c565b73ffffffffffffffffffffffffffffffffffffffff161480610b425750610b4181610b3c61204c565b611e42565b5b610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b789061427a565b60405180910390fd5b610b8b8383612054565b505050565b601260009054906101000a900460ff16610bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd69061423a565b60405180910390fd5b600083118015610bf0575060058311155b610c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c269061443a565b60405180910390fd5b82601054610c3d9190614621565b341015610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c769061431a565b60405180910390fd5b6115b383610c8d600d61210d565b610c97919061459a565b1115610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf906142da565b60405180910390fd5b60136000610ce461204c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d639061439a565b60405180910390fd5b6000610d7661204c565b604051602001610d869190613fe6565b604051602081830303815290604052805190602001209050610dec838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506014548361211b565b610e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e229061437a565b60405180910390fd5b600160136000610e3961204c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b84811015610ec657610e9f600d612132565b610eb9610eaa61204c565b610eb4600d61210d565b612148565b8080600101915050610e8d565b5050505050565b6000600a80549050905090565b610ee261204c565b73ffffffffffffffffffffffffffffffffffffffff16610f0061189e565b73ffffffffffffffffffffffffffffffffffffffff1614610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d9061435a565b60405180910390fd5b6115b36001610f65600d61210d565b610f6f919061459a565b1115610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa7906142da565b60405180910390fd5b610fba600d612132565b610fcd81610fc8600d61210d565b612148565b50565b610fe1610fdb61204c565b82612166565b611020576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611017906143fa565b60405180910390fd5b61102b838383612244565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156111c65760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006111d06124ab565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866111fc9190614621565b61120691906145f0565b90508160000151819350935050509250929050565b60145481565b600061122c836116d3565b821061126d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112649061415a565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6112ce61204c565b73ffffffffffffffffffffffffffffffffffffffff166112ec61189e565b73ffffffffffffffffffffffffffffffffffffffff1614611342576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113399061435a565b60405180910390fd5b6000601260009054906101000a900460ff1661138057601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166113a4565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b905060008173ffffffffffffffffffffffffffffffffffffffff16476040516113cc9061403d565b60006040518083038185875af1925050503d8060008114611409576040519150601f19603f3d011682016040523d82523d6000602084013e61140e565b606091505b505090508061141c57600080fd5b5050565b61143b83838360405180602001604052806000815250611b32565b505050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611470610ecd565b82106114b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a89061441a565b60405180910390fd5b600a82815481106114eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b61150561204c565b73ffffffffffffffffffffffffffffffffffffffff1661152361189e565b73ffffffffffffffffffffffffffffffffffffffff1614611579576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115709061435a565b60405180910390fd5b80600e908051906020019061158f92919061350a565b5050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561163c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611633906142ba565b60405180910390fd5b80915050919050565b600e805461165290614787565b80601f016020809104026020016040519081016040528092919081815260200182805461167e90614787565b80156116cb5780601f106116a0576101008083540402835291602001916116cb565b820191906000526020600020905b8154815290600101906020018083116116ae57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173b9061429a565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61179361204c565b73ffffffffffffffffffffffffffffffffffffffff166117b161189e565b73ffffffffffffffffffffffffffffffffffffffff1614611807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fe9061435a565b60405180910390fd5b61181160006124b5565b565b600581565b61182061204c565b73ffffffffffffffffffffffffffffffffffffffff1661183e61189e565b73ffffffffffffffffffffffffffffffffffffffff1614611894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188b9061435a565b60405180910390fd5b8060148190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260009054906101000a900460ff1681565b60606003805461191090614787565b80601f016020809104026020016040519081016040528092919081815260200182805461193c90614787565b80156119895780601f1061195e57610100808354040283529160200191611989565b820191906000526020600020905b81548152906001019060200180831161196c57829003601f168201915b5050505050905090565b601260009054906101000a900460ff16156119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da906143ba565b60405180910390fd5b6000811180156119f4575060058111155b611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a9061443a565b60405180910390fd5b80601154611a419190614621565b341015611a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7a9061431a565b60405180910390fd5b6115b381611a91600d61210d565b611a9b919061459a565b1115611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad3906142da565b60405180910390fd5b60005b81811015611b1857611af1600d612132565b611b0b611afc61204c565b611b06600d61210d565b612148565b8080600101915050611adf565b5050565b611b2e611b2761204c565b838361257b565b5050565b611b43611b3d61204c565b83612166565b611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b79906143fa565b60405180910390fd5b611b8e848484846126e8565b50505050565b611b9c61204c565b73ffffffffffffffffffffffffffffffffffffffff16611bba61189e565b73ffffffffffffffffffffffffffffffffffffffff1614611c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c079061435a565b60405180910390fd5b60004714611c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4a9061445a565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b600f8054611c7d90614787565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca990614787565b8015611cf65780601f10611ccb57610100808354040283529160200191611cf6565b820191906000526020600020905b815481529060010190602001808311611cd957829003601f168201915b505050505081565b6060611d0982611fe0565b611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f9061413a565b60405180910390fd5b6000611d52612744565b905080611d5e846127d6565b600f604051602001611d7293929190614001565b604051602081830303815290604052915050919050565b611d9161204c565b73ffffffffffffffffffffffffffffffffffffffff16611daf61189e565b73ffffffffffffffffffffffffffffffffffffffff1614611e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfc9061435a565b60405180910390fd5b81601081905550806011819055505050565b600a81565b6115b381565b60136020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ede61204c565b73ffffffffffffffffffffffffffffffffffffffff16611efc61189e565b73ffffffffffffffffffffffffffffffffffffffff1614611f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f499061435a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb99061419a565b60405180910390fd5b611fcb816124b5565b50565b6000611fd982612983565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120c783611593565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60008261212885846129fd565b1490509392505050565b6001816000016000828254019250508190555050565b612162828260405180602001604052806000815250612a98565b5050565b600061217182611fe0565b6121b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a79061425a565b60405180910390fd5b60006121bb83611593565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121fd57506121fc8185611e42565b5b8061223b57508373ffffffffffffffffffffffffffffffffffffffff16612223846109f3565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661226482611593565b73ffffffffffffffffffffffffffffffffffffffff16146122ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b1906141ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561232a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612321906141fa565b60405180910390fd5b612335838383612af3565b612340600082612054565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612390919061467b565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123e7919061459a565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124a6838383612b03565b505050565b6000612710905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e19061421a565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126db91906140e2565b60405180910390a3505050565b6126f3848484612244565b6126ff84848484612b08565b61273e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127359061417a565b60405180910390fd5b50505050565b6060600e805461275390614787565b80601f016020809104026020016040519081016040528092919081815260200182805461277f90614787565b80156127cc5780601f106127a1576101008083540402835291602001916127cc565b820191906000526020600020905b8154815290600101906020018083116127af57829003601f168201915b5050505050905090565b6060600082141561281e576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061297e565b600082905060005b60008214612850578080612839906147ea565b915050600a8261284991906145f0565b9150612826565b60008167ffffffffffffffff811115612892577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128c45781602001600182028036833780820191505090505b5090505b60008514612977576001826128dd919061467b565b9150600a856128ec9190614857565b60306128f8919061459a565b60f81b818381518110612934577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561297091906145f0565b94506128c8565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129f657506129f582612c9f565b5b9050919050565b60008082905060005b8451811015612a8d576000858281518110612a4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311612a6c57612a658382612d81565b9250612a79565b612a768184612d81565b92505b508080612a85906147ea565b915050612a06565b508091505092915050565b612aa28383612d98565b612aaf6000848484612b08565b612aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae59061417a565b60405180910390fd5b505050565b612afe838383612f72565b505050565b505050565b6000612b298473ffffffffffffffffffffffffffffffffffffffff16613086565b15612c92578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b5261204c565b8786866040518563ffffffff1660e01b8152600401612b74949392919061406d565b602060405180830381600087803b158015612b8e57600080fd5b505af1925050508015612bbf57506040513d601f19601f82011682018060405250810190612bbc9190613967565b60015b612c42573d8060008114612bef576040519150601f19603f3d011682016040523d82523d6000602084013e612bf4565b606091505b50600081511415612c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c319061417a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c97565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d6a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d7a5750612d79826130a9565b5b9050919050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dff906142fa565b60405180910390fd5b612e1181611fe0565b15612e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e48906141da565b60405180910390fd5b612e5d60008383612af3565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ead919061459a565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f6e60008383612b03565b5050565b612f7d838383613123565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fc057612fbb81613128565b612fff565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612ffe57612ffd8382613171565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130425761303d816132de565b613081565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130805761307f8282613421565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061311c575061311b826134a0565b5b9050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161317e846116d3565b613188919061467b565b905060006009600084815260200190815260200160002054905081811461326d576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506132f2919061467b565b90506000600b60008481526020019081526020016000205490506000600a8381548110613348577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600a8381548110613390577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613405577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061342c836116d3565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b82805461351690614787565b90600052602060002090601f016020900481019282613538576000855561357f565b82601f1061355157805160ff191683800117855561357f565b8280016001018555821561357f579182015b8281111561357e578251825591602001919060010190613563565b5b50905061358c9190613590565b5090565b5b808211156135a9576000816000905550600101613591565b5090565b60006135c06135bb846144d5565b6144b0565b9050828152602081018484840111156135d857600080fd5b6135e3848285614745565b509392505050565b60006135fe6135f984614506565b6144b0565b90508281526020810184848401111561361657600080fd5b613621848285614745565b509392505050565b60008135905061363881614fa6565b92915050565b60008083601f84011261365057600080fd5b8235905067ffffffffffffffff81111561366957600080fd5b60208301915083602082028301111561368157600080fd5b9250929050565b60008135905061369781614fbd565b92915050565b6000813590506136ac81614fd4565b92915050565b6000813590506136c181614feb565b92915050565b6000815190506136d681614feb565b92915050565b600082601f8301126136ed57600080fd5b81356136fd8482602086016135ad565b91505092915050565b600082601f83011261371757600080fd5b81356137278482602086016135eb565b91505092915050565b60008135905061373f81615002565b92915050565b60006020828403121561375757600080fd5b600061376584828501613629565b91505092915050565b6000806040838503121561378157600080fd5b600061378f85828601613629565b92505060206137a085828601613629565b9150509250929050565b6000806000606084860312156137bf57600080fd5b60006137cd86828701613629565b93505060206137de86828701613629565b92505060406137ef86828701613730565b9150509250925092565b6000806000806080858703121561380f57600080fd5b600061381d87828801613629565b945050602061382e87828801613629565b935050604061383f87828801613730565b925050606085013567ffffffffffffffff81111561385c57600080fd5b613868878288016136dc565b91505092959194509250565b6000806040838503121561388757600080fd5b600061389585828601613629565b92505060206138a685828601613688565b9150509250929050565b600080604083850312156138c357600080fd5b60006138d185828601613629565b92505060206138e285828601613730565b9150509250929050565b6000602082840312156138fe57600080fd5b600061390c84828501613688565b91505092915050565b60006020828403121561392757600080fd5b60006139358482850161369d565b91505092915050565b60006020828403121561395057600080fd5b600061395e848285016136b2565b91505092915050565b60006020828403121561397957600080fd5b6000613987848285016136c7565b91505092915050565b6000602082840312156139a257600080fd5b600082013567ffffffffffffffff8111156139bc57600080fd5b6139c884828501613706565b91505092915050565b6000602082840312156139e357600080fd5b60006139f184828501613730565b91505092915050565b600080600060408486031215613a0f57600080fd5b6000613a1d86828701613730565b935050602084013567ffffffffffffffff811115613a3a57600080fd5b613a468682870161363e565b92509250509250925092565b60008060408385031215613a6557600080fd5b6000613a7385828601613730565b9250506020613a8485828601613730565b9150509250929050565b613a97816146af565b82525050565b613aae613aa9826146af565b614833565b82525050565b613abd816146c1565b82525050565b613acc816146cd565b82525050565b6000613add8261454c565b613ae78185614562565b9350613af7818560208601614754565b613b0081614944565b840191505092915050565b6000613b1682614557565b613b20818561457e565b9350613b30818560208601614754565b613b3981614944565b840191505092915050565b6000613b4f82614557565b613b59818561458f565b9350613b69818560208601614754565b80840191505092915050565b60008154613b8281614787565b613b8c818661458f565b94506001821660008114613ba75760018114613bb857613beb565b60ff19831686528186019350613beb565b613bc185614537565b60005b83811015613be357815481890152600182019150602081019050613bc4565b838801955050505b50505092915050565b6000613c0160168361457e565b9150613c0c82614962565b602082019050919050565b6000613c24602b8361457e565b9150613c2f8261498b565b604082019050919050565b6000613c4760328361457e565b9150613c52826149da565b604082019050919050565b6000613c6a60268361457e565b9150613c7582614a29565b604082019050919050565b6000613c8d60258361457e565b9150613c9882614a78565b604082019050919050565b6000613cb0601c8361457e565b9150613cbb82614ac7565b602082019050919050565b6000613cd360248361457e565b9150613cde82614af0565b604082019050919050565b6000613cf660198361457e565b9150613d0182614b3f565b602082019050919050565b6000613d1960128361457e565b9150613d2482614b68565b602082019050919050565b6000613d3c602c8361457e565b9150613d4782614b91565b604082019050919050565b6000613d5f60388361457e565b9150613d6a82614be0565b604082019050919050565b6000613d82602a8361457e565b9150613d8d82614c2f565b604082019050919050565b6000613da560298361457e565b9150613db082614c7e565b604082019050919050565b6000613dc8600f8361457e565b9150613dd382614ccd565b602082019050919050565b6000613deb60208361457e565b9150613df682614cf6565b602082019050919050565b6000613e0e600e8361457e565b9150613e1982614d1f565b602082019050919050565b6000613e31602c8361457e565b9150613e3c82614d48565b604082019050919050565b6000613e5460208361457e565b9150613e5f82614d97565b602082019050919050565b6000613e7760178361457e565b9150613e8282614dc0565b602082019050919050565b6000613e9a60148361457e565b9150613ea582614de9565b602082019050919050565b6000613ebd60148361457e565b9150613ec882614e12565b602082019050919050565b6000613ee060218361457e565b9150613eeb82614e3b565b604082019050919050565b6000613f03600083614573565b9150613f0e82614e8a565b600082019050919050565b6000613f2660318361457e565b9150613f3182614e8d565b604082019050919050565b6000613f49602c8361457e565b9150613f5482614edc565b604082019050919050565b6000613f6c60108361457e565b9150613f7782614f2b565b602082019050919050565b6000613f8f60108361457e565b9150613f9a82614f54565b602082019050919050565b6000613fb260018361458f565b9150613fbd82614f7d565b600182019050919050565b613fd181614723565b82525050565b613fe08161472d565b82525050565b6000613ff28284613a9d565b60148201915081905092915050565b600061400d8286613b44565b915061401882613fa5565b91506140248285613b44565b91506140308284613b75565b9150819050949350505050565b600061404882613ef6565b9150819050919050565b60006020820190506140676000830184613a8e565b92915050565b60006080820190506140826000830187613a8e565b61408f6020830186613a8e565b61409c6040830185613fc8565b81810360608301526140ae8184613ad2565b905095945050505050565b60006040820190506140ce6000830185613a8e565b6140db6020830184613fc8565b9392505050565b60006020820190506140f76000830184613ab4565b92915050565b60006020820190506141126000830184613ac3565b92915050565b600060208201905081810360008301526141328184613b0b565b905092915050565b6000602082019050818103600083015261415381613bf4565b9050919050565b6000602082019050818103600083015261417381613c17565b9050919050565b6000602082019050818103600083015261419381613c3a565b9050919050565b600060208201905081810360008301526141b381613c5d565b9050919050565b600060208201905081810360008301526141d381613c80565b9050919050565b600060208201905081810360008301526141f381613ca3565b9050919050565b6000602082019050818103600083015261421381613cc6565b9050919050565b6000602082019050818103600083015261423381613ce9565b9050919050565b6000602082019050818103600083015261425381613d0c565b9050919050565b6000602082019050818103600083015261427381613d2f565b9050919050565b6000602082019050818103600083015261429381613d52565b9050919050565b600060208201905081810360008301526142b381613d75565b9050919050565b600060208201905081810360008301526142d381613d98565b9050919050565b600060208201905081810360008301526142f381613dbb565b9050919050565b6000602082019050818103600083015261431381613dde565b9050919050565b6000602082019050818103600083015261433381613e01565b9050919050565b6000602082019050818103600083015261435381613e24565b9050919050565b6000602082019050818103600083015261437381613e47565b9050919050565b6000602082019050818103600083015261439381613e6a565b9050919050565b600060208201905081810360008301526143b381613e8d565b9050919050565b600060208201905081810360008301526143d381613eb0565b9050919050565b600060208201905081810360008301526143f381613ed3565b9050919050565b6000602082019050818103600083015261441381613f19565b9050919050565b6000602082019050818103600083015261443381613f3c565b9050919050565b6000602082019050818103600083015261445381613f5f565b9050919050565b6000602082019050818103600083015261447381613f82565b9050919050565b600060208201905061448f6000830184613fc8565b92915050565b60006020820190506144aa6000830184613fd7565b92915050565b60006144ba6144cb565b90506144c682826147b9565b919050565b6000604051905090565b600067ffffffffffffffff8211156144f0576144ef614915565b5b6144f982614944565b9050602081019050919050565b600067ffffffffffffffff82111561452157614520614915565b5b61452a82614944565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006145a582614723565b91506145b083614723565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145e5576145e4614888565b5b828201905092915050565b60006145fb82614723565b915061460683614723565b925082614616576146156148b7565b5b828204905092915050565b600061462c82614723565b915061463783614723565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146705761466f614888565b5b828202905092915050565b600061468682614723565b915061469183614723565b9250828210156146a4576146a3614888565b5b828203905092915050565b60006146ba82614703565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614772578082015181840152602081019050614757565b83811115614781576000848401525b50505050565b6000600282049050600182168061479f57607f821691505b602082108114156147b3576147b26148e6565b5b50919050565b6147c282614944565b810181811067ffffffffffffffff821117156147e1576147e0614915565b5b80604052505050565b60006147f582614723565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561482857614827614888565b5b600182019050919050565b600061483e82614845565b9050919050565b600061485082614955565b9050919050565b600061486282614723565b915061486d83614723565b92508261487d5761487c6148b7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f546f6b656e20494420646f65736e277420657869737400000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f50726573616c65206e6f74206163746976650000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204e4654730000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f41646472657373206e6f742077686974656c6973746564000000000000000000600082015250565b7f4164647265737320616c72656164792075736564000000000000000000000000600082015250565b7f4d61696e2073616c65206e6f7420616374697665000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f742076616c696420616d6f756e7400000000000000000000000000000000600082015250565b7f4e6f74207a65726f2062616c616e636500000000000000000000000000000000600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b614faf816146af565b8114614fba57600080fd5b50565b614fc6816146c1565b8114614fd157600080fd5b50565b614fdd816146cd565b8114614fe857600080fd5b50565b614ff4816146d7565b8114614fff57600080fd5b50565b61500b81614723565b811461501657600080fd5b5056fea2646970667358221220168c3fd9fb60eab9fa9625c44524e1f82b22887c495c4ddfc8e394f00c846fae64736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000a00000000000000000000000002a6d98b4e2b2111af25365b79a17f4ad0aa8817b0000000000000000000000000fb3d3d206a195a561e2af8b77d1eb1dfd325b9d0000000000000000000000003c7ba700cf77b6a14be9b78993b9afb18647ff3be5c951f74bc89efa166514ac99d872f6b7a3c11aff63f51246c3742dfa925c9b0000000000000000000000000000000000000000000000000000000000000042697066733a2f2f62616679626569687a766c6562766b796f3274366164716f6a6e626c6e3735766e65646a6c6837667733626d6379667a747466646b6c36706b6f71000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061023a5760003560e01c806370a082311161012e578063b88d4fde116100ab578063cafa8dfe1161006f578063cafa8dfe1461084a578063d5abeb0114610875578063db4bec44146108a0578063e985e9c5146108dd578063f2fde38b1461091a5761023a565b8063b88d4fde14610767578063bfc1773314610790578063c6682862146107b9578063c87b56dd146107e4578063ca05588a146108215761023a565b80638def4a28116100f25780638def4a28146106a157806395364a84146106cc57806395d89b41146106f7578063a0712d6814610722578063a22cb4651461073e5761023a565b806370a08231146105ce578063715018a61461060b5780637501f741146106225780637cb647591461064d5780638da5cb5b146106765761023a565b80632a55205a116101bc57806343901f5b1161018057806343901f5b146104d55780634f6ccce71461050057806355f804b31461053d5780636352211e146105665780636c0360eb146105a35761023a565b80632a55205a146103fc5780632eb4a7ab1461043a5780632f745c59146104655780633ccfd60b146104a257806342842e0e146104ac5761023a565b8063095ea7b311610203578063095ea7b31461033a5780630c0a6b5e1461036357806318160ddd1461037f57806321860a05146103aa57806323b872dd146103d35761023a565b80620e7fa81461023f578063010eac6a1461026a57806301ffc9a71461029557806306fdde03146102d2578063081812fc146102fd575b600080fd5b34801561024b57600080fd5b50610254610943565b604051610261919061447a565b60405180910390f35b34801561027657600080fd5b5061027f610949565b60405161028c919061447a565b60405180910390f35b3480156102a157600080fd5b506102bc60048036038101906102b7919061393e565b61094f565b6040516102c991906140e2565b60405180910390f35b3480156102de57600080fd5b506102e7610961565b6040516102f49190614118565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f91906139d1565b6109f3565b6040516103319190614052565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c91906138b0565b610a78565b005b61037d600480360381019061037891906139fa565b610b90565b005b34801561038b57600080fd5b50610394610ecd565b6040516103a1919061447a565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc9190613745565b610eda565b005b3480156103df57600080fd5b506103fa60048036038101906103f591906137aa565b610fd0565b005b34801561040857600080fd5b50610423600480360381019061041e9190613a52565b611030565b6040516104319291906140b9565b60405180910390f35b34801561044657600080fd5b5061044f61121b565b60405161045c91906140fd565b60405180910390f35b34801561047157600080fd5b5061048c600480360381019061048791906138b0565b611221565b604051610499919061447a565b60405180910390f35b6104aa6112c6565b005b3480156104b857600080fd5b506104d360048036038101906104ce91906137aa565b611420565b005b3480156104e157600080fd5b506104ea611440565b6040516104f79190614052565b60405180910390f35b34801561050c57600080fd5b50610527600480360381019061052291906139d1565b611466565b604051610534919061447a565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f9190613990565b6114fd565b005b34801561057257600080fd5b5061058d600480360381019061058891906139d1565b611593565b60405161059a9190614052565b60405180910390f35b3480156105af57600080fd5b506105b8611645565b6040516105c59190614118565b60405180910390f35b3480156105da57600080fd5b506105f560048036038101906105f09190613745565b6116d3565b604051610602919061447a565b60405180910390f35b34801561061757600080fd5b5061062061178b565b005b34801561062e57600080fd5b50610637611813565b604051610644919061447a565b60405180910390f35b34801561065957600080fd5b50610674600480360381019061066f9190613915565b611818565b005b34801561068257600080fd5b5061068b61189e565b6040516106989190614052565b60405180910390f35b3480156106ad57600080fd5b506106b66118c8565b6040516106c39190614052565b60405180910390f35b3480156106d857600080fd5b506106e16118ee565b6040516106ee91906140e2565b60405180910390f35b34801561070357600080fd5b5061070c611901565b6040516107199190614118565b60405180910390f35b61073c600480360381019061073791906139d1565b611993565b005b34801561074a57600080fd5b5061076560048036038101906107609190613874565b611b1c565b005b34801561077357600080fd5b5061078e600480360381019061078991906137f9565b611b32565b005b34801561079c57600080fd5b506107b760048036038101906107b291906138ec565b611b94565b005b3480156107c557600080fd5b506107ce611c70565b6040516107db9190614118565b60405180910390f35b3480156107f057600080fd5b5061080b600480360381019061080691906139d1565b611cfe565b6040516108189190614118565b60405180910390f35b34801561082d57600080fd5b5061084860048036038101906108439190613a52565b611d89565b005b34801561085657600080fd5b5061085f611e17565b60405161086c9190614495565b60405180910390f35b34801561088157600080fd5b5061088a611e1c565b604051610897919061447a565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c29190613745565b611e22565b6040516108d491906140e2565b60405180910390f35b3480156108e957600080fd5b5061090460048036038101906108ff919061376e565b611e42565b60405161091191906140e2565b60405180910390f35b34801561092657600080fd5b50610941600480360381019061093c9190613745565b611ed6565b005b60105481565b60115481565b600061095a82611fce565b9050919050565b60606002805461097090614787565b80601f016020809104026020016040519081016040528092919081815260200182805461099c90614787565b80156109e95780601f106109be576101008083540402835291602001916109e9565b820191906000526020600020905b8154815290600101906020018083116109cc57829003601f168201915b5050505050905090565b60006109fe82611fe0565b610a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a349061433a565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a8382611593565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aeb906143da565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b1361204c565b73ffffffffffffffffffffffffffffffffffffffff161480610b425750610b4181610b3c61204c565b611e42565b5b610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b789061427a565b60405180910390fd5b610b8b8383612054565b505050565b601260009054906101000a900460ff16610bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd69061423a565b60405180910390fd5b600083118015610bf0575060058311155b610c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c269061443a565b60405180910390fd5b82601054610c3d9190614621565b341015610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c769061431a565b60405180910390fd5b6115b383610c8d600d61210d565b610c97919061459a565b1115610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf906142da565b60405180910390fd5b60136000610ce461204c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d639061439a565b60405180910390fd5b6000610d7661204c565b604051602001610d869190613fe6565b604051602081830303815290604052805190602001209050610dec838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506014548361211b565b610e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e229061437a565b60405180910390fd5b600160136000610e3961204c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b84811015610ec657610e9f600d612132565b610eb9610eaa61204c565b610eb4600d61210d565b612148565b8080600101915050610e8d565b5050505050565b6000600a80549050905090565b610ee261204c565b73ffffffffffffffffffffffffffffffffffffffff16610f0061189e565b73ffffffffffffffffffffffffffffffffffffffff1614610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d9061435a565b60405180910390fd5b6115b36001610f65600d61210d565b610f6f919061459a565b1115610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa7906142da565b60405180910390fd5b610fba600d612132565b610fcd81610fc8600d61210d565b612148565b50565b610fe1610fdb61204c565b82612166565b611020576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611017906143fa565b60405180910390fd5b61102b838383612244565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156111c65760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006111d06124ab565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866111fc9190614621565b61120691906145f0565b90508160000151819350935050509250929050565b60145481565b600061122c836116d3565b821061126d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112649061415a565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6112ce61204c565b73ffffffffffffffffffffffffffffffffffffffff166112ec61189e565b73ffffffffffffffffffffffffffffffffffffffff1614611342576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113399061435a565b60405180910390fd5b6000601260009054906101000a900460ff1661138057601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166113a4565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b905060008173ffffffffffffffffffffffffffffffffffffffff16476040516113cc9061403d565b60006040518083038185875af1925050503d8060008114611409576040519150601f19603f3d011682016040523d82523d6000602084013e61140e565b606091505b505090508061141c57600080fd5b5050565b61143b83838360405180602001604052806000815250611b32565b505050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611470610ecd565b82106114b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a89061441a565b60405180910390fd5b600a82815481106114eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b61150561204c565b73ffffffffffffffffffffffffffffffffffffffff1661152361189e565b73ffffffffffffffffffffffffffffffffffffffff1614611579576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115709061435a565b60405180910390fd5b80600e908051906020019061158f92919061350a565b5050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561163c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611633906142ba565b60405180910390fd5b80915050919050565b600e805461165290614787565b80601f016020809104026020016040519081016040528092919081815260200182805461167e90614787565b80156116cb5780601f106116a0576101008083540402835291602001916116cb565b820191906000526020600020905b8154815290600101906020018083116116ae57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173b9061429a565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61179361204c565b73ffffffffffffffffffffffffffffffffffffffff166117b161189e565b73ffffffffffffffffffffffffffffffffffffffff1614611807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fe9061435a565b60405180910390fd5b61181160006124b5565b565b600581565b61182061204c565b73ffffffffffffffffffffffffffffffffffffffff1661183e61189e565b73ffffffffffffffffffffffffffffffffffffffff1614611894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188b9061435a565b60405180910390fd5b8060148190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260009054906101000a900460ff1681565b60606003805461191090614787565b80601f016020809104026020016040519081016040528092919081815260200182805461193c90614787565b80156119895780601f1061195e57610100808354040283529160200191611989565b820191906000526020600020905b81548152906001019060200180831161196c57829003601f168201915b5050505050905090565b601260009054906101000a900460ff16156119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da906143ba565b60405180910390fd5b6000811180156119f4575060058111155b611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a9061443a565b60405180910390fd5b80601154611a419190614621565b341015611a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7a9061431a565b60405180910390fd5b6115b381611a91600d61210d565b611a9b919061459a565b1115611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad3906142da565b60405180910390fd5b60005b81811015611b1857611af1600d612132565b611b0b611afc61204c565b611b06600d61210d565b612148565b8080600101915050611adf565b5050565b611b2e611b2761204c565b838361257b565b5050565b611b43611b3d61204c565b83612166565b611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b79906143fa565b60405180910390fd5b611b8e848484846126e8565b50505050565b611b9c61204c565b73ffffffffffffffffffffffffffffffffffffffff16611bba61189e565b73ffffffffffffffffffffffffffffffffffffffff1614611c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c079061435a565b60405180910390fd5b60004714611c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4a9061445a565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b600f8054611c7d90614787565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca990614787565b8015611cf65780601f10611ccb57610100808354040283529160200191611cf6565b820191906000526020600020905b815481529060010190602001808311611cd957829003601f168201915b505050505081565b6060611d0982611fe0565b611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f9061413a565b60405180910390fd5b6000611d52612744565b905080611d5e846127d6565b600f604051602001611d7293929190614001565b604051602081830303815290604052915050919050565b611d9161204c565b73ffffffffffffffffffffffffffffffffffffffff16611daf61189e565b73ffffffffffffffffffffffffffffffffffffffff1614611e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfc9061435a565b60405180910390fd5b81601081905550806011819055505050565b600a81565b6115b381565b60136020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ede61204c565b73ffffffffffffffffffffffffffffffffffffffff16611efc61189e565b73ffffffffffffffffffffffffffffffffffffffff1614611f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f499061435a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb99061419a565b60405180910390fd5b611fcb816124b5565b50565b6000611fd982612983565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120c783611593565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60008261212885846129fd565b1490509392505050565b6001816000016000828254019250508190555050565b612162828260405180602001604052806000815250612a98565b5050565b600061217182611fe0565b6121b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a79061425a565b60405180910390fd5b60006121bb83611593565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121fd57506121fc8185611e42565b5b8061223b57508373ffffffffffffffffffffffffffffffffffffffff16612223846109f3565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661226482611593565b73ffffffffffffffffffffffffffffffffffffffff16146122ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b1906141ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561232a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612321906141fa565b60405180910390fd5b612335838383612af3565b612340600082612054565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612390919061467b565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123e7919061459a565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124a6838383612b03565b505050565b6000612710905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e19061421a565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126db91906140e2565b60405180910390a3505050565b6126f3848484612244565b6126ff84848484612b08565b61273e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127359061417a565b60405180910390fd5b50505050565b6060600e805461275390614787565b80601f016020809104026020016040519081016040528092919081815260200182805461277f90614787565b80156127cc5780601f106127a1576101008083540402835291602001916127cc565b820191906000526020600020905b8154815290600101906020018083116127af57829003601f168201915b5050505050905090565b6060600082141561281e576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061297e565b600082905060005b60008214612850578080612839906147ea565b915050600a8261284991906145f0565b9150612826565b60008167ffffffffffffffff811115612892577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128c45781602001600182028036833780820191505090505b5090505b60008514612977576001826128dd919061467b565b9150600a856128ec9190614857565b60306128f8919061459a565b60f81b818381518110612934577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561297091906145f0565b94506128c8565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129f657506129f582612c9f565b5b9050919050565b60008082905060005b8451811015612a8d576000858281518110612a4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311612a6c57612a658382612d81565b9250612a79565b612a768184612d81565b92505b508080612a85906147ea565b915050612a06565b508091505092915050565b612aa28383612d98565b612aaf6000848484612b08565b612aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae59061417a565b60405180910390fd5b505050565b612afe838383612f72565b505050565b505050565b6000612b298473ffffffffffffffffffffffffffffffffffffffff16613086565b15612c92578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b5261204c565b8786866040518563ffffffff1660e01b8152600401612b74949392919061406d565b602060405180830381600087803b158015612b8e57600080fd5b505af1925050508015612bbf57506040513d601f19601f82011682018060405250810190612bbc9190613967565b60015b612c42573d8060008114612bef576040519150601f19603f3d011682016040523d82523d6000602084013e612bf4565b606091505b50600081511415612c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c319061417a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c97565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d6a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d7a5750612d79826130a9565b5b9050919050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dff906142fa565b60405180910390fd5b612e1181611fe0565b15612e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e48906141da565b60405180910390fd5b612e5d60008383612af3565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ead919061459a565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f6e60008383612b03565b5050565b612f7d838383613123565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fc057612fbb81613128565b612fff565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612ffe57612ffd8382613171565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130425761303d816132de565b613081565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130805761307f8282613421565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061311c575061311b826134a0565b5b9050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161317e846116d3565b613188919061467b565b905060006009600084815260200190815260200160002054905081811461326d576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a805490506132f2919061467b565b90506000600b60008481526020019081526020016000205490506000600a8381548110613348577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600a8381548110613390577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613405577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061342c836116d3565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b82805461351690614787565b90600052602060002090601f016020900481019282613538576000855561357f565b82601f1061355157805160ff191683800117855561357f565b8280016001018555821561357f579182015b8281111561357e578251825591602001919060010190613563565b5b50905061358c9190613590565b5090565b5b808211156135a9576000816000905550600101613591565b5090565b60006135c06135bb846144d5565b6144b0565b9050828152602081018484840111156135d857600080fd5b6135e3848285614745565b509392505050565b60006135fe6135f984614506565b6144b0565b90508281526020810184848401111561361657600080fd5b613621848285614745565b509392505050565b60008135905061363881614fa6565b92915050565b60008083601f84011261365057600080fd5b8235905067ffffffffffffffff81111561366957600080fd5b60208301915083602082028301111561368157600080fd5b9250929050565b60008135905061369781614fbd565b92915050565b6000813590506136ac81614fd4565b92915050565b6000813590506136c181614feb565b92915050565b6000815190506136d681614feb565b92915050565b600082601f8301126136ed57600080fd5b81356136fd8482602086016135ad565b91505092915050565b600082601f83011261371757600080fd5b81356137278482602086016135eb565b91505092915050565b60008135905061373f81615002565b92915050565b60006020828403121561375757600080fd5b600061376584828501613629565b91505092915050565b6000806040838503121561378157600080fd5b600061378f85828601613629565b92505060206137a085828601613629565b9150509250929050565b6000806000606084860312156137bf57600080fd5b60006137cd86828701613629565b93505060206137de86828701613629565b92505060406137ef86828701613730565b9150509250925092565b6000806000806080858703121561380f57600080fd5b600061381d87828801613629565b945050602061382e87828801613629565b935050604061383f87828801613730565b925050606085013567ffffffffffffffff81111561385c57600080fd5b613868878288016136dc565b91505092959194509250565b6000806040838503121561388757600080fd5b600061389585828601613629565b92505060206138a685828601613688565b9150509250929050565b600080604083850312156138c357600080fd5b60006138d185828601613629565b92505060206138e285828601613730565b9150509250929050565b6000602082840312156138fe57600080fd5b600061390c84828501613688565b91505092915050565b60006020828403121561392757600080fd5b60006139358482850161369d565b91505092915050565b60006020828403121561395057600080fd5b600061395e848285016136b2565b91505092915050565b60006020828403121561397957600080fd5b6000613987848285016136c7565b91505092915050565b6000602082840312156139a257600080fd5b600082013567ffffffffffffffff8111156139bc57600080fd5b6139c884828501613706565b91505092915050565b6000602082840312156139e357600080fd5b60006139f184828501613730565b91505092915050565b600080600060408486031215613a0f57600080fd5b6000613a1d86828701613730565b935050602084013567ffffffffffffffff811115613a3a57600080fd5b613a468682870161363e565b92509250509250925092565b60008060408385031215613a6557600080fd5b6000613a7385828601613730565b9250506020613a8485828601613730565b9150509250929050565b613a97816146af565b82525050565b613aae613aa9826146af565b614833565b82525050565b613abd816146c1565b82525050565b613acc816146cd565b82525050565b6000613add8261454c565b613ae78185614562565b9350613af7818560208601614754565b613b0081614944565b840191505092915050565b6000613b1682614557565b613b20818561457e565b9350613b30818560208601614754565b613b3981614944565b840191505092915050565b6000613b4f82614557565b613b59818561458f565b9350613b69818560208601614754565b80840191505092915050565b60008154613b8281614787565b613b8c818661458f565b94506001821660008114613ba75760018114613bb857613beb565b60ff19831686528186019350613beb565b613bc185614537565b60005b83811015613be357815481890152600182019150602081019050613bc4565b838801955050505b50505092915050565b6000613c0160168361457e565b9150613c0c82614962565b602082019050919050565b6000613c24602b8361457e565b9150613c2f8261498b565b604082019050919050565b6000613c4760328361457e565b9150613c52826149da565b604082019050919050565b6000613c6a60268361457e565b9150613c7582614a29565b604082019050919050565b6000613c8d60258361457e565b9150613c9882614a78565b604082019050919050565b6000613cb0601c8361457e565b9150613cbb82614ac7565b602082019050919050565b6000613cd360248361457e565b9150613cde82614af0565b604082019050919050565b6000613cf660198361457e565b9150613d0182614b3f565b602082019050919050565b6000613d1960128361457e565b9150613d2482614b68565b602082019050919050565b6000613d3c602c8361457e565b9150613d4782614b91565b604082019050919050565b6000613d5f60388361457e565b9150613d6a82614be0565b604082019050919050565b6000613d82602a8361457e565b9150613d8d82614c2f565b604082019050919050565b6000613da560298361457e565b9150613db082614c7e565b604082019050919050565b6000613dc8600f8361457e565b9150613dd382614ccd565b602082019050919050565b6000613deb60208361457e565b9150613df682614cf6565b602082019050919050565b6000613e0e600e8361457e565b9150613e1982614d1f565b602082019050919050565b6000613e31602c8361457e565b9150613e3c82614d48565b604082019050919050565b6000613e5460208361457e565b9150613e5f82614d97565b602082019050919050565b6000613e7760178361457e565b9150613e8282614dc0565b602082019050919050565b6000613e9a60148361457e565b9150613ea582614de9565b602082019050919050565b6000613ebd60148361457e565b9150613ec882614e12565b602082019050919050565b6000613ee060218361457e565b9150613eeb82614e3b565b604082019050919050565b6000613f03600083614573565b9150613f0e82614e8a565b600082019050919050565b6000613f2660318361457e565b9150613f3182614e8d565b604082019050919050565b6000613f49602c8361457e565b9150613f5482614edc565b604082019050919050565b6000613f6c60108361457e565b9150613f7782614f2b565b602082019050919050565b6000613f8f60108361457e565b9150613f9a82614f54565b602082019050919050565b6000613fb260018361458f565b9150613fbd82614f7d565b600182019050919050565b613fd181614723565b82525050565b613fe08161472d565b82525050565b6000613ff28284613a9d565b60148201915081905092915050565b600061400d8286613b44565b915061401882613fa5565b91506140248285613b44565b91506140308284613b75565b9150819050949350505050565b600061404882613ef6565b9150819050919050565b60006020820190506140676000830184613a8e565b92915050565b60006080820190506140826000830187613a8e565b61408f6020830186613a8e565b61409c6040830185613fc8565b81810360608301526140ae8184613ad2565b905095945050505050565b60006040820190506140ce6000830185613a8e565b6140db6020830184613fc8565b9392505050565b60006020820190506140f76000830184613ab4565b92915050565b60006020820190506141126000830184613ac3565b92915050565b600060208201905081810360008301526141328184613b0b565b905092915050565b6000602082019050818103600083015261415381613bf4565b9050919050565b6000602082019050818103600083015261417381613c17565b9050919050565b6000602082019050818103600083015261419381613c3a565b9050919050565b600060208201905081810360008301526141b381613c5d565b9050919050565b600060208201905081810360008301526141d381613c80565b9050919050565b600060208201905081810360008301526141f381613ca3565b9050919050565b6000602082019050818103600083015261421381613cc6565b9050919050565b6000602082019050818103600083015261423381613ce9565b9050919050565b6000602082019050818103600083015261425381613d0c565b9050919050565b6000602082019050818103600083015261427381613d2f565b9050919050565b6000602082019050818103600083015261429381613d52565b9050919050565b600060208201905081810360008301526142b381613d75565b9050919050565b600060208201905081810360008301526142d381613d98565b9050919050565b600060208201905081810360008301526142f381613dbb565b9050919050565b6000602082019050818103600083015261431381613dde565b9050919050565b6000602082019050818103600083015261433381613e01565b9050919050565b6000602082019050818103600083015261435381613e24565b9050919050565b6000602082019050818103600083015261437381613e47565b9050919050565b6000602082019050818103600083015261439381613e6a565b9050919050565b600060208201905081810360008301526143b381613e8d565b9050919050565b600060208201905081810360008301526143d381613eb0565b9050919050565b600060208201905081810360008301526143f381613ed3565b9050919050565b6000602082019050818103600083015261441381613f19565b9050919050565b6000602082019050818103600083015261443381613f3c565b9050919050565b6000602082019050818103600083015261445381613f5f565b9050919050565b6000602082019050818103600083015261447381613f82565b9050919050565b600060208201905061448f6000830184613fc8565b92915050565b60006020820190506144aa6000830184613fd7565b92915050565b60006144ba6144cb565b90506144c682826147b9565b919050565b6000604051905090565b600067ffffffffffffffff8211156144f0576144ef614915565b5b6144f982614944565b9050602081019050919050565b600067ffffffffffffffff82111561452157614520614915565b5b61452a82614944565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006145a582614723565b91506145b083614723565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145e5576145e4614888565b5b828201905092915050565b60006145fb82614723565b915061460683614723565b925082614616576146156148b7565b5b828204905092915050565b600061462c82614723565b915061463783614723565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146705761466f614888565b5b828202905092915050565b600061468682614723565b915061469183614723565b9250828210156146a4576146a3614888565b5b828203905092915050565b60006146ba82614703565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614772578082015181840152602081019050614757565b83811115614781576000848401525b50505050565b6000600282049050600182168061479f57607f821691505b602082108114156147b3576147b26148e6565b5b50919050565b6147c282614944565b810181811067ffffffffffffffff821117156147e1576147e0614915565b5b80604052505050565b60006147f582614723565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561482857614827614888565b5b600182019050919050565b600061483e82614845565b9050919050565b600061485082614955565b9050919050565b600061486282614723565b915061486d83614723565b92508261487d5761487c6148b7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f546f6b656e20494420646f65736e277420657869737400000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f50726573616c65206e6f74206163746976650000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204e4654730000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f41646472657373206e6f742077686974656c6973746564000000000000000000600082015250565b7f4164647265737320616c72656164792075736564000000000000000000000000600082015250565b7f4d61696e2073616c65206e6f7420616374697665000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f742076616c696420616d6f756e7400000000000000000000000000000000600082015250565b7f4e6f74207a65726f2062616c616e636500000000000000000000000000000000600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b614faf816146af565b8114614fba57600080fd5b50565b614fc6816146c1565b8114614fd157600080fd5b50565b614fdd816146cd565b8114614fe857600080fd5b50565b614ff4816146d7565b8114614fff57600080fd5b50565b61500b81614723565b811461501657600080fd5b5056fea2646970667358221220168c3fd9fb60eab9fa9625c44524e1f82b22887c495c4ddfc8e394f00c846fae64736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000002a6d98b4e2b2111af25365b79a17f4ad0aa8817b0000000000000000000000000fb3d3d206a195a561e2af8b77d1eb1dfd325b9d0000000000000000000000003c7ba700cf77b6a14be9b78993b9afb18647ff3be5c951f74bc89efa166514ac99d872f6b7a3c11aff63f51246c3742dfa925c9b0000000000000000000000000000000000000000000000000000000000000042697066733a2f2f62616679626569687a766c6562766b796f3274366164716f6a6e626c6e3735766e65646a6c6837667733626d6379667a747466646b6c36706b6f71000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI_ (string): ipfs://bafybeihzvlebvkyo2t6adqojnbln75vnedjlh7fw3bmcyfzttfdkl6pkoq
Arg [1] : royaltiesReceiver (address): 0x2A6d98B4E2B2111AF25365B79a17F4Ad0aA8817b
Arg [2] : presaleFundsReceiver_ (address): 0x0fb3D3D206A195A561E2Af8b77d1Eb1dFD325b9D
Arg [3] : mainsaleFundsReceiver_ (address): 0x3C7ba700Cf77B6a14Be9B78993B9Afb18647FF3b
Arg [4] : merkleRoot_ (bytes32): 0xe5c951f74bc89efa166514ac99d872f6b7a3c11aff63f51246c3742dfa925c9b

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 0000000000000000000000002a6d98b4e2b2111af25365b79a17f4ad0aa8817b
Arg [2] : 0000000000000000000000000fb3d3d206a195a561e2af8b77d1eb1dfd325b9d
Arg [3] : 0000000000000000000000003c7ba700cf77b6a14be9b78993b9afb18647ff3b
Arg [4] : e5c951f74bc89efa166514ac99d872f6b7a3c11aff63f51246c3742dfa925c9b
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000042
Arg [6] : 697066733a2f2f62616679626569687a766c6562766b796f3274366164716f6a
Arg [7] : 6e626c6e3735766e65646a6c6837667733626d6379667a747466646b6c36706b
Arg [8] : 6f71000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

56959:5217:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57377:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57424:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61731:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22703:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24263:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23786:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58955:966;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37612:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60479:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25013:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45682:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;57566:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37280:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61300:268;;;:::i;:::-;;25423:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57642:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37802:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61190:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22397:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57156:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22127:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51452:103;;;;;;;;;;;;;:::i;:::-;;57277:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60875:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50801:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57600:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57474:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22872:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58366:581;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24556:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25679:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60704:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57184:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59929:510;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60987:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57321:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57230:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57511:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24782:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51710:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57377:40;;;;:::o;57424:41::-;;;;:::o;61731:219::-;61877:4;61906:36;61930:11;61906:23;:36::i;:::-;61899:43;;61731:219;;;:::o;22703:100::-;22757:13;22790:5;22783:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22703:100;:::o;24263:221::-;24339:7;24367:16;24375:7;24367;:16::i;:::-;24359:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24452:15;:24;24468:7;24452:24;;;;;;;;;;;;;;;;;;;;;24445:31;;24263:221;;;:::o;23786:411::-;23867:13;23883:23;23898:7;23883:14;:23::i;:::-;23867:39;;23931:5;23925:11;;:2;:11;;;;23917:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24025:5;24009:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24034:37;24051:5;24058:12;:10;:12::i;:::-;24034:16;:37::i;:::-;24009:62;23987:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24168:21;24177:2;24181:7;24168:8;:21::i;:::-;23786:411;;;:::o;58955:966::-;59081:9;;;;;;;;;;;59073:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;59141:1;59132:6;:10;:31;;;;;57311:1;59146:6;:17;;59132:31;59124:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;59231:6;59216:12;;:21;;;;:::i;:::-;59203:9;:34;;59195:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;57266:4;59314:6;59289:22;:12;:20;:22::i;:::-;:31;;;;:::i;:::-;:44;;59267:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;59396:16;:30;59413:12;:10;:12::i;:::-;59396:30;;;;;;;;;;;;;;;;;;;;;;;;;59395:31;59387:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;59464:12;59506;:10;:12::i;:::-;59489:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;59479:41;;;;;;59464:56;;59553:49;59572:11;;59553:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59585:10;;59597:4;59553:18;:49::i;:::-;59531:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;59699:4;59666:16;:30;59683:12;:10;:12::i;:::-;59666:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;59746:9;59741:162;59765:6;59761:1;:10;59741:162;;;59797:24;:12;:22;:24::i;:::-;59840:47;59850:12;:10;:12::i;:::-;59864:22;:12;:20;:22::i;:::-;59840:9;:47::i;:::-;59773:3;;;;;;;59741:162;;;;58955:966;;;;:::o;37612:113::-;37673:7;37700:10;:17;;;;37693:24;;37612:113;:::o;60479:217::-;51032:12;:10;:12::i;:::-;51021:23;;:7;:5;:7::i;:::-;:23;;;51013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57266:4:::1;60569:1;60544:22;:12;:20;:22::i;:::-;:26;;;;:::i;:::-;:39;;60536:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;60616:24;:12;:22;:24::i;:::-;60651:37;60661:2;60665:22;:12;:20;:22::i;:::-;60651:9;:37::i;:::-;60479:217:::0;:::o;25013:339::-;25208:41;25227:12;:10;:12::i;:::-;25241:7;25208:18;:41::i;:::-;25200:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25316:28;25326:4;25332:2;25336:7;25316:9;:28::i;:::-;25013:339;;;:::o;45682:442::-;45779:7;45788;45808:26;45837:17;:27;45855:8;45837:27;;;;;;;;;;;45808:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45909:1;45881:30;;:7;:16;;;:30;;;45877:92;;;45938:19;45928:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45877:92;45981:21;46046:17;:15;:17::i;:::-;46005:58;;46019:7;:23;;;46006:36;;:10;:36;;;;:::i;:::-;46005:58;;;;:::i;:::-;45981:82;;46084:7;:16;;;46102:13;46076:40;;;;;;45682:442;;;;;:::o;57566:25::-;;;;:::o;37280:256::-;37377:7;37413:23;37430:5;37413:16;:23::i;:::-;37405:5;:31;37397:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37502:12;:19;37515:5;37502:19;;;;;;;;;;;;;;;:26;37522:5;37502:26;;;;;;;;;;;;37495:33;;37280:256;;;;:::o;61300:268::-;51032:12;:10;:12::i;:::-;51021:23;;:7;:5;:7::i;:::-;:23;;;51013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61356:16:::1;61375:9;;;;;;;;;;;:82;;61436:21;;;;;;;;;;;61375:82;;;61400:20;;;;;;;;;;;61375:82;61356:101;;61469:7;61490:8;61482:22;;61512:21;61482:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61468:70;;;61557:2;61549:11;;;::::0;::::1;;51092:1;;61300:268::o:0;25423:185::-;25561:39;25578:4;25584:2;25588:7;25561:39;;;;;;;;;;;;:16;:39::i;:::-;25423:185;;;:::o;57642:36::-;;;;;;;;;;;;;:::o;37802:233::-;37877:7;37913:30;:28;:30::i;:::-;37905:5;:38;37897:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38010:10;38021:5;38010:17;;;;;;;;;;;;;;;;;;;;;;;;38003:24;;37802:233;;;:::o;61190:102::-;51032:12;:10;:12::i;:::-;51021:23;;:7;:5;:7::i;:::-;:23;;;51013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61274:10:::1;61264:7;:20;;;;;;;;;;;;:::i;:::-;;61190:102:::0;:::o;22397:239::-;22469:7;22489:13;22505:7;:16;22513:7;22505:16;;;;;;;;;;;;;;;;;;;;;22489:32;;22557:1;22540:19;;:5;:19;;;;22532:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22623:5;22616:12;;;22397:239;;;:::o;57156:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22127:208::-;22199:7;22244:1;22227:19;;:5;:19;;;;22219:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22311:9;:16;22321:5;22311:16;;;;;;;;;;;;;;;;22304:23;;22127:208;;;:::o;51452:103::-;51032:12;:10;:12::i;:::-;51021:23;;:7;:5;:7::i;:::-;:23;;;51013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51517:30:::1;51544:1;51517:18;:30::i;:::-;51452:103::o:0;57277:35::-;57311:1;57277:35;:::o;60875:104::-;51032:12;:10;:12::i;:::-;51021:23;;:7;:5;:7::i;:::-;:23;;;51013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60960:11:::1;60947:10;:24;;;;60875:104:::0;:::o;50801:87::-;50847:7;50874:6;;;;;;;;;;;50867:13;;50801:87;:::o;57600:35::-;;;;;;;;;;;;;:::o;57474:28::-;;;;;;;;;;;;;:::o;22872:104::-;22928:13;22961:7;22954:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22872:104;:::o;58366:581::-;58431:9;;;;;;;;;;;58430:10;58422:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;58493:1;58484:6;:10;:31;;;;;57311:1;58498:6;:17;;58484:31;58476:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;58584:6;58568:13;;:22;;;;:::i;:::-;58555:9;:35;;58547:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;57266:4;58667:6;58642:22;:12;:20;:22::i;:::-;:31;;;;:::i;:::-;:44;;58620:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;58772:9;58767:162;58791:6;58787:1;:10;58767:162;;;58823:24;:12;:22;:24::i;:::-;58866:47;58876:12;:10;:12::i;:::-;58890:22;:12;:20;:22::i;:::-;58866:9;:47::i;:::-;58799:3;;;;;;;58767:162;;;;58366:581;:::o;24556:155::-;24651:52;24670:12;:10;:12::i;:::-;24684:8;24694;24651:18;:52::i;:::-;24556:155;;:::o;25679:328::-;25854:41;25873:12;:10;:12::i;:::-;25887:7;25854:18;:41::i;:::-;25846:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25960:39;25974:4;25980:2;25984:7;25993:5;25960:13;:39::i;:::-;25679:328;;;;:::o;60704:163::-;51032:12;:10;:12::i;:::-;51021:23;;:7;:5;:7::i;:::-;:23;;;51013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60804:1:::1;60779:21;:26;60771:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;60849:10;60837:9;;:22;;;;;;;;;;;;;;;;;;60704:163:::0;:::o;57184:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59929:510::-;60047:13;60086:16;60094:7;60086;:16::i;:::-;60078:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;60142:28;60173:10;:8;:10::i;:::-;60142:41;;60280:14;60343:18;:7;:16;:18::i;:::-;60384:13;60241:175;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60196:235;;;59929:510;;;:::o;60987:195::-;51032:12;:10;:12::i;:::-;51021:23;;:7;:5;:7::i;:::-;:23;;;51013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61120:13:::1;61105:12;:28;;;;61160:14;61144:13;:30;;;;60987:195:::0;;:::o;57321:47::-;57366:2;57321:47;:::o;57230:40::-;57266:4;57230:40;:::o;57511:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;24782:164::-;24879:4;24903:18;:25;24922:5;24903:25;;;;;;;;;;;;;;;:35;24929:8;24903:35;;;;;;;;;;;;;;;;;;;;;;;;;24896:42;;24782:164;;;;:::o;51710:201::-;51032:12;:10;:12::i;:::-;51021:23;;:7;:5;:7::i;:::-;:23;;;51013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51819:1:::1;51799:22;;:8;:22;;;;51791:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51875:28;51894:8;51875:18;:28::i;:::-;51710:201:::0;:::o;49291:170::-;49393:4;49417:36;49441:11;49417:23;:36::i;:::-;49410:43;;49291:170;;;:::o;27517:127::-;27582:4;27634:1;27606:30;;:7;:16;27614:7;27606:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27599:37;;27517:127;;;:::o;16970:98::-;17023:7;17050:10;17043:17;;16970:98;:::o;31663:174::-;31765:2;31738:15;:24;31754:7;31738:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31821:7;31817:2;31783:46;;31792:23;31807:7;31792:14;:23::i;:::-;31783:46;;;;;;;;;;;;31663:174;;:::o;55838:114::-;55903:7;55930;:14;;;55923:21;;55838:114;;;:::o;53495:190::-;53620:4;53673;53644:25;53657:5;53664:4;53644:12;:25::i;:::-;:33;53637:40;;53495:190;;;;;:::o;55960:127::-;56067:1;56049:7;:14;;;:19;;;;;;;;;;;55960:127;:::o;28501:110::-;28577:26;28587:2;28591:7;28577:26;;;;;;;;;;;;:9;:26::i;:::-;28501:110;;:::o;27811:348::-;27904:4;27929:16;27937:7;27929;:16::i;:::-;27921:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28005:13;28021:23;28036:7;28021:14;:23::i;:::-;28005:39;;28074:5;28063:16;;:7;:16;;;:52;;;;28083:32;28100:5;28107:7;28083:16;:32::i;:::-;28063:52;:87;;;;28143:7;28119:31;;:20;28131:7;28119:11;:20::i;:::-;:31;;;28063:87;28055:96;;;27811:348;;;;:::o;30920:625::-;31079:4;31052:31;;:23;31067:7;31052:14;:23::i;:::-;:31;;;31044:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31158:1;31144:16;;:2;:16;;;;31136:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31214:39;31235:4;31241:2;31245:7;31214:20;:39::i;:::-;31318:29;31335:1;31339:7;31318:8;:29::i;:::-;31379:1;31360:9;:15;31370:4;31360:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31408:1;31391:9;:13;31401:2;31391:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31439:2;31420:7;:16;31428:7;31420:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31478:7;31474:2;31459:27;;31468:4;31459:27;;;;;;;;;;;;31499:38;31519:4;31525:2;31529:7;31499:19;:38::i;:::-;30920:625;;;:::o;46406:97::-;46464:6;46490:5;46483:12;;46406:97;:::o;52071:191::-;52145:16;52164:6;;;;;;;;;;;52145:25;;52190:8;52181:6;;:17;;;;;;;;;;;;;;;;;;52245:8;52214:40;;52235:8;52214:40;;;;;;;;;;;;52071:191;;:::o;31979:315::-;32134:8;32125:17;;:5;:17;;;;32117:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32221:8;32183:18;:25;32202:5;32183:25;;;;;;;;;;;;;;;:35;32209:8;32183:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32267:8;32245:41;;32260:5;32245:41;;;32277:8;32245:41;;;;;;:::i;:::-;;;;;;;;31979:315;;;:::o;26889:::-;27046:28;27056:4;27062:2;27066:7;27046:9;:28::i;:::-;27093:48;27116:4;27122:2;27126:7;27135:5;27093:22;:48::i;:::-;27085:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26889:315;;;;:::o;58222:108::-;58282:13;58315:7;58308:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58222:108;:::o;17555:723::-;17611:13;17841:1;17832:5;:10;17828:53;;;17859:10;;;;;;;;;;;;;;;;;;;;;17828:53;17891:12;17906:5;17891:20;;17922:14;17947:78;17962:1;17954:4;:9;17947:78;;17980:8;;;;;:::i;:::-;;;;18011:2;18003:10;;;;;:::i;:::-;;;17947:78;;;18035:19;18067:6;18057:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18035:39;;18085:154;18101:1;18092:5;:10;18085:154;;18129:1;18119:11;;;;;:::i;:::-;;;18196:2;18188:5;:10;;;;:::i;:::-;18175:2;:24;;;;:::i;:::-;18162:39;;18145:6;18152;18145:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;18225:2;18216:11;;;;;:::i;:::-;;;18085:154;;;18263:6;18249:21;;;;;17555:723;;;;:::o;36972:224::-;37074:4;37113:35;37098:50;;;:11;:50;;;;:90;;;;37152:36;37176:11;37152:23;:36::i;:::-;37098:90;37091:97;;36972:224;;;:::o;54046:675::-;54129:7;54149:20;54172:4;54149:27;;54192:9;54187:497;54211:5;:12;54207:1;:16;54187:497;;;54245:20;54268:5;54274:1;54268:8;;;;;;;;;;;;;;;;;;;;;;54245:31;;54311:12;54295;:28;54291:382;;54438:42;54453:12;54467;54438:14;:42::i;:::-;54423:57;;54291:382;;;54615:42;54630:12;54644;54615:14;:42::i;:::-;54600:57;;54291:382;54187:497;54225:3;;;;;:::i;:::-;;;;54187:497;;;;54701:12;54694:19;;;54046:675;;;;:::o;28838:321::-;28968:18;28974:2;28978:7;28968:5;:18::i;:::-;29019:54;29050:1;29054:2;29058:7;29067:5;29019:22;:54::i;:::-;28997:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28838:321;;;:::o;61958:215::-;62120:45;62147:4;62153:2;62157:7;62120:26;:45::i;:::-;61958:215;;;:::o;34741:125::-;;;;:::o;32859:799::-;33014:4;33035:15;:2;:13;;;:15::i;:::-;33031:620;;;33087:2;33071:36;;;33108:12;:10;:12::i;:::-;33122:4;33128:7;33137:5;33071:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33067:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33330:1;33313:6;:13;:18;33309:272;;;33356:60;;;;;;;;;;:::i;:::-;;;;;;;;33309:272;33531:6;33525:13;33516:6;33512:2;33508:15;33501:38;33067:529;33204:41;;;33194:51;;;:6;:51;;;;33187:58;;;;;33031:620;33635:4;33628:11;;32859:799;;;;;;;:::o;21758:305::-;21860:4;21912:25;21897:40;;;:11;:40;;;;:105;;;;21969:33;21954:48;;;:11;:48;;;;21897:105;:158;;;;22019:36;22043:11;22019:23;:36::i;:::-;21897:158;21877:178;;21758:305;;;:::o;54729:224::-;54797:13;54860:1;54854:4;54847:15;54889:1;54883:4;54876:15;54930:4;54924;54914:21;54905:30;;54832:114;;;;:::o;29495:439::-;29589:1;29575:16;;:2;:16;;;;29567:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29648:16;29656:7;29648;:16::i;:::-;29647:17;29639:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29710:45;29739:1;29743:2;29747:7;29710:20;:45::i;:::-;29785:1;29768:9;:13;29778:2;29768:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29816:2;29797:7;:16;29805:7;29797:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29861:7;29857:2;29836:33;;29853:1;29836:33;;;;;;;;;;;;29882:44;29910:1;29914:2;29918:7;29882:19;:44::i;:::-;29495:439;;:::o;38648:589::-;38792:45;38819:4;38825:2;38829:7;38792:26;:45::i;:::-;38870:1;38854:18;;:4;:18;;;38850:187;;;38889:40;38921:7;38889:31;:40::i;:::-;38850:187;;;38959:2;38951:10;;:4;:10;;;38947:90;;38978:47;39011:4;39017:7;38978:32;:47::i;:::-;38947:90;38850:187;39065:1;39051:16;;:2;:16;;;39047:183;;;39084:45;39121:7;39084:36;:45::i;:::-;39047:183;;;39157:4;39151:10;;:2;:10;;;39147:83;;39178:40;39206:2;39210:7;39178:27;:40::i;:::-;39147:83;39047:183;38648:589;;;:::o;9015:326::-;9075:4;9332:1;9310:7;:19;;;:23;9303:30;;9015:326;;;:::o;45412:215::-;45514:4;45553:26;45538:41;;;:11;:41;;;;:81;;;;45583:36;45607:11;45583:23;:36::i;:::-;45538:81;45531:88;;45412:215;;;:::o;34230:126::-;;;;:::o;39960:164::-;40064:10;:17;;;;40037:15;:24;40053:7;40037:24;;;;;;;;;;;:44;;;;40092:10;40108:7;40092:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39960:164;:::o;40751:988::-;41017:22;41067:1;41042:22;41059:4;41042:16;:22::i;:::-;:26;;;;:::i;:::-;41017:51;;41079:18;41100:17;:26;41118:7;41100:26;;;;;;;;;;;;41079:47;;41247:14;41233:10;:28;41229:328;;41278:19;41300:12;:18;41313:4;41300:18;;;;;;;;;;;;;;;:34;41319:14;41300:34;;;;;;;;;;;;41278:56;;41384:11;41351:12;:18;41364:4;41351:18;;;;;;;;;;;;;;;:30;41370:10;41351:30;;;;;;;;;;;:44;;;;41501:10;41468:17;:30;41486:11;41468:30;;;;;;;;;;;:43;;;;41229:328;;41653:17;:26;41671:7;41653:26;;;;;;;;;;;41646:33;;;41697:12;:18;41710:4;41697:18;;;;;;;;;;;;;;;:34;41716:14;41697:34;;;;;;;;;;;41690:41;;;40751:988;;;;:::o;42034:1079::-;42287:22;42332:1;42312:10;:17;;;;:21;;;;:::i;:::-;42287:46;;42344:18;42365:15;:24;42381:7;42365:24;;;;;;;;;;;;42344:45;;42716:19;42738:10;42749:14;42738:26;;;;;;;;;;;;;;;;;;;;;;;;42716:48;;42802:11;42777:10;42788;42777:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;42913:10;42882:15;:28;42898:11;42882:28;;;;;;;;;;;:41;;;;43054:15;:24;43070:7;43054:24;;;;;;;;;;;43047:31;;;43089:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42034:1079;;;;:::o;39538:221::-;39623:14;39640:20;39657:2;39640:16;:20::i;:::-;39623:37;;39698:7;39671:12;:16;39684:2;39671:16;;;;;;;;;;;;;;;:24;39688:6;39671:24;;;;;;;;;;;:34;;;;39745:6;39716:17;:26;39734:7;39716:26;;;;;;;;;;;:35;;;;39538:221;;;:::o;20183:157::-;20268:4;20307:25;20292:40;;;:11;:40;;;;20285:47;;20183:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;942:8;952:6;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;1285:5;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:139::-;1427:5;1465:6;1452:20;1443:29;;1481:33;1508:5;1481:33;:::i;:::-;1433:87;;;;:::o;1526:137::-;1571:5;1609:6;1596:20;1587:29;;1625:32;1651:5;1625:32;:::i;:::-;1577:86;;;;:::o;1669:141::-;1725:5;1756:6;1750:13;1741:22;;1772:32;1798:5;1772:32;:::i;:::-;1731:79;;;;:::o;1829:271::-;1884:5;1933:3;1926:4;1918:6;1914:17;1910:27;1900:2;;1951:1;1948;1941:12;1900:2;1991:6;1978:20;2016:78;2090:3;2082:6;2075:4;2067:6;2063:17;2016:78;:::i;:::-;2007:87;;1890:210;;;;;:::o;2120:273::-;2176:5;2225:3;2218:4;2210:6;2206:17;2202:27;2192:2;;2243:1;2240;2233:12;2192:2;2283:6;2270:20;2308:79;2383:3;2375:6;2368:4;2360:6;2356:17;2308:79;:::i;:::-;2299:88;;2182:211;;;;;:::o;2399:139::-;2445:5;2483:6;2470:20;2461:29;;2499:33;2526:5;2499:33;:::i;:::-;2451:87;;;;:::o;2544:262::-;2603:6;2652:2;2640:9;2631:7;2627:23;2623:32;2620:2;;;2668:1;2665;2658:12;2620:2;2711:1;2736:53;2781:7;2772:6;2761:9;2757:22;2736:53;:::i;:::-;2726:63;;2682:117;2610:196;;;;:::o;2812:407::-;2880:6;2888;2937:2;2925:9;2916:7;2912:23;2908:32;2905:2;;;2953:1;2950;2943:12;2905:2;2996:1;3021:53;3066:7;3057:6;3046:9;3042:22;3021:53;:::i;:::-;3011:63;;2967:117;3123:2;3149:53;3194:7;3185:6;3174:9;3170:22;3149:53;:::i;:::-;3139:63;;3094:118;2895:324;;;;;:::o;3225:552::-;3302:6;3310;3318;3367:2;3355:9;3346:7;3342:23;3338:32;3335:2;;;3383:1;3380;3373:12;3335:2;3426:1;3451:53;3496:7;3487:6;3476:9;3472:22;3451:53;:::i;:::-;3441:63;;3397:117;3553:2;3579:53;3624:7;3615:6;3604:9;3600:22;3579:53;:::i;:::-;3569:63;;3524:118;3681:2;3707:53;3752:7;3743:6;3732:9;3728:22;3707:53;:::i;:::-;3697:63;;3652:118;3325:452;;;;;:::o;3783:809::-;3878:6;3886;3894;3902;3951:3;3939:9;3930:7;3926:23;3922:33;3919:2;;;3968:1;3965;3958:12;3919:2;4011:1;4036:53;4081:7;4072:6;4061:9;4057:22;4036:53;:::i;:::-;4026:63;;3982:117;4138:2;4164:53;4209:7;4200:6;4189:9;4185:22;4164:53;:::i;:::-;4154:63;;4109:118;4266:2;4292:53;4337:7;4328:6;4317:9;4313:22;4292:53;:::i;:::-;4282:63;;4237:118;4422:2;4411:9;4407:18;4394:32;4453:18;4445:6;4442:30;4439:2;;;4485:1;4482;4475:12;4439:2;4513:62;4567:7;4558:6;4547:9;4543:22;4513:62;:::i;:::-;4503:72;;4365:220;3909:683;;;;;;;:::o;4598:401::-;4663:6;4671;4720:2;4708:9;4699:7;4695:23;4691:32;4688:2;;;4736:1;4733;4726:12;4688:2;4779:1;4804:53;4849:7;4840:6;4829:9;4825:22;4804:53;:::i;:::-;4794:63;;4750:117;4906:2;4932:50;4974:7;4965:6;4954:9;4950:22;4932:50;:::i;:::-;4922:60;;4877:115;4678:321;;;;;:::o;5005:407::-;5073:6;5081;5130:2;5118:9;5109:7;5105:23;5101:32;5098:2;;;5146:1;5143;5136:12;5098:2;5189:1;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5160:117;5316:2;5342:53;5387:7;5378:6;5367:9;5363:22;5342:53;:::i;:::-;5332:63;;5287:118;5088:324;;;;;:::o;5418:256::-;5474:6;5523:2;5511:9;5502:7;5498:23;5494:32;5491:2;;;5539:1;5536;5529:12;5491:2;5582:1;5607:50;5649:7;5640:6;5629:9;5625:22;5607:50;:::i;:::-;5597:60;;5553:114;5481:193;;;;:::o;5680:262::-;5739:6;5788:2;5776:9;5767:7;5763:23;5759:32;5756:2;;;5804:1;5801;5794:12;5756:2;5847:1;5872:53;5917:7;5908:6;5897:9;5893:22;5872:53;:::i;:::-;5862:63;;5818:117;5746:196;;;;:::o;5948:260::-;6006:6;6055:2;6043:9;6034:7;6030:23;6026:32;6023:2;;;6071:1;6068;6061:12;6023:2;6114:1;6139:52;6183:7;6174:6;6163:9;6159:22;6139:52;:::i;:::-;6129:62;;6085:116;6013:195;;;;:::o;6214:282::-;6283:6;6332:2;6320:9;6311:7;6307:23;6303:32;6300:2;;;6348:1;6345;6338:12;6300:2;6391:1;6416:63;6471:7;6462:6;6451:9;6447:22;6416:63;:::i;:::-;6406:73;;6362:127;6290:206;;;;:::o;6502:375::-;6571:6;6620:2;6608:9;6599:7;6595:23;6591:32;6588:2;;;6636:1;6633;6626:12;6588:2;6707:1;6696:9;6692:17;6679:31;6737:18;6729:6;6726:30;6723:2;;;6769:1;6766;6759:12;6723:2;6797:63;6852:7;6843:6;6832:9;6828:22;6797:63;:::i;:::-;6787:73;;6650:220;6578:299;;;;:::o;6883:262::-;6942:6;6991:2;6979:9;6970:7;6966:23;6962:32;6959:2;;;7007:1;7004;6997:12;6959:2;7050:1;7075:53;7120:7;7111:6;7100:9;7096:22;7075:53;:::i;:::-;7065:63;;7021:117;6949:196;;;;:::o;7151:570::-;7246:6;7254;7262;7311:2;7299:9;7290:7;7286:23;7282:32;7279:2;;;7327:1;7324;7317:12;7279:2;7370:1;7395:53;7440:7;7431:6;7420:9;7416:22;7395:53;:::i;:::-;7385:63;;7341:117;7525:2;7514:9;7510:18;7497:32;7556:18;7548:6;7545:30;7542:2;;;7588:1;7585;7578:12;7542:2;7624:80;7696:7;7687:6;7676:9;7672:22;7624:80;:::i;:::-;7606:98;;;;7468:246;7269:452;;;;;:::o;7727:407::-;7795:6;7803;7852:2;7840:9;7831:7;7827:23;7823:32;7820:2;;;7868:1;7865;7858:12;7820:2;7911:1;7936:53;7981:7;7972:6;7961:9;7957:22;7936:53;:::i;:::-;7926:63;;7882:117;8038:2;8064:53;8109:7;8100:6;8089:9;8085:22;8064:53;:::i;:::-;8054:63;;8009:118;7810:324;;;;;:::o;8140:118::-;8227:24;8245:5;8227:24;:::i;:::-;8222:3;8215:37;8205:53;;:::o;8264:157::-;8369:45;8389:24;8407:5;8389:24;:::i;:::-;8369:45;:::i;:::-;8364:3;8357:58;8347:74;;:::o;8427:109::-;8508:21;8523:5;8508:21;:::i;:::-;8503:3;8496:34;8486:50;;:::o;8542:118::-;8629:24;8647:5;8629:24;:::i;:::-;8624:3;8617:37;8607:53;;:::o;8666:360::-;8752:3;8780:38;8812:5;8780:38;:::i;:::-;8834:70;8897:6;8892:3;8834:70;:::i;:::-;8827:77;;8913:52;8958:6;8953:3;8946:4;8939:5;8935:16;8913:52;:::i;:::-;8990:29;9012:6;8990:29;:::i;:::-;8985:3;8981:39;8974:46;;8756:270;;;;;:::o;9032:364::-;9120:3;9148:39;9181:5;9148:39;:::i;:::-;9203:71;9267:6;9262:3;9203:71;:::i;:::-;9196:78;;9283:52;9328:6;9323:3;9316:4;9309:5;9305:16;9283:52;:::i;:::-;9360:29;9382:6;9360:29;:::i;:::-;9355:3;9351:39;9344:46;;9124:272;;;;;:::o;9402:377::-;9508:3;9536:39;9569:5;9536:39;:::i;:::-;9591:89;9673:6;9668:3;9591:89;:::i;:::-;9584:96;;9689:52;9734:6;9729:3;9722:4;9715:5;9711:16;9689:52;:::i;:::-;9766:6;9761:3;9757:16;9750:23;;9512:267;;;;;:::o;9809:845::-;9912:3;9949:5;9943:12;9978:36;10004:9;9978:36;:::i;:::-;10030:89;10112:6;10107:3;10030:89;:::i;:::-;10023:96;;10150:1;10139:9;10135:17;10166:1;10161:137;;;;10312:1;10307:341;;;;10128:520;;10161:137;10245:4;10241:9;10230;10226:25;10221:3;10214:38;10281:6;10276:3;10272:16;10265:23;;10161:137;;10307:341;10374:38;10406:5;10374:38;:::i;:::-;10434:1;10448:154;10462:6;10459:1;10456:13;10448:154;;;10536:7;10530:14;10526:1;10521:3;10517:11;10510:35;10586:1;10577:7;10573:15;10562:26;;10484:4;10481:1;10477:12;10472:17;;10448:154;;;10631:6;10626:3;10622:16;10615:23;;10314:334;;10128:520;;9916:738;;;;;;:::o;10660:366::-;10802:3;10823:67;10887:2;10882:3;10823:67;:::i;:::-;10816:74;;10899:93;10988:3;10899:93;:::i;:::-;11017:2;11012:3;11008:12;11001:19;;10806:220;;;:::o;11032:366::-;11174:3;11195:67;11259:2;11254:3;11195:67;:::i;:::-;11188:74;;11271:93;11360:3;11271:93;:::i;:::-;11389:2;11384:3;11380:12;11373:19;;11178:220;;;:::o;11404:366::-;11546:3;11567:67;11631:2;11626:3;11567:67;:::i;:::-;11560:74;;11643:93;11732:3;11643:93;:::i;:::-;11761:2;11756:3;11752:12;11745:19;;11550:220;;;:::o;11776:366::-;11918:3;11939:67;12003:2;11998:3;11939:67;:::i;:::-;11932:74;;12015:93;12104:3;12015:93;:::i;:::-;12133:2;12128:3;12124:12;12117:19;;11922:220;;;:::o;12148:366::-;12290:3;12311:67;12375:2;12370:3;12311:67;:::i;:::-;12304:74;;12387:93;12476:3;12387:93;:::i;:::-;12505:2;12500:3;12496:12;12489:19;;12294:220;;;:::o;12520:366::-;12662:3;12683:67;12747:2;12742:3;12683:67;:::i;:::-;12676:74;;12759:93;12848:3;12759:93;:::i;:::-;12877:2;12872:3;12868:12;12861:19;;12666:220;;;:::o;12892:366::-;13034:3;13055:67;13119:2;13114:3;13055:67;:::i;:::-;13048:74;;13131:93;13220:3;13131:93;:::i;:::-;13249:2;13244:3;13240:12;13233:19;;13038:220;;;:::o;13264:366::-;13406:3;13427:67;13491:2;13486:3;13427:67;:::i;:::-;13420:74;;13503:93;13592:3;13503:93;:::i;:::-;13621:2;13616:3;13612:12;13605:19;;13410:220;;;:::o;13636:366::-;13778:3;13799:67;13863:2;13858:3;13799:67;:::i;:::-;13792:74;;13875:93;13964:3;13875:93;:::i;:::-;13993:2;13988:3;13984:12;13977:19;;13782:220;;;:::o;14008:366::-;14150:3;14171:67;14235:2;14230:3;14171:67;:::i;:::-;14164:74;;14247:93;14336:3;14247:93;:::i;:::-;14365:2;14360:3;14356:12;14349:19;;14154:220;;;:::o;14380:366::-;14522:3;14543:67;14607:2;14602:3;14543:67;:::i;:::-;14536:74;;14619:93;14708:3;14619:93;:::i;:::-;14737:2;14732:3;14728:12;14721:19;;14526:220;;;:::o;14752:366::-;14894:3;14915:67;14979:2;14974:3;14915:67;:::i;:::-;14908:74;;14991:93;15080:3;14991:93;:::i;:::-;15109:2;15104:3;15100:12;15093:19;;14898:220;;;:::o;15124:366::-;15266:3;15287:67;15351:2;15346:3;15287:67;:::i;:::-;15280:74;;15363:93;15452:3;15363:93;:::i;:::-;15481:2;15476:3;15472:12;15465:19;;15270:220;;;:::o;15496:366::-;15638:3;15659:67;15723:2;15718:3;15659:67;:::i;:::-;15652:74;;15735:93;15824:3;15735:93;:::i;:::-;15853:2;15848:3;15844:12;15837:19;;15642:220;;;:::o;15868:366::-;16010:3;16031:67;16095:2;16090:3;16031:67;:::i;:::-;16024:74;;16107:93;16196:3;16107:93;:::i;:::-;16225:2;16220:3;16216:12;16209:19;;16014:220;;;:::o;16240:366::-;16382:3;16403:67;16467:2;16462:3;16403:67;:::i;:::-;16396:74;;16479:93;16568:3;16479:93;:::i;:::-;16597:2;16592:3;16588:12;16581:19;;16386:220;;;:::o;16612:366::-;16754:3;16775:67;16839:2;16834:3;16775:67;:::i;:::-;16768:74;;16851:93;16940:3;16851:93;:::i;:::-;16969:2;16964:3;16960:12;16953:19;;16758:220;;;:::o;16984:366::-;17126:3;17147:67;17211:2;17206:3;17147:67;:::i;:::-;17140:74;;17223:93;17312:3;17223:93;:::i;:::-;17341:2;17336:3;17332:12;17325:19;;17130:220;;;:::o;17356:366::-;17498:3;17519:67;17583:2;17578:3;17519:67;:::i;:::-;17512:74;;17595:93;17684:3;17595:93;:::i;:::-;17713:2;17708:3;17704:12;17697:19;;17502:220;;;:::o;17728:366::-;17870:3;17891:67;17955:2;17950:3;17891:67;:::i;:::-;17884:74;;17967:93;18056:3;17967:93;:::i;:::-;18085:2;18080:3;18076:12;18069:19;;17874:220;;;:::o;18100:366::-;18242:3;18263:67;18327:2;18322:3;18263:67;:::i;:::-;18256:74;;18339:93;18428:3;18339:93;:::i;:::-;18457:2;18452:3;18448:12;18441:19;;18246:220;;;:::o;18472:366::-;18614:3;18635:67;18699:2;18694:3;18635:67;:::i;:::-;18628:74;;18711:93;18800:3;18711:93;:::i;:::-;18829:2;18824:3;18820:12;18813:19;;18618:220;;;:::o;18844:398::-;19003:3;19024:83;19105:1;19100:3;19024:83;:::i;:::-;19017:90;;19116:93;19205:3;19116:93;:::i;:::-;19234:1;19229:3;19225:11;19218:18;;19007:235;;;:::o;19248:366::-;19390:3;19411:67;19475:2;19470:3;19411:67;:::i;:::-;19404:74;;19487:93;19576:3;19487:93;:::i;:::-;19605:2;19600:3;19596:12;19589:19;;19394:220;;;:::o;19620:366::-;19762:3;19783:67;19847:2;19842:3;19783:67;:::i;:::-;19776:74;;19859:93;19948:3;19859:93;:::i;:::-;19977:2;19972:3;19968:12;19961:19;;19766:220;;;:::o;19992:366::-;20134:3;20155:67;20219:2;20214:3;20155:67;:::i;:::-;20148:74;;20231:93;20320:3;20231:93;:::i;:::-;20349:2;20344:3;20340:12;20333:19;;20138:220;;;:::o;20364:366::-;20506:3;20527:67;20591:2;20586:3;20527:67;:::i;:::-;20520:74;;20603:93;20692:3;20603:93;:::i;:::-;20721:2;20716:3;20712:12;20705:19;;20510:220;;;:::o;20736:400::-;20896:3;20917:84;20999:1;20994:3;20917:84;:::i;:::-;20910:91;;21010:93;21099:3;21010:93;:::i;:::-;21128:1;21123:3;21119:11;21112:18;;20900:236;;;:::o;21142:118::-;21229:24;21247:5;21229:24;:::i;:::-;21224:3;21217:37;21207:53;;:::o;21266:115::-;21351:23;21368:5;21351:23;:::i;:::-;21346:3;21339:36;21329:52;;:::o;21387:256::-;21499:3;21514:75;21585:3;21576:6;21514:75;:::i;:::-;21614:2;21609:3;21605:12;21598:19;;21634:3;21627:10;;21503:140;;;;:::o;21649:855::-;21975:3;21997:95;22088:3;22079:6;21997:95;:::i;:::-;21990:102;;22109:148;22253:3;22109:148;:::i;:::-;22102:155;;22274:95;22365:3;22356:6;22274:95;:::i;:::-;22267:102;;22386:92;22474:3;22465:6;22386:92;:::i;:::-;22379:99;;22495:3;22488:10;;21979:525;;;;;;:::o;22510:379::-;22694:3;22716:147;22859:3;22716:147;:::i;:::-;22709:154;;22880:3;22873:10;;22698:191;;;:::o;22895:222::-;22988:4;23026:2;23015:9;23011:18;23003:26;;23039:71;23107:1;23096:9;23092:17;23083:6;23039:71;:::i;:::-;22993:124;;;;:::o;23123:640::-;23318:4;23356:3;23345:9;23341:19;23333:27;;23370:71;23438:1;23427:9;23423:17;23414:6;23370:71;:::i;:::-;23451:72;23519:2;23508:9;23504:18;23495:6;23451:72;:::i;:::-;23533;23601:2;23590:9;23586:18;23577:6;23533:72;:::i;:::-;23652:9;23646:4;23642:20;23637:2;23626:9;23622:18;23615:48;23680:76;23751:4;23742:6;23680:76;:::i;:::-;23672:84;;23323:440;;;;;;;:::o;23769:332::-;23890:4;23928:2;23917:9;23913:18;23905:26;;23941:71;24009:1;23998:9;23994:17;23985:6;23941:71;:::i;:::-;24022:72;24090:2;24079:9;24075:18;24066:6;24022:72;:::i;:::-;23895:206;;;;;:::o;24107:210::-;24194:4;24232:2;24221:9;24217:18;24209:26;;24245:65;24307:1;24296:9;24292:17;24283:6;24245:65;:::i;:::-;24199:118;;;;:::o;24323:222::-;24416:4;24454:2;24443:9;24439:18;24431:26;;24467:71;24535:1;24524:9;24520:17;24511:6;24467:71;:::i;:::-;24421:124;;;;:::o;24551:313::-;24664:4;24702:2;24691:9;24687:18;24679:26;;24751:9;24745:4;24741:20;24737:1;24726:9;24722:17;24715:47;24779:78;24852:4;24843:6;24779:78;:::i;:::-;24771:86;;24669:195;;;;:::o;24870:419::-;25036:4;25074:2;25063:9;25059:18;25051:26;;25123:9;25117:4;25113:20;25109:1;25098:9;25094:17;25087:47;25151:131;25277:4;25151:131;:::i;:::-;25143:139;;25041:248;;;:::o;25295:419::-;25461:4;25499:2;25488:9;25484:18;25476:26;;25548:9;25542:4;25538:20;25534:1;25523:9;25519:17;25512:47;25576:131;25702:4;25576:131;:::i;:::-;25568:139;;25466:248;;;:::o;25720:419::-;25886:4;25924:2;25913:9;25909:18;25901:26;;25973:9;25967:4;25963:20;25959:1;25948:9;25944:17;25937:47;26001:131;26127:4;26001:131;:::i;:::-;25993:139;;25891:248;;;:::o;26145:419::-;26311:4;26349:2;26338:9;26334:18;26326:26;;26398:9;26392:4;26388:20;26384:1;26373:9;26369:17;26362:47;26426:131;26552:4;26426:131;:::i;:::-;26418:139;;26316:248;;;:::o;26570:419::-;26736:4;26774:2;26763:9;26759:18;26751:26;;26823:9;26817:4;26813:20;26809:1;26798:9;26794:17;26787:47;26851:131;26977:4;26851:131;:::i;:::-;26843:139;;26741:248;;;:::o;26995:419::-;27161:4;27199:2;27188:9;27184:18;27176:26;;27248:9;27242:4;27238:20;27234:1;27223:9;27219:17;27212:47;27276:131;27402:4;27276:131;:::i;:::-;27268:139;;27166:248;;;:::o;27420:419::-;27586:4;27624:2;27613:9;27609:18;27601:26;;27673:9;27667:4;27663:20;27659:1;27648:9;27644:17;27637:47;27701:131;27827:4;27701:131;:::i;:::-;27693:139;;27591:248;;;:::o;27845:419::-;28011:4;28049:2;28038:9;28034:18;28026:26;;28098:9;28092:4;28088:20;28084:1;28073:9;28069:17;28062:47;28126:131;28252:4;28126:131;:::i;:::-;28118:139;;28016:248;;;:::o;28270:419::-;28436:4;28474:2;28463:9;28459:18;28451:26;;28523:9;28517:4;28513:20;28509:1;28498:9;28494:17;28487:47;28551:131;28677:4;28551:131;:::i;:::-;28543:139;;28441:248;;;:::o;28695:419::-;28861:4;28899:2;28888:9;28884:18;28876:26;;28948:9;28942:4;28938:20;28934:1;28923:9;28919:17;28912:47;28976:131;29102:4;28976:131;:::i;:::-;28968:139;;28866:248;;;:::o;29120:419::-;29286:4;29324:2;29313:9;29309:18;29301:26;;29373:9;29367:4;29363:20;29359:1;29348:9;29344:17;29337:47;29401:131;29527:4;29401:131;:::i;:::-;29393:139;;29291:248;;;:::o;29545:419::-;29711:4;29749:2;29738:9;29734:18;29726:26;;29798:9;29792:4;29788:20;29784:1;29773:9;29769:17;29762:47;29826:131;29952:4;29826:131;:::i;:::-;29818:139;;29716:248;;;:::o;29970:419::-;30136:4;30174:2;30163:9;30159:18;30151:26;;30223:9;30217:4;30213:20;30209:1;30198:9;30194:17;30187:47;30251:131;30377:4;30251:131;:::i;:::-;30243:139;;30141:248;;;:::o;30395:419::-;30561:4;30599:2;30588:9;30584:18;30576:26;;30648:9;30642:4;30638:20;30634:1;30623:9;30619:17;30612:47;30676:131;30802:4;30676:131;:::i;:::-;30668:139;;30566:248;;;:::o;30820:419::-;30986:4;31024:2;31013:9;31009:18;31001:26;;31073:9;31067:4;31063:20;31059:1;31048:9;31044:17;31037:47;31101:131;31227:4;31101:131;:::i;:::-;31093:139;;30991:248;;;:::o;31245:419::-;31411:4;31449:2;31438:9;31434:18;31426:26;;31498:9;31492:4;31488:20;31484:1;31473:9;31469:17;31462:47;31526:131;31652:4;31526:131;:::i;:::-;31518:139;;31416:248;;;:::o;31670:419::-;31836:4;31874:2;31863:9;31859:18;31851:26;;31923:9;31917:4;31913:20;31909:1;31898:9;31894:17;31887:47;31951:131;32077:4;31951:131;:::i;:::-;31943:139;;31841:248;;;:::o;32095:419::-;32261:4;32299:2;32288:9;32284:18;32276:26;;32348:9;32342:4;32338:20;32334:1;32323:9;32319:17;32312:47;32376:131;32502:4;32376:131;:::i;:::-;32368:139;;32266:248;;;:::o;32520:419::-;32686:4;32724:2;32713:9;32709:18;32701:26;;32773:9;32767:4;32763:20;32759:1;32748:9;32744:17;32737:47;32801:131;32927:4;32801:131;:::i;:::-;32793:139;;32691:248;;;:::o;32945:419::-;33111:4;33149:2;33138:9;33134:18;33126:26;;33198:9;33192:4;33188:20;33184:1;33173:9;33169:17;33162:47;33226:131;33352:4;33226:131;:::i;:::-;33218:139;;33116:248;;;:::o;33370:419::-;33536:4;33574:2;33563:9;33559:18;33551:26;;33623:9;33617:4;33613:20;33609:1;33598:9;33594:17;33587:47;33651:131;33777:4;33651:131;:::i;:::-;33643:139;;33541:248;;;:::o;33795:419::-;33961:4;33999:2;33988:9;33984:18;33976:26;;34048:9;34042:4;34038:20;34034:1;34023:9;34019:17;34012:47;34076:131;34202:4;34076:131;:::i;:::-;34068:139;;33966:248;;;:::o;34220:419::-;34386:4;34424:2;34413:9;34409:18;34401:26;;34473:9;34467:4;34463:20;34459:1;34448:9;34444:17;34437:47;34501:131;34627:4;34501:131;:::i;:::-;34493:139;;34391:248;;;:::o;34645:419::-;34811:4;34849:2;34838:9;34834:18;34826:26;;34898:9;34892:4;34888:20;34884:1;34873:9;34869:17;34862:47;34926:131;35052:4;34926:131;:::i;:::-;34918:139;;34816:248;;;:::o;35070:419::-;35236:4;35274:2;35263:9;35259:18;35251:26;;35323:9;35317:4;35313:20;35309:1;35298:9;35294:17;35287:47;35351:131;35477:4;35351:131;:::i;:::-;35343:139;;35241:248;;;:::o;35495:419::-;35661:4;35699:2;35688:9;35684:18;35676:26;;35748:9;35742:4;35738:20;35734:1;35723:9;35719:17;35712:47;35776:131;35902:4;35776:131;:::i;:::-;35768:139;;35666:248;;;:::o;35920:222::-;36013:4;36051:2;36040:9;36036:18;36028:26;;36064:71;36132:1;36121:9;36117:17;36108:6;36064:71;:::i;:::-;36018:124;;;;:::o;36148:218::-;36239:4;36277:2;36266:9;36262:18;36254:26;;36290:69;36356:1;36345:9;36341:17;36332:6;36290:69;:::i;:::-;36244:122;;;;:::o;36372:129::-;36406:6;36433:20;;:::i;:::-;36423:30;;36462:33;36490:4;36482:6;36462:33;:::i;:::-;36413:88;;;:::o;36507:75::-;36540:6;36573:2;36567:9;36557:19;;36547:35;:::o;36588:307::-;36649:4;36739:18;36731:6;36728:30;36725:2;;;36761:18;;:::i;:::-;36725:2;36799:29;36821:6;36799:29;:::i;:::-;36791:37;;36883:4;36877;36873:15;36865:23;;36654:241;;;:::o;36901:308::-;36963:4;37053:18;37045:6;37042:30;37039:2;;;37075:18;;:::i;:::-;37039:2;37113:29;37135:6;37113:29;:::i;:::-;37105:37;;37197:4;37191;37187:15;37179:23;;36968:241;;;:::o;37215:141::-;37264:4;37287:3;37279:11;;37310:3;37307:1;37300:14;37344:4;37341:1;37331:18;37323:26;;37269:87;;;:::o;37362:98::-;37413:6;37447:5;37441:12;37431:22;;37420:40;;;:::o;37466:99::-;37518:6;37552:5;37546:12;37536:22;;37525:40;;;:::o;37571:168::-;37654:11;37688:6;37683:3;37676:19;37728:4;37723:3;37719:14;37704:29;;37666:73;;;;:::o;37745:147::-;37846:11;37883:3;37868:18;;37858:34;;;;:::o;37898:169::-;37982:11;38016:6;38011:3;38004:19;38056:4;38051:3;38047:14;38032:29;;37994:73;;;;:::o;38073:148::-;38175:11;38212:3;38197:18;;38187:34;;;;:::o;38227:305::-;38267:3;38286:20;38304:1;38286:20;:::i;:::-;38281:25;;38320:20;38338:1;38320:20;:::i;:::-;38315:25;;38474:1;38406:66;38402:74;38399:1;38396:81;38393:2;;;38480:18;;:::i;:::-;38393:2;38524:1;38521;38517:9;38510:16;;38271:261;;;;:::o;38538:185::-;38578:1;38595:20;38613:1;38595:20;:::i;:::-;38590:25;;38629:20;38647:1;38629:20;:::i;:::-;38624:25;;38668:1;38658:2;;38673:18;;:::i;:::-;38658:2;38715:1;38712;38708:9;38703:14;;38580:143;;;;:::o;38729:348::-;38769:7;38792:20;38810:1;38792:20;:::i;:::-;38787:25;;38826:20;38844:1;38826:20;:::i;:::-;38821:25;;39014:1;38946:66;38942:74;38939:1;38936:81;38931:1;38924:9;38917:17;38913:105;38910:2;;;39021:18;;:::i;:::-;38910:2;39069:1;39066;39062:9;39051:20;;38777:300;;;;:::o;39083:191::-;39123:4;39143:20;39161:1;39143:20;:::i;:::-;39138:25;;39177:20;39195:1;39177:20;:::i;:::-;39172:25;;39216:1;39213;39210:8;39207:2;;;39221:18;;:::i;:::-;39207:2;39266:1;39263;39259:9;39251:17;;39128:146;;;;:::o;39280:96::-;39317:7;39346:24;39364:5;39346:24;:::i;:::-;39335:35;;39325:51;;;:::o;39382:90::-;39416:7;39459:5;39452:13;39445:21;39434:32;;39424:48;;;:::o;39478:77::-;39515:7;39544:5;39533:16;;39523:32;;;:::o;39561:149::-;39597:7;39637:66;39630:5;39626:78;39615:89;;39605:105;;;:::o;39716:126::-;39753:7;39793:42;39786:5;39782:54;39771:65;;39761:81;;;:::o;39848:77::-;39885:7;39914:5;39903:16;;39893:32;;;:::o;39931:109::-;39967:7;40007:26;40000:5;39996:38;39985:49;;39975:65;;;:::o;40046:154::-;40130:6;40125:3;40120;40107:30;40192:1;40183:6;40178:3;40174:16;40167:27;40097:103;;;:::o;40206:307::-;40274:1;40284:113;40298:6;40295:1;40292:13;40284:113;;;40383:1;40378:3;40374:11;40368:18;40364:1;40359:3;40355:11;40348:39;40320:2;40317:1;40313:10;40308:15;;40284:113;;;40415:6;40412:1;40409:13;40406:2;;;40495:1;40486:6;40481:3;40477:16;40470:27;40406:2;40255:258;;;;:::o;40519:320::-;40563:6;40600:1;40594:4;40590:12;40580:22;;40647:1;40641:4;40637:12;40668:18;40658:2;;40724:4;40716:6;40712:17;40702:27;;40658:2;40786;40778:6;40775:14;40755:18;40752:38;40749:2;;;40805:18;;:::i;:::-;40749:2;40570:269;;;;:::o;40845:281::-;40928:27;40950:4;40928:27;:::i;:::-;40920:6;40916:40;41058:6;41046:10;41043:22;41022:18;41010:10;41007:34;41004:62;41001:2;;;41069:18;;:::i;:::-;41001:2;41109:10;41105:2;41098:22;40888:238;;;:::o;41132:233::-;41171:3;41194:24;41212:5;41194:24;:::i;:::-;41185:33;;41240:66;41233:5;41230:77;41227:2;;;41310:18;;:::i;:::-;41227:2;41357:1;41350:5;41346:13;41339:20;;41175:190;;;:::o;41371:100::-;41410:7;41439:26;41459:5;41439:26;:::i;:::-;41428:37;;41418:53;;;:::o;41477:94::-;41516:7;41545:20;41559:5;41545:20;:::i;:::-;41534:31;;41524:47;;;:::o;41577:176::-;41609:1;41626:20;41644:1;41626:20;:::i;:::-;41621:25;;41660:20;41678:1;41660:20;:::i;:::-;41655:25;;41699:1;41689:2;;41704:18;;:::i;:::-;41689:2;41745:1;41742;41738:9;41733:14;;41611:142;;;;:::o;41759:180::-;41807:77;41804:1;41797:88;41904:4;41901:1;41894:15;41928:4;41925:1;41918:15;41945:180;41993:77;41990:1;41983:88;42090:4;42087:1;42080:15;42114:4;42111:1;42104:15;42131:180;42179:77;42176:1;42169:88;42276:4;42273:1;42266:15;42300:4;42297:1;42290:15;42317:180;42365:77;42362:1;42355:88;42462:4;42459:1;42452:15;42486:4;42483:1;42476:15;42503:102;42544:6;42595:2;42591:7;42586:2;42579:5;42575:14;42571:28;42561:38;;42551:54;;;:::o;42611:94::-;42644:8;42692:5;42688:2;42684:14;42663:35;;42653:52;;;:::o;42711:172::-;42851:24;42847:1;42839:6;42835:14;42828:48;42817:66;:::o;42889:230::-;43029:34;43025:1;43017:6;43013:14;43006:58;43098:13;43093:2;43085:6;43081:15;43074:38;42995:124;:::o;43125:237::-;43265:34;43261:1;43253:6;43249:14;43242:58;43334:20;43329:2;43321:6;43317:15;43310:45;43231:131;:::o;43368:225::-;43508:34;43504:1;43496:6;43492:14;43485:58;43577:8;43572:2;43564:6;43560:15;43553:33;43474:119;:::o;43599:224::-;43739:34;43735:1;43727:6;43723:14;43716:58;43808:7;43803:2;43795:6;43791:15;43784:32;43705:118;:::o;43829:178::-;43969:30;43965:1;43957:6;43953:14;43946:54;43935:72;:::o;44013:223::-;44153:34;44149:1;44141:6;44137:14;44130:58;44222:6;44217:2;44209:6;44205:15;44198:31;44119:117;:::o;44242:175::-;44382:27;44378:1;44370:6;44366:14;44359:51;44348:69;:::o;44423:168::-;44563:20;44559:1;44551:6;44547:14;44540:44;44529:62;:::o;44597:231::-;44737:34;44733:1;44725:6;44721:14;44714:58;44806:14;44801:2;44793:6;44789:15;44782:39;44703:125;:::o;44834:243::-;44974:34;44970:1;44962:6;44958:14;44951:58;45043:26;45038:2;45030:6;45026:15;45019:51;44940:137;:::o;45083:229::-;45223:34;45219:1;45211:6;45207:14;45200:58;45292:12;45287:2;45279:6;45275:15;45268:37;45189:123;:::o;45318:228::-;45458:34;45454:1;45446:6;45442:14;45435:58;45527:11;45522:2;45514:6;45510:15;45503:36;45424:122;:::o;45552:165::-;45692:17;45688:1;45680:6;45676:14;45669:41;45658:59;:::o;45723:182::-;45863:34;45859:1;45851:6;45847:14;45840:58;45829:76;:::o;45911:164::-;46051:16;46047:1;46039:6;46035:14;46028:40;46017:58;:::o;46081:231::-;46221:34;46217:1;46209:6;46205:14;46198:58;46290:14;46285:2;46277:6;46273:15;46266:39;46187:125;:::o;46318:182::-;46458:34;46454:1;46446:6;46442:14;46435:58;46424:76;:::o;46506:173::-;46646:25;46642:1;46634:6;46630:14;46623:49;46612:67;:::o;46685:170::-;46825:22;46821:1;46813:6;46809:14;46802:46;46791:64;:::o;46861:170::-;47001:22;46997:1;46989:6;46985:14;46978:46;46967:64;:::o;47037:220::-;47177:34;47173:1;47165:6;47161:14;47154:58;47246:3;47241:2;47233:6;47229:15;47222:28;47143:114;:::o;47263:::-;47369:8;:::o;47383:236::-;47523:34;47519:1;47511:6;47507:14;47500:58;47592:19;47587:2;47579:6;47575:15;47568:44;47489:130;:::o;47625:231::-;47765:34;47761:1;47753:6;47749:14;47742:58;47834:14;47829:2;47821:6;47817:15;47810:39;47731:125;:::o;47862:166::-;48002:18;47998:1;47990:6;47986:14;47979:42;47968:60;:::o;48034:166::-;48174:18;48170:1;48162:6;48158:14;48151:42;48140:60;:::o;48206:151::-;48346:3;48342:1;48334:6;48330:14;48323:27;48312:45;:::o;48363:122::-;48436:24;48454:5;48436:24;:::i;:::-;48429:5;48426:35;48416:2;;48475:1;48472;48465:12;48416:2;48406:79;:::o;48491:116::-;48561:21;48576:5;48561:21;:::i;:::-;48554:5;48551:32;48541:2;;48597:1;48594;48587:12;48541:2;48531:76;:::o;48613:122::-;48686:24;48704:5;48686:24;:::i;:::-;48679:5;48676:35;48666:2;;48725:1;48722;48715:12;48666:2;48656:79;:::o;48741:120::-;48813:23;48830:5;48813:23;:::i;:::-;48806:5;48803:34;48793:2;;48851:1;48848;48841:12;48793:2;48783:78;:::o;48867:122::-;48940:24;48958:5;48940:24;:::i;:::-;48933:5;48930:35;48920:2;;48979:1;48976;48969:12;48920:2;48910:79;:::o

Swarm Source

ipfs://168c3fd9fb60eab9fa9625c44524e1f82b22887c495c4ddfc8e394f00c846fae
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.