ETH Price: $2,500.57 (-0.63%)

Token

GFC3D (GFC3D)
 

Overview

Max Total Supply

219 GFC3D

Holders

65

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
4 GFC3D
0xc2c21cf72c55237a8d2c3fc215819f01bc5afd38
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:
GFC3D

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// 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/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (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/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (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/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// File: contracts/GFC3d.sol


//
//     ************   *********     **********    
//   **               **           **           
//   **               **           **           
//   **       *****   *********    **
//   **          **   **           ** 
//    **         **   **           **
//     ************   **            **********

pragma solidity >=0.8.9 <0.9.0;





contract GFC3D is ERC721A, Ownable, ReentrancyGuard {

  using Strings for uint256;

  bytes32 public merkleRoot;
  mapping(address => bool) public freeMintClaimed;
  mapping(address => bool) public whitelistMintClaimed;
  mapping(address => bool) public publicMintClaimed;
  mapping(address => uint256) public specialMintBalance;


  string public uriPrefix = '';//this is baseuri
  string public uriSuffix = '.json';
  string public hiddenMetadataUri;
  
  uint256 public cost;
  uint256 public maxSupply;
  uint256 public capWhitelist;
  uint256 public capPublic;
  uint256 public capFreemint;

  bool public publicMintEnabled = false;
  bool public whitelistMintEnabled = false;
  bool public revealed = false;
  bool public freeMintEnabled = false;
  bool public specialMintEnabled = false;

 
  event IsContractChanged(bool _ischanged);

  constructor(
    string memory _tokenName,
    string memory _tokenSymbol,
    uint256 _cost,
    uint256 _maxSupply,
    uint256 _capWhitelist,
    uint256 _capPublic,
    uint256 _capFreemint,
    string memory _hiddenMetadataUri
  )
   ERC721A(_tokenName, _tokenSymbol) {
    cost = _cost;//*10^18=_ether
    maxSupply = _maxSupply;
    capWhitelist = _capWhitelist;
    capPublic = _capPublic;
    capFreemint = _capFreemint;
    setHiddenMetadataUri(_hiddenMetadataUri);
  }
/////////////////////////////
  modifier mintCompliance(uint256 _mintAmount) {
    require(totalSupply() + _mintAmount <= maxSupply, 'Sold out');
    _;
  }

  modifier mintPriceCompliance(uint256 _mintAmount) {
    require(msg.value >= cost * _mintAmount, 'Insufficient funds');
    _;
  }
/// whitelistmint & publicmint //////////////////////////////////////////////////////////////////////////////////////////
  function whitelistMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable 
    mintCompliance(_mintAmount) 
    mintPriceCompliance(_mintAmount) {
    require(whitelistMintEnabled, 'Not Ready');
    require(_mintAmount <= capWhitelist,'Amount Limit');
    require(!whitelistMintClaimed[_msgSender()], 'Address already claimed!');
    bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
    require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Not Whitelist');

  
    _safeMint(_msgSender(), _mintAmount);
    whitelistMintClaimed[_msgSender()] = true;
  }

  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) {
    require(publicMintEnabled, 'Not Ready');
    require(_mintAmount <= capPublic,'Amount Limit');
    require(!publicMintClaimed[_msgSender()], 'Address already claimed!');
   
    _safeMint(_msgSender(), _mintAmount);
    publicMintClaimed[_msgSender()] = true;
  }

//   Spare
  function specialMint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) {
    require(specialMintEnabled, 'Not Ready');
    require(_mintAmount <= capPublic,'Amount Limit');
    require(_mintAmount > 0 && specialMintBalance[_msgSender()] + _mintAmount <= capPublic,'Amount Limit');
   
    _safeMint(_msgSender(), _mintAmount);
    specialMintBalance[_msgSender()] += _mintAmount;
  }
  
  
  ///For marketing etc////////////////////////////
  function reserve(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    _safeMint(_receiver, _mintAmount);
  }

 function freeMint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable 
    mintCompliance(_mintAmount) 
    { 
    require(freeMintEnabled, 'Not Ready');
    require(!freeMintClaimed[_msgSender()], 'Address already claimed!');
    require(_mintAmount <= capFreemint,'Amount Limit');
    bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
    require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Not freemint address');
    _safeMint(_msgSender(), _mintAmount);
    freeMintClaimed[_msgSender()] = true;
  }
  
  
  //////////////////
  function walletOfOwner(address _owner) public view returns (uint256[] memory) {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = _startTokenId();
    uint256 ownedTokenIndex = 0;
    address latestOwnerAddress;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      TokenOwnership memory ownership = _ownerships[currentTokenId];

      if (!ownership.burned && ownership.addr != address(0)) {
        latestOwnerAddress = ownership.addr;
      }

      if (latestOwnerAddress == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');

    if (revealed == false) {
      return hiddenMetadataUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : '';
  }
//// only owner////////////////////////////////////////////////////////////////////////////////////

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
  }

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

  function verifyMerkle(bytes32[] calldata _merkleProof) public view {
    bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
    require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Invalid proof!');
  }

  function setcapWhitelist(uint256 _capWhitelist) public onlyOwner {
    capWhitelist = _capWhitelist;
  }

  function setcapPubliclist(uint256 _capPublic) public onlyOwner {
    capPublic = _capPublic;
  }
  function setcapFreemint(uint256 _capFreemint) public onlyOwner {
    capFreemint = _capFreemint;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

 
  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setpublicMintEnabled(bool _state) public onlyOwner {
    publicMintEnabled = _state;
  }
  function setWhitelistMintEnabled(bool _state) public onlyOwner {  
    whitelistMintEnabled = _state;
  }
  
  function setspecialMintEnabled(bool _state) public onlyOwner {  
    specialMintEnabled = _state;
  }
  
  function setfreeMintEnabled(bool _state) public onlyOwner {
    freeMintEnabled = _state;
  }

  function withdraw() public onlyOwner nonReentrant {
    (bool hs, ) = payable(0x03dc407E7818e803e835F5d6abA950f297d77642).call{value: address(this).balance * 25 / 100}('');
    require(hs);
    (bool os, ) = payable(owner()).call{value: address(this).balance}('');
    require(os);   
  }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_capWhitelist","type":"uint256"},{"internalType":"uint256","name":"_capPublic","type":"uint256"},{"internalType":"uint256","name":"_capFreemint","type":"uint256"},{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_ischanged","type":"bool"}],"name":"IsContractChanged","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"},{"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":"capFreemint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"capPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"capWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","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":[{"internalType":"address","name":"","type":"address"}],"name":"publicMintClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_capFreemint","type":"uint256"}],"name":"setcapFreemint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_capPublic","type":"uint256"}],"name":"setcapPubliclist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_capWhitelist","type":"uint256"}],"name":"setcapWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setfreeMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setpublicMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setspecialMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"specialMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"specialMintBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"specialMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_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":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"verifyMerkle","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMintClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600f90805190602001906200002b92919062000396565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250601090805190602001906200007992919062000396565b506000601760006101000a81548160ff0219169083151502179055506000601760016101000a81548160ff0219169083151502179055506000601760026101000a81548160ff0219169083151502179055506000601760036101000a81548160ff0219169083151502179055506000601760046101000a81548160ff0219169083151502179055503480156200010e57600080fd5b506040516200603e3803806200603e83398181016040528101906200013491906200061e565b878781600290805190602001906200014e92919062000396565b5080600390805190602001906200016792919062000396565b5062000178620001ea60201b60201c565b6000819055505050620001a062000194620001f360201b60201c565b620001fb60201b60201c565b60016009819055508560128190555084601381905550836014819055508260158190555081601681905550620001dc81620002c160201b60201c565b50505050505050506200082b565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002d1620001f360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002f76200036c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000350576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200034790620007a5565b60405180910390fd5b80601190805190602001906200036892919062000396565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003a490620007f6565b90600052602060002090601f016020900481019282620003c8576000855562000414565b82601f10620003e357805160ff191683800117855562000414565b8280016001018555821562000414579182015b8281111562000413578251825591602001919060010190620003f6565b5b50905062000423919062000427565b5090565b5b808211156200044257600081600090555060010162000428565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004af8262000464565b810181811067ffffffffffffffff82111715620004d157620004d062000475565b5b80604052505050565b6000620004e662000446565b9050620004f48282620004a4565b919050565b600067ffffffffffffffff82111562000517576200051662000475565b5b620005228262000464565b9050602081019050919050565b60005b838110156200054f57808201518184015260208101905062000532565b838111156200055f576000848401525b50505050565b60006200057c6200057684620004f9565b620004da565b9050828152602081018484840111156200059b576200059a6200045f565b5b620005a88482856200052f565b509392505050565b600082601f830112620005c857620005c76200045a565b5b8151620005da84826020860162000565565b91505092915050565b6000819050919050565b620005f881620005e3565b81146200060457600080fd5b50565b6000815190506200061881620005ed565b92915050565b600080600080600080600080610100898b03121562000642576200064162000450565b5b600089015167ffffffffffffffff81111562000663576200066262000455565b5b620006718b828c01620005b0565b985050602089015167ffffffffffffffff81111562000695576200069462000455565b5b620006a38b828c01620005b0565b9750506040620006b68b828c0162000607565b9650506060620006c98b828c0162000607565b9550506080620006dc8b828c0162000607565b94505060a0620006ef8b828c0162000607565b93505060c0620007028b828c0162000607565b92505060e089015167ffffffffffffffff81111562000726576200072562000455565b5b620007348b828c01620005b0565b9150509295985092959890939650565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200078d60208362000744565b91506200079a8262000755565b602082019050919050565b60006020820190508181036000830152620007c0816200077e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200080f57607f821691505b602082108103620008255762000824620007c7565b5b50919050565b615803806200083b6000396000f3fe60806040526004361061036b5760003560e01c806370a08231116101c6578063b88d4fde116100f7578063e0ec7c3611610095578063eb824f601161006f578063eb824f6014610c56578063f2fde38b14610c7f578063f7b7c28e14610ca8578063f7cb9e5414610cd35761036b565b8063e0ec7c3614610bc0578063e2f36dce14610bfd578063e985e9c514610c195761036b565b8063d2cab056116100d1578063d2cab05614610b25578063d5abeb0114610b41578063d5e13d6514610b6c578063e0a8085314610b975761036b565b8063b88d4fde14610a94578063c87b56dd14610abd578063cb4e832614610afa5761036b565b80638da5cb5b11610164578063a0712d681161013e578063a0712d68146109fb578063a22cb46514610a17578063a45ba8e714610a40578063b767a09814610a6b5761036b565b80638da5cb5b1461097c5780638fca32d8146109a757806395d89b41146109d05761036b565b806376e5ae4f116101a057806376e5ae4f146108c25780637cb64759146108ff5780637ec4a659146109285780637f602f33146109515761036b565b806370a0823114610845578063715018a614610882578063764f735b146108995761036b565b80633ccfd60b116102a05780635503a0e81161023e57806362ad68aa1161021857806362ad68aa1461078757806362b99ad4146107b25780636352211e146107dd5780636caede3d1461081a5761036b565b80635503a0e814610703578063575104921461072e5780635f051be51461074a5761036b565b8063438b63001161027a578063438b63001461064957806344a0d68a146106865780634fdd43cb146106af57806351830227146106d85761036b565b80633ccfd60b146105e057806342842e0e146105f7578063434a2bee146106205761036b565b806313faede61161030d57806323b872dd116102e757806323b872dd1461053a57806326745cb7146105635780632e170b511461058c5780632eb4a7ab146105b55761036b565b806313faede6146104bb57806316ba10e0146104e657806318160ddd1461050f5761036b565b806306fdde031161034957806306fdde03146103ff578063081812fc1461042a578063095ea7b3146104675780630f4161aa146104905761036b565b8063016ac5401461037057806301ffc9a71461039957806303339bcb146103d6575b600080fd5b34801561037c57600080fd5b5061039760048036038101906103929190614421565b610d10565b005b3480156103a557600080fd5b506103c060048036038101906103bb91906144a6565b610da9565b6040516103cd91906144e2565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f89190614591565b610e8b565b005b34801561040b57600080fd5b50610414610f6e565b604051610421919061466a565b60405180910390f35b34801561043657600080fd5b50610451600480360381019061044c919061468c565b611000565b60405161045e91906146c8565b60405180910390f35b34801561047357600080fd5b5061048e600480360381019061048991906146e3565b61107c565b005b34801561049c57600080fd5b506104a5611186565b6040516104b291906144e2565b60405180910390f35b3480156104c757600080fd5b506104d0611199565b6040516104dd9190614732565b60405180910390f35b3480156104f257600080fd5b5061050d60048036038101906105089190614882565b61119f565b005b34801561051b57600080fd5b50610524611235565b6040516105319190614732565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c91906148cb565b61124c565b005b34801561056f57600080fd5b5061058a6004803603810190610585919061468c565b61125c565b005b34801561059857600080fd5b506105b360048036038101906105ae9190614421565b6112e2565b005b3480156105c157600080fd5b506105ca61137b565b6040516105d79190614937565b60405180910390f35b3480156105ec57600080fd5b506105f5611381565b005b34801561060357600080fd5b5061061e600480360381019061061991906148cb565b611575565b005b34801561062c57600080fd5b506106476004803603810190610642919061468c565b611595565b005b34801561065557600080fd5b50610670600480360381019061066b9190614952565b61161b565b60405161067d9190614a3d565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a8919061468c565b611835565b005b3480156106bb57600080fd5b506106d660048036038101906106d19190614882565b6118bb565b005b3480156106e457600080fd5b506106ed611951565b6040516106fa91906144e2565b60405180910390f35b34801561070f57600080fd5b50610718611964565b604051610725919061466a565b60405180910390f35b6107486004803603810190610743919061468c565b6119f2565b005b34801561075657600080fd5b50610771600480360381019061076c9190614952565b611c44565b60405161077e9190614732565b60405180910390f35b34801561079357600080fd5b5061079c611c5c565b6040516107a991906144e2565b60405180910390f35b3480156107be57600080fd5b506107c7611c6f565b6040516107d4919061466a565b60405180910390f35b3480156107e957600080fd5b5061080460048036038101906107ff919061468c565b611cfd565b60405161081191906146c8565b60405180910390f35b34801561082657600080fd5b5061082f611d13565b60405161083c91906144e2565b60405180910390f35b34801561085157600080fd5b5061086c60048036038101906108679190614952565b611d26565b6040516108799190614732565b60405180910390f35b34801561088e57600080fd5b50610897611df5565b005b3480156108a557600080fd5b506108c060048036038101906108bb919061468c565b611e7d565b005b3480156108ce57600080fd5b506108e960048036038101906108e49190614952565b611f03565b6040516108f691906144e2565b60405180910390f35b34801561090b57600080fd5b5061092660048036038101906109219190614a8b565b611f23565b005b34801561093457600080fd5b5061094f600480360381019061094a9190614882565b611fa9565b005b34801561095d57600080fd5b5061096661203f565b6040516109739190614732565b60405180910390f35b34801561098857600080fd5b50610991612045565b60405161099e91906146c8565b60405180910390f35b3480156109b357600080fd5b506109ce60048036038101906109c99190614421565b61206f565b005b3480156109dc57600080fd5b506109e5612108565b6040516109f2919061466a565b60405180910390f35b610a156004803603810190610a10919061468c565b61219a565b005b348015610a2357600080fd5b50610a3e6004803603810190610a399190614ab8565b6123e0565b005b348015610a4c57600080fd5b50610a55612557565b604051610a62919061466a565b60405180910390f35b348015610a7757600080fd5b50610a926004803603810190610a8d9190614421565b6125e5565b005b348015610aa057600080fd5b50610abb6004803603810190610ab69190614b99565b61267e565b005b348015610ac957600080fd5b50610ae46004803603810190610adf919061468c565b6126fa565b604051610af1919061466a565b60405180910390f35b348015610b0657600080fd5b50610b0f612852565b604051610b1c9190614732565b60405180910390f35b610b3f6004803603810190610b3a9190614c7c565b612858565b005b348015610b4d57600080fd5b50610b56612b60565b604051610b639190614732565b60405180910390f35b348015610b7857600080fd5b50610b81612b66565b604051610b8e9190614732565b60405180910390f35b348015610ba357600080fd5b50610bbe6004803603810190610bb99190614421565b612b6c565b005b348015610bcc57600080fd5b50610be76004803603810190610be29190614952565b612c05565b604051610bf491906144e2565b60405180910390f35b610c176004803603810190610c129190614c7c565b612c25565b005b348015610c2557600080fd5b50610c406004803603810190610c3b9190614cdc565b612edb565b604051610c4d91906144e2565b60405180910390f35b348015610c6257600080fd5b50610c7d6004803603810190610c789190614d1c565b612f6f565b005b348015610c8b57600080fd5b50610ca66004803603810190610ca19190614952565b613033565b005b348015610cb457600080fd5b50610cbd61312a565b604051610cca91906144e2565b60405180910390f35b348015610cdf57600080fd5b50610cfa6004803603810190610cf59190614952565b61313d565b604051610d0791906144e2565b60405180910390f35b610d1861315d565b73ffffffffffffffffffffffffffffffffffffffff16610d36612045565b73ffffffffffffffffffffffffffffffffffffffff1614610d8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8390614db5565b60405180910390fd5b80601760006101000a81548160ff02191690831515021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e7457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e845750610e8382613165565b5b9050919050565b8160135481610e98611235565b610ea29190614e04565b1115610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda90614ea6565b60405180910390fd5b610eeb61315d565b73ffffffffffffffffffffffffffffffffffffffff16610f09612045565b73ffffffffffffffffffffffffffffffffffffffff1614610f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5690614db5565b60405180910390fd5b610f6982846131cf565b505050565b606060028054610f7d90614ef5565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa990614ef5565b8015610ff65780601f10610fcb57610100808354040283529160200191610ff6565b820191906000526020600020905b815481529060010190602001808311610fd957829003601f168201915b5050505050905090565b600061100b826131ed565b611041576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061108782611cfd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110ee576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661110d61315d565b73ffffffffffffffffffffffffffffffffffffffff161415801561113f575061113d8161113861315d565b612edb565b155b15611176576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61118183838361323b565b505050565b601760009054906101000a900460ff1681565b60125481565b6111a761315d565b73ffffffffffffffffffffffffffffffffffffffff166111c5612045565b73ffffffffffffffffffffffffffffffffffffffff161461121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121290614db5565b60405180910390fd5b80601090805190602001906112319291906142ef565b5050565b600061123f6132ed565b6001546000540303905090565b6112578383836132f6565b505050565b61126461315d565b73ffffffffffffffffffffffffffffffffffffffff16611282612045565b73ffffffffffffffffffffffffffffffffffffffff16146112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf90614db5565b60405180910390fd5b8060158190555050565b6112ea61315d565b73ffffffffffffffffffffffffffffffffffffffff16611308612045565b73ffffffffffffffffffffffffffffffffffffffff161461135e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135590614db5565b60405180910390fd5b80601760036101000a81548160ff02191690831515021790555050565b600a5481565b61138961315d565b73ffffffffffffffffffffffffffffffffffffffff166113a7612045565b73ffffffffffffffffffffffffffffffffffffffff16146113fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f490614db5565b60405180910390fd5b600260095403611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990614f72565b60405180910390fd5b600260098190555060007303dc407e7818e803e835f5d6aba950f297d7764273ffffffffffffffffffffffffffffffffffffffff1660646019476114869190614f92565b611490919061501b565b60405161149c9061507d565b60006040518083038185875af1925050503d80600081146114d9576040519150601f19603f3d011682016040523d82523d6000602084013e6114de565b606091505b50509050806114ec57600080fd5b60006114f6612045565b73ffffffffffffffffffffffffffffffffffffffff16476040516115199061507d565b60006040518083038185875af1925050503d8060008114611556576040519150601f19603f3d011682016040523d82523d6000602084013e61155b565b606091505b505090508061156957600080fd5b50506001600981905550565b6115908383836040518060200160405280600081525061267e565b505050565b61159d61315d565b73ffffffffffffffffffffffffffffffffffffffff166115bb612045565b73ffffffffffffffffffffffffffffffffffffffff1614611611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160890614db5565b60405180910390fd5b8060148190555050565b6060600061162883611d26565b905060008167ffffffffffffffff81111561164657611645614757565b5b6040519080825280602002602001820160405280156116745781602001602082028036833780820191505090505b50905060006116816132ed565b90506000805b848210801561169857506013548311155b15611828576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511580156117a55750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b156117b257806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361181457838584815181106117f9576117f8615092565b5b6020026020010181815250508280611810906150c1565b9350505b838061181f906150c1565b94505050611687565b8395505050505050919050565b61183d61315d565b73ffffffffffffffffffffffffffffffffffffffff1661185b612045565b73ffffffffffffffffffffffffffffffffffffffff16146118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a890614db5565b60405180910390fd5b8060128190555050565b6118c361315d565b73ffffffffffffffffffffffffffffffffffffffff166118e1612045565b73ffffffffffffffffffffffffffffffffffffffff1614611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192e90614db5565b60405180910390fd5b806011908051906020019061194d9291906142ef565b5050565b601760029054906101000a900460ff1681565b6010805461197190614ef5565b80601f016020809104026020016040519081016040528092919081815260200182805461199d90614ef5565b80156119ea5780601f106119bf576101008083540402835291602001916119ea565b820191906000526020600020905b8154815290600101906020018083116119cd57829003601f168201915b505050505081565b80601354816119ff611235565b611a099190614e04565b1115611a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4190614ea6565b60405180910390fd5b8180601254611a599190614f92565b341015611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9290615155565b60405180910390fd5b601760049054906101000a900460ff16611aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae1906151c1565b60405180910390fd5b601554831115611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b269061522d565b60405180910390fd5b600083118015611b92575060155483600e6000611b4a61315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b8f9190614e04565b11155b611bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc89061522d565b60405180910390fd5b611be2611bdc61315d565b846131cf565b82600e6000611bef61315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c389190614e04565b92505081905550505050565b600e6020528060005260406000206000915090505481565b601760039054906101000a900460ff1681565b600f8054611c7c90614ef5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca890614ef5565b8015611cf55780601f10611cca57610100808354040283529160200191611cf5565b820191906000526020600020905b815481529060010190602001808311611cd857829003601f168201915b505050505081565b6000611d08826137aa565b600001519050919050565b601760019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d8d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611dfd61315d565b73ffffffffffffffffffffffffffffffffffffffff16611e1b612045565b73ffffffffffffffffffffffffffffffffffffffff1614611e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6890614db5565b60405180910390fd5b611e7b6000613a39565b565b611e8561315d565b73ffffffffffffffffffffffffffffffffffffffff16611ea3612045565b73ffffffffffffffffffffffffffffffffffffffff1614611ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef090614db5565b60405180910390fd5b8060168190555050565b600c6020528060005260406000206000915054906101000a900460ff1681565b611f2b61315d565b73ffffffffffffffffffffffffffffffffffffffff16611f49612045565b73ffffffffffffffffffffffffffffffffffffffff1614611f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9690614db5565b60405180910390fd5b80600a8190555050565b611fb161315d565b73ffffffffffffffffffffffffffffffffffffffff16611fcf612045565b73ffffffffffffffffffffffffffffffffffffffff1614612025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201c90614db5565b60405180910390fd5b80600f908051906020019061203b9291906142ef565b5050565b60165481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61207761315d565b73ffffffffffffffffffffffffffffffffffffffff16612095612045565b73ffffffffffffffffffffffffffffffffffffffff16146120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e290614db5565b60405180910390fd5b80601760046101000a81548160ff02191690831515021790555050565b60606003805461211790614ef5565b80601f016020809104026020016040519081016040528092919081815260200182805461214390614ef5565b80156121905780601f1061216557610100808354040283529160200191612190565b820191906000526020600020905b81548152906001019060200180831161217357829003601f168201915b5050505050905090565b80601354816121a7611235565b6121b19190614e04565b11156121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e990614ea6565b60405180910390fd5b81806012546122019190614f92565b341015612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a90615155565b60405180910390fd5b601760009054906101000a900460ff16612292576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612289906151c1565b60405180910390fd5b6015548311156122d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ce9061522d565b60405180910390fd5b600d60006122e361315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561236b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236290615299565b60405180910390fd5b61237c61237661315d565b846131cf565b6001600d600061238a61315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b6123e861315d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361244c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061245961315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661250661315d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161254b91906144e2565b60405180910390a35050565b6011805461256490614ef5565b80601f016020809104026020016040519081016040528092919081815260200182805461259090614ef5565b80156125dd5780601f106125b2576101008083540402835291602001916125dd565b820191906000526020600020905b8154815290600101906020018083116125c057829003601f168201915b505050505081565b6125ed61315d565b73ffffffffffffffffffffffffffffffffffffffff1661260b612045565b73ffffffffffffffffffffffffffffffffffffffff1614612661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265890614db5565b60405180910390fd5b80601760016101000a81548160ff02191690831515021790555050565b6126898484846132f6565b6126a88373ffffffffffffffffffffffffffffffffffffffff16613aff565b80156126bd57506126bb84848484613b22565b155b156126f4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060612705826131ed565b612744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273b9061532b565b60405180910390fd5b60001515601760029054906101000a900460ff161515036127f1576011805461276c90614ef5565b80601f016020809104026020016040519081016040528092919081815260200182805461279890614ef5565b80156127e55780601f106127ba576101008083540402835291602001916127e5565b820191906000526020600020905b8154815290600101906020018083116127c857829003601f168201915b5050505050905061284d565b60006127fb613c72565b9050600081511161281b5760405180602001604052806000815250612849565b8061282584613d04565b60106040516020016128399392919061541b565b6040516020818303038152906040525b9150505b919050565b60155481565b8260135481612865611235565b61286f9190614e04565b11156128b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a790614ea6565b60405180910390fd5b83806012546128bf9190614f92565b341015612901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f890615155565b60405180910390fd5b601760019054906101000a900460ff16612950576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612947906151c1565b60405180910390fd5b601454851115612995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298c9061522d565b60405180910390fd5b600c60006129a161315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2090615299565b60405180910390fd5b6000612a3361315d565b604051602001612a439190615494565b604051602081830303815290604052805190602001209050612aa9858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483613e64565b612ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adf906154fb565b60405180910390fd5b612af9612af361315d565b876131cf565b6001600c6000612b0761315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050505050565b60135481565b60145481565b612b7461315d565b73ffffffffffffffffffffffffffffffffffffffff16612b92612045565b73ffffffffffffffffffffffffffffffffffffffff1614612be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdf90614db5565b60405180910390fd5b80601760026101000a81548160ff02191690831515021790555050565b600b6020528060005260406000206000915054906101000a900460ff1681565b8260135481612c32611235565b612c3c9190614e04565b1115612c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7490614ea6565b60405180910390fd5b601760039054906101000a900460ff16612ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc3906151c1565b60405180910390fd5b600b6000612cd861315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5790615299565b60405180910390fd5b601654841115612da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9c9061522d565b60405180910390fd5b6000612daf61315d565b604051602001612dbf9190615494565b604051602081830303815290604052805190602001209050612e25848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483613e64565b612e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5b90615567565b60405180910390fd5b612e75612e6f61315d565b866131cf565b6001600b6000612e8361315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000612f7961315d565b604051602001612f899190615494565b604051602081830303815290604052805190602001209050612fef838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483613e64565b61302e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613025906155d3565b60405180910390fd5b505050565b61303b61315d565b73ffffffffffffffffffffffffffffffffffffffff16613059612045565b73ffffffffffffffffffffffffffffffffffffffff16146130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a690614db5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361311e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311590615665565b60405180910390fd5b61312781613a39565b50565b601760049054906101000a900460ff1681565b600d6020528060005260406000206000915054906101000a900460ff1681565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6131e9828260405180602001604052806000815250613e7b565b5050565b6000816131f86132ed565b11158015613207575060005482105b8015613234575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000613301826137aa565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461336c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661338d61315d565b73ffffffffffffffffffffffffffffffffffffffff1614806133bc57506133bb856133b661315d565b612edb565b5b8061340157506133ca61315d565b73ffffffffffffffffffffffffffffffffffffffff166133e984611000565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061343a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036134a0576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134ad8585856001613e8d565b6134b96000848761323b565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361373857600054821461373757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137a38585856001613e93565b5050505050565b6137b2614375565b6000829050806137c06132ed565b111580156137cf575060005481105b15613a02576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151613a0057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146138e4578092505050613a34565b5b6001156139ff57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146139fa578092505050613a34565b6138e5565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613b4861315d565b8786866040518563ffffffff1660e01b8152600401613b6a94939291906156da565b6020604051808303816000875af1925050508015613ba657506040513d601f19601f82011682018060405250810190613ba3919061573b565b60015b613c1f573d8060008114613bd6576040519150601f19603f3d011682016040523d82523d6000602084013e613bdb565b606091505b506000815103613c17576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f8054613c8190614ef5565b80601f0160208091040260200160405190810160405280929190818152602001828054613cad90614ef5565b8015613cfa5780601f10613ccf57610100808354040283529160200191613cfa565b820191906000526020600020905b815481529060010190602001808311613cdd57829003601f168201915b5050505050905090565b606060008203613d4b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613e5f565b600082905060005b60008214613d7d578080613d66906150c1565b915050600a82613d76919061501b565b9150613d53565b60008167ffffffffffffffff811115613d9957613d98614757565b5b6040519080825280601f01601f191660200182016040528015613dcb5781602001600182028036833780820191505090505b5090505b60008514613e5857600182613de49190615768565b9150600a85613df3919061579c565b6030613dff9190614e04565b60f81b818381518110613e1557613e14615092565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613e51919061501b565b9450613dcf565b8093505050505b919050565b600082613e718584613e99565b1490509392505050565b613e888383836001613f0e565b505050565b50505050565b50505050565b60008082905060005b8451811015613f03576000858281518110613ec057613ebf615092565b5b60200260200101519050808311613ee257613edb83826142d8565b9250613eef565b613eec81846142d8565b92505b508080613efb906150c1565b915050613ea2565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613f7a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613fb4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613fc16000868387613e8d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561418b575061418a8773ffffffffffffffffffffffffffffffffffffffff16613aff565b5b15614250575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46142006000888480600101955088613b22565b614236576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361419157826000541461424b57600080fd5b6142bb565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203614251575b8160008190555050506142d16000868387613e93565b5050505050565b600082600052816020526040600020905092915050565b8280546142fb90614ef5565b90600052602060002090601f01602090048101928261431d5760008555614364565b82601f1061433657805160ff1916838001178555614364565b82800160010185558215614364579182015b82811115614363578251825591602001919060010190614348565b5b50905061437191906143b8565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156143d15760008160009055506001016143b9565b5090565b6000604051905090565b600080fd5b600080fd5b60008115159050919050565b6143fe816143e9565b811461440957600080fd5b50565b60008135905061441b816143f5565b92915050565b600060208284031215614437576144366143df565b5b60006144458482850161440c565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6144838161444e565b811461448e57600080fd5b50565b6000813590506144a08161447a565b92915050565b6000602082840312156144bc576144bb6143df565b5b60006144ca84828501614491565b91505092915050565b6144dc816143e9565b82525050565b60006020820190506144f760008301846144d3565b92915050565b6000819050919050565b614510816144fd565b811461451b57600080fd5b50565b60008135905061452d81614507565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061455e82614533565b9050919050565b61456e81614553565b811461457957600080fd5b50565b60008135905061458b81614565565b92915050565b600080604083850312156145a8576145a76143df565b5b60006145b68582860161451e565b92505060206145c78582860161457c565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561460b5780820151818401526020810190506145f0565b8381111561461a576000848401525b50505050565b6000601f19601f8301169050919050565b600061463c826145d1565b61464681856145dc565b93506146568185602086016145ed565b61465f81614620565b840191505092915050565b600060208201905081810360008301526146848184614631565b905092915050565b6000602082840312156146a2576146a16143df565b5b60006146b08482850161451e565b91505092915050565b6146c281614553565b82525050565b60006020820190506146dd60008301846146b9565b92915050565b600080604083850312156146fa576146f96143df565b5b60006147088582860161457c565b92505060206147198582860161451e565b9150509250929050565b61472c816144fd565b82525050565b60006020820190506147476000830184614723565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61478f82614620565b810181811067ffffffffffffffff821117156147ae576147ad614757565b5b80604052505050565b60006147c16143d5565b90506147cd8282614786565b919050565b600067ffffffffffffffff8211156147ed576147ec614757565b5b6147f682614620565b9050602081019050919050565b82818337600083830152505050565b6000614825614820846147d2565b6147b7565b90508281526020810184848401111561484157614840614752565b5b61484c848285614803565b509392505050565b600082601f8301126148695761486861474d565b5b8135614879848260208601614812565b91505092915050565b600060208284031215614898576148976143df565b5b600082013567ffffffffffffffff8111156148b6576148b56143e4565b5b6148c284828501614854565b91505092915050565b6000806000606084860312156148e4576148e36143df565b5b60006148f28682870161457c565b93505060206149038682870161457c565b92505060406149148682870161451e565b9150509250925092565b6000819050919050565b6149318161491e565b82525050565b600060208201905061494c6000830184614928565b92915050565b600060208284031215614968576149676143df565b5b60006149768482850161457c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6149b4816144fd565b82525050565b60006149c683836149ab565b60208301905092915050565b6000602082019050919050565b60006149ea8261497f565b6149f4818561498a565b93506149ff8361499b565b8060005b83811015614a30578151614a1788826149ba565b9750614a22836149d2565b925050600181019050614a03565b5085935050505092915050565b60006020820190508181036000830152614a5781846149df565b905092915050565b614a688161491e565b8114614a7357600080fd5b50565b600081359050614a8581614a5f565b92915050565b600060208284031215614aa157614aa06143df565b5b6000614aaf84828501614a76565b91505092915050565b60008060408385031215614acf57614ace6143df565b5b6000614add8582860161457c565b9250506020614aee8582860161440c565b9150509250929050565b600067ffffffffffffffff821115614b1357614b12614757565b5b614b1c82614620565b9050602081019050919050565b6000614b3c614b3784614af8565b6147b7565b905082815260208101848484011115614b5857614b57614752565b5b614b63848285614803565b509392505050565b600082601f830112614b8057614b7f61474d565b5b8135614b90848260208601614b29565b91505092915050565b60008060008060808587031215614bb357614bb26143df565b5b6000614bc18782880161457c565b9450506020614bd28782880161457c565b9350506040614be38782880161451e565b925050606085013567ffffffffffffffff811115614c0457614c036143e4565b5b614c1087828801614b6b565b91505092959194509250565b600080fd5b600080fd5b60008083601f840112614c3c57614c3b61474d565b5b8235905067ffffffffffffffff811115614c5957614c58614c1c565b5b602083019150836020820283011115614c7557614c74614c21565b5b9250929050565b600080600060408486031215614c9557614c946143df565b5b6000614ca38682870161451e565b935050602084013567ffffffffffffffff811115614cc457614cc36143e4565b5b614cd086828701614c26565b92509250509250925092565b60008060408385031215614cf357614cf26143df565b5b6000614d018582860161457c565b9250506020614d128582860161457c565b9150509250929050565b60008060208385031215614d3357614d326143df565b5b600083013567ffffffffffffffff811115614d5157614d506143e4565b5b614d5d85828601614c26565b92509250509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614d9f6020836145dc565b9150614daa82614d69565b602082019050919050565b60006020820190508181036000830152614dce81614d92565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e0f826144fd565b9150614e1a836144fd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e4f57614e4e614dd5565b5b828201905092915050565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b6000614e906008836145dc565b9150614e9b82614e5a565b602082019050919050565b60006020820190508181036000830152614ebf81614e83565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614f0d57607f821691505b602082108103614f2057614f1f614ec6565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614f5c601f836145dc565b9150614f6782614f26565b602082019050919050565b60006020820190508181036000830152614f8b81614f4f565b9050919050565b6000614f9d826144fd565b9150614fa8836144fd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fe157614fe0614dd5565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615026826144fd565b9150615031836144fd565b92508261504157615040614fec565b5b828204905092915050565b600081905092915050565b50565b600061506760008361504c565b915061507282615057565b600082019050919050565b60006150888261505a565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006150cc826144fd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036150fe576150fd614dd5565b5b600182019050919050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b600061513f6012836145dc565b915061514a82615109565b602082019050919050565b6000602082019050818103600083015261516e81615132565b9050919050565b7f4e6f742052656164790000000000000000000000000000000000000000000000600082015250565b60006151ab6009836145dc565b91506151b682615175565b602082019050919050565b600060208201905081810360008301526151da8161519e565b9050919050565b7f416d6f756e74204c696d69740000000000000000000000000000000000000000600082015250565b6000615217600c836145dc565b9150615222826151e1565b602082019050919050565b600060208201905081810360008301526152468161520a565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b60006152836018836145dc565b915061528e8261524d565b602082019050919050565b600060208201905081810360008301526152b281615276565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615315602f836145dc565b9150615320826152b9565b604082019050919050565b6000602082019050818103600083015261534481615308565b9050919050565b600081905092915050565b6000615361826145d1565b61536b818561534b565b935061537b8185602086016145ed565b80840191505092915050565b60008190508160005260206000209050919050565b600081546153a981614ef5565b6153b3818661534b565b945060018216600081146153ce57600181146153df57615412565b60ff19831686528186019350615412565b6153e885615387565b60005b8381101561540a578154818901526001820191506020810190506153eb565b838801955050505b50505092915050565b60006154278286615356565b91506154338285615356565b915061543f828461539c565b9150819050949350505050565b60008160601b9050919050565b60006154648261544c565b9050919050565b600061547682615459565b9050919050565b61548e61548982614553565b61546b565b82525050565b60006154a0828461547d565b60148201915081905092915050565b7f4e6f742057686974656c69737400000000000000000000000000000000000000600082015250565b60006154e5600d836145dc565b91506154f0826154af565b602082019050919050565b60006020820190508181036000830152615514816154d8565b9050919050565b7f4e6f7420667265656d696e742061646472657373000000000000000000000000600082015250565b60006155516014836145dc565b915061555c8261551b565b602082019050919050565b6000602082019050818103600083015261558081615544565b9050919050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b60006155bd600e836145dc565b91506155c882615587565b602082019050919050565b600060208201905081810360008301526155ec816155b0565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061564f6026836145dc565b915061565a826155f3565b604082019050919050565b6000602082019050818103600083015261567e81615642565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006156ac82615685565b6156b68185615690565b93506156c68185602086016145ed565b6156cf81614620565b840191505092915050565b60006080820190506156ef60008301876146b9565b6156fc60208301866146b9565b6157096040830185614723565b818103606083015261571b81846156a1565b905095945050505050565b6000815190506157358161447a565b92915050565b600060208284031215615751576157506143df565b5b600061575f84828501615726565b91505092915050565b6000615773826144fd565b915061577e836144fd565b92508282101561579157615790614dd5565b5b828203905092915050565b60006157a7826144fd565b91506157b2836144fd565b9250826157c2576157c1614fec565b5b82820690509291505056fea26469706673582212201d8163d3b982fa4b72411992d07741787ab85405ec39c3c8d66a3599275305f464736f6c634300080d003300000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000022b80000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000054746433344000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000547464333440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046697066733a2f2f516d64346f514854746350713936516267694274657a43314c77487963727054427655697a69315265643154514e2f676663336468696464656e2e6a736f6e0000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061036b5760003560e01c806370a08231116101c6578063b88d4fde116100f7578063e0ec7c3611610095578063eb824f601161006f578063eb824f6014610c56578063f2fde38b14610c7f578063f7b7c28e14610ca8578063f7cb9e5414610cd35761036b565b8063e0ec7c3614610bc0578063e2f36dce14610bfd578063e985e9c514610c195761036b565b8063d2cab056116100d1578063d2cab05614610b25578063d5abeb0114610b41578063d5e13d6514610b6c578063e0a8085314610b975761036b565b8063b88d4fde14610a94578063c87b56dd14610abd578063cb4e832614610afa5761036b565b80638da5cb5b11610164578063a0712d681161013e578063a0712d68146109fb578063a22cb46514610a17578063a45ba8e714610a40578063b767a09814610a6b5761036b565b80638da5cb5b1461097c5780638fca32d8146109a757806395d89b41146109d05761036b565b806376e5ae4f116101a057806376e5ae4f146108c25780637cb64759146108ff5780637ec4a659146109285780637f602f33146109515761036b565b806370a0823114610845578063715018a614610882578063764f735b146108995761036b565b80633ccfd60b116102a05780635503a0e81161023e57806362ad68aa1161021857806362ad68aa1461078757806362b99ad4146107b25780636352211e146107dd5780636caede3d1461081a5761036b565b80635503a0e814610703578063575104921461072e5780635f051be51461074a5761036b565b8063438b63001161027a578063438b63001461064957806344a0d68a146106865780634fdd43cb146106af57806351830227146106d85761036b565b80633ccfd60b146105e057806342842e0e146105f7578063434a2bee146106205761036b565b806313faede61161030d57806323b872dd116102e757806323b872dd1461053a57806326745cb7146105635780632e170b511461058c5780632eb4a7ab146105b55761036b565b806313faede6146104bb57806316ba10e0146104e657806318160ddd1461050f5761036b565b806306fdde031161034957806306fdde03146103ff578063081812fc1461042a578063095ea7b3146104675780630f4161aa146104905761036b565b8063016ac5401461037057806301ffc9a71461039957806303339bcb146103d6575b600080fd5b34801561037c57600080fd5b5061039760048036038101906103929190614421565b610d10565b005b3480156103a557600080fd5b506103c060048036038101906103bb91906144a6565b610da9565b6040516103cd91906144e2565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f89190614591565b610e8b565b005b34801561040b57600080fd5b50610414610f6e565b604051610421919061466a565b60405180910390f35b34801561043657600080fd5b50610451600480360381019061044c919061468c565b611000565b60405161045e91906146c8565b60405180910390f35b34801561047357600080fd5b5061048e600480360381019061048991906146e3565b61107c565b005b34801561049c57600080fd5b506104a5611186565b6040516104b291906144e2565b60405180910390f35b3480156104c757600080fd5b506104d0611199565b6040516104dd9190614732565b60405180910390f35b3480156104f257600080fd5b5061050d60048036038101906105089190614882565b61119f565b005b34801561051b57600080fd5b50610524611235565b6040516105319190614732565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c91906148cb565b61124c565b005b34801561056f57600080fd5b5061058a6004803603810190610585919061468c565b61125c565b005b34801561059857600080fd5b506105b360048036038101906105ae9190614421565b6112e2565b005b3480156105c157600080fd5b506105ca61137b565b6040516105d79190614937565b60405180910390f35b3480156105ec57600080fd5b506105f5611381565b005b34801561060357600080fd5b5061061e600480360381019061061991906148cb565b611575565b005b34801561062c57600080fd5b506106476004803603810190610642919061468c565b611595565b005b34801561065557600080fd5b50610670600480360381019061066b9190614952565b61161b565b60405161067d9190614a3d565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a8919061468c565b611835565b005b3480156106bb57600080fd5b506106d660048036038101906106d19190614882565b6118bb565b005b3480156106e457600080fd5b506106ed611951565b6040516106fa91906144e2565b60405180910390f35b34801561070f57600080fd5b50610718611964565b604051610725919061466a565b60405180910390f35b6107486004803603810190610743919061468c565b6119f2565b005b34801561075657600080fd5b50610771600480360381019061076c9190614952565b611c44565b60405161077e9190614732565b60405180910390f35b34801561079357600080fd5b5061079c611c5c565b6040516107a991906144e2565b60405180910390f35b3480156107be57600080fd5b506107c7611c6f565b6040516107d4919061466a565b60405180910390f35b3480156107e957600080fd5b5061080460048036038101906107ff919061468c565b611cfd565b60405161081191906146c8565b60405180910390f35b34801561082657600080fd5b5061082f611d13565b60405161083c91906144e2565b60405180910390f35b34801561085157600080fd5b5061086c60048036038101906108679190614952565b611d26565b6040516108799190614732565b60405180910390f35b34801561088e57600080fd5b50610897611df5565b005b3480156108a557600080fd5b506108c060048036038101906108bb919061468c565b611e7d565b005b3480156108ce57600080fd5b506108e960048036038101906108e49190614952565b611f03565b6040516108f691906144e2565b60405180910390f35b34801561090b57600080fd5b5061092660048036038101906109219190614a8b565b611f23565b005b34801561093457600080fd5b5061094f600480360381019061094a9190614882565b611fa9565b005b34801561095d57600080fd5b5061096661203f565b6040516109739190614732565b60405180910390f35b34801561098857600080fd5b50610991612045565b60405161099e91906146c8565b60405180910390f35b3480156109b357600080fd5b506109ce60048036038101906109c99190614421565b61206f565b005b3480156109dc57600080fd5b506109e5612108565b6040516109f2919061466a565b60405180910390f35b610a156004803603810190610a10919061468c565b61219a565b005b348015610a2357600080fd5b50610a3e6004803603810190610a399190614ab8565b6123e0565b005b348015610a4c57600080fd5b50610a55612557565b604051610a62919061466a565b60405180910390f35b348015610a7757600080fd5b50610a926004803603810190610a8d9190614421565b6125e5565b005b348015610aa057600080fd5b50610abb6004803603810190610ab69190614b99565b61267e565b005b348015610ac957600080fd5b50610ae46004803603810190610adf919061468c565b6126fa565b604051610af1919061466a565b60405180910390f35b348015610b0657600080fd5b50610b0f612852565b604051610b1c9190614732565b60405180910390f35b610b3f6004803603810190610b3a9190614c7c565b612858565b005b348015610b4d57600080fd5b50610b56612b60565b604051610b639190614732565b60405180910390f35b348015610b7857600080fd5b50610b81612b66565b604051610b8e9190614732565b60405180910390f35b348015610ba357600080fd5b50610bbe6004803603810190610bb99190614421565b612b6c565b005b348015610bcc57600080fd5b50610be76004803603810190610be29190614952565b612c05565b604051610bf491906144e2565b60405180910390f35b610c176004803603810190610c129190614c7c565b612c25565b005b348015610c2557600080fd5b50610c406004803603810190610c3b9190614cdc565b612edb565b604051610c4d91906144e2565b60405180910390f35b348015610c6257600080fd5b50610c7d6004803603810190610c789190614d1c565b612f6f565b005b348015610c8b57600080fd5b50610ca66004803603810190610ca19190614952565b613033565b005b348015610cb457600080fd5b50610cbd61312a565b604051610cca91906144e2565b60405180910390f35b348015610cdf57600080fd5b50610cfa6004803603810190610cf59190614952565b61313d565b604051610d0791906144e2565b60405180910390f35b610d1861315d565b73ffffffffffffffffffffffffffffffffffffffff16610d36612045565b73ffffffffffffffffffffffffffffffffffffffff1614610d8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8390614db5565b60405180910390fd5b80601760006101000a81548160ff02191690831515021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e7457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e845750610e8382613165565b5b9050919050565b8160135481610e98611235565b610ea29190614e04565b1115610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda90614ea6565b60405180910390fd5b610eeb61315d565b73ffffffffffffffffffffffffffffffffffffffff16610f09612045565b73ffffffffffffffffffffffffffffffffffffffff1614610f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5690614db5565b60405180910390fd5b610f6982846131cf565b505050565b606060028054610f7d90614ef5565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa990614ef5565b8015610ff65780601f10610fcb57610100808354040283529160200191610ff6565b820191906000526020600020905b815481529060010190602001808311610fd957829003601f168201915b5050505050905090565b600061100b826131ed565b611041576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061108782611cfd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110ee576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661110d61315d565b73ffffffffffffffffffffffffffffffffffffffff161415801561113f575061113d8161113861315d565b612edb565b155b15611176576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61118183838361323b565b505050565b601760009054906101000a900460ff1681565b60125481565b6111a761315d565b73ffffffffffffffffffffffffffffffffffffffff166111c5612045565b73ffffffffffffffffffffffffffffffffffffffff161461121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121290614db5565b60405180910390fd5b80601090805190602001906112319291906142ef565b5050565b600061123f6132ed565b6001546000540303905090565b6112578383836132f6565b505050565b61126461315d565b73ffffffffffffffffffffffffffffffffffffffff16611282612045565b73ffffffffffffffffffffffffffffffffffffffff16146112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf90614db5565b60405180910390fd5b8060158190555050565b6112ea61315d565b73ffffffffffffffffffffffffffffffffffffffff16611308612045565b73ffffffffffffffffffffffffffffffffffffffff161461135e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135590614db5565b60405180910390fd5b80601760036101000a81548160ff02191690831515021790555050565b600a5481565b61138961315d565b73ffffffffffffffffffffffffffffffffffffffff166113a7612045565b73ffffffffffffffffffffffffffffffffffffffff16146113fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f490614db5565b60405180910390fd5b600260095403611442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143990614f72565b60405180910390fd5b600260098190555060007303dc407e7818e803e835f5d6aba950f297d7764273ffffffffffffffffffffffffffffffffffffffff1660646019476114869190614f92565b611490919061501b565b60405161149c9061507d565b60006040518083038185875af1925050503d80600081146114d9576040519150601f19603f3d011682016040523d82523d6000602084013e6114de565b606091505b50509050806114ec57600080fd5b60006114f6612045565b73ffffffffffffffffffffffffffffffffffffffff16476040516115199061507d565b60006040518083038185875af1925050503d8060008114611556576040519150601f19603f3d011682016040523d82523d6000602084013e61155b565b606091505b505090508061156957600080fd5b50506001600981905550565b6115908383836040518060200160405280600081525061267e565b505050565b61159d61315d565b73ffffffffffffffffffffffffffffffffffffffff166115bb612045565b73ffffffffffffffffffffffffffffffffffffffff1614611611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160890614db5565b60405180910390fd5b8060148190555050565b6060600061162883611d26565b905060008167ffffffffffffffff81111561164657611645614757565b5b6040519080825280602002602001820160405280156116745781602001602082028036833780820191505090505b50905060006116816132ed565b90506000805b848210801561169857506013548311155b15611828576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511580156117a55750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b156117b257806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361181457838584815181106117f9576117f8615092565b5b6020026020010181815250508280611810906150c1565b9350505b838061181f906150c1565b94505050611687565b8395505050505050919050565b61183d61315d565b73ffffffffffffffffffffffffffffffffffffffff1661185b612045565b73ffffffffffffffffffffffffffffffffffffffff16146118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a890614db5565b60405180910390fd5b8060128190555050565b6118c361315d565b73ffffffffffffffffffffffffffffffffffffffff166118e1612045565b73ffffffffffffffffffffffffffffffffffffffff1614611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192e90614db5565b60405180910390fd5b806011908051906020019061194d9291906142ef565b5050565b601760029054906101000a900460ff1681565b6010805461197190614ef5565b80601f016020809104026020016040519081016040528092919081815260200182805461199d90614ef5565b80156119ea5780601f106119bf576101008083540402835291602001916119ea565b820191906000526020600020905b8154815290600101906020018083116119cd57829003601f168201915b505050505081565b80601354816119ff611235565b611a099190614e04565b1115611a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4190614ea6565b60405180910390fd5b8180601254611a599190614f92565b341015611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9290615155565b60405180910390fd5b601760049054906101000a900460ff16611aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae1906151c1565b60405180910390fd5b601554831115611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b269061522d565b60405180910390fd5b600083118015611b92575060155483600e6000611b4a61315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b8f9190614e04565b11155b611bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc89061522d565b60405180910390fd5b611be2611bdc61315d565b846131cf565b82600e6000611bef61315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c389190614e04565b92505081905550505050565b600e6020528060005260406000206000915090505481565b601760039054906101000a900460ff1681565b600f8054611c7c90614ef5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca890614ef5565b8015611cf55780601f10611cca57610100808354040283529160200191611cf5565b820191906000526020600020905b815481529060010190602001808311611cd857829003601f168201915b505050505081565b6000611d08826137aa565b600001519050919050565b601760019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d8d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611dfd61315d565b73ffffffffffffffffffffffffffffffffffffffff16611e1b612045565b73ffffffffffffffffffffffffffffffffffffffff1614611e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6890614db5565b60405180910390fd5b611e7b6000613a39565b565b611e8561315d565b73ffffffffffffffffffffffffffffffffffffffff16611ea3612045565b73ffffffffffffffffffffffffffffffffffffffff1614611ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef090614db5565b60405180910390fd5b8060168190555050565b600c6020528060005260406000206000915054906101000a900460ff1681565b611f2b61315d565b73ffffffffffffffffffffffffffffffffffffffff16611f49612045565b73ffffffffffffffffffffffffffffffffffffffff1614611f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9690614db5565b60405180910390fd5b80600a8190555050565b611fb161315d565b73ffffffffffffffffffffffffffffffffffffffff16611fcf612045565b73ffffffffffffffffffffffffffffffffffffffff1614612025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201c90614db5565b60405180910390fd5b80600f908051906020019061203b9291906142ef565b5050565b60165481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61207761315d565b73ffffffffffffffffffffffffffffffffffffffff16612095612045565b73ffffffffffffffffffffffffffffffffffffffff16146120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e290614db5565b60405180910390fd5b80601760046101000a81548160ff02191690831515021790555050565b60606003805461211790614ef5565b80601f016020809104026020016040519081016040528092919081815260200182805461214390614ef5565b80156121905780601f1061216557610100808354040283529160200191612190565b820191906000526020600020905b81548152906001019060200180831161217357829003601f168201915b5050505050905090565b80601354816121a7611235565b6121b19190614e04565b11156121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e990614ea6565b60405180910390fd5b81806012546122019190614f92565b341015612243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223a90615155565b60405180910390fd5b601760009054906101000a900460ff16612292576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612289906151c1565b60405180910390fd5b6015548311156122d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ce9061522d565b60405180910390fd5b600d60006122e361315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561236b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236290615299565b60405180910390fd5b61237c61237661315d565b846131cf565b6001600d600061238a61315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b6123e861315d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361244c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061245961315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661250661315d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161254b91906144e2565b60405180910390a35050565b6011805461256490614ef5565b80601f016020809104026020016040519081016040528092919081815260200182805461259090614ef5565b80156125dd5780601f106125b2576101008083540402835291602001916125dd565b820191906000526020600020905b8154815290600101906020018083116125c057829003601f168201915b505050505081565b6125ed61315d565b73ffffffffffffffffffffffffffffffffffffffff1661260b612045565b73ffffffffffffffffffffffffffffffffffffffff1614612661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265890614db5565b60405180910390fd5b80601760016101000a81548160ff02191690831515021790555050565b6126898484846132f6565b6126a88373ffffffffffffffffffffffffffffffffffffffff16613aff565b80156126bd57506126bb84848484613b22565b155b156126f4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060612705826131ed565b612744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273b9061532b565b60405180910390fd5b60001515601760029054906101000a900460ff161515036127f1576011805461276c90614ef5565b80601f016020809104026020016040519081016040528092919081815260200182805461279890614ef5565b80156127e55780601f106127ba576101008083540402835291602001916127e5565b820191906000526020600020905b8154815290600101906020018083116127c857829003601f168201915b5050505050905061284d565b60006127fb613c72565b9050600081511161281b5760405180602001604052806000815250612849565b8061282584613d04565b60106040516020016128399392919061541b565b6040516020818303038152906040525b9150505b919050565b60155481565b8260135481612865611235565b61286f9190614e04565b11156128b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a790614ea6565b60405180910390fd5b83806012546128bf9190614f92565b341015612901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f890615155565b60405180910390fd5b601760019054906101000a900460ff16612950576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612947906151c1565b60405180910390fd5b601454851115612995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298c9061522d565b60405180910390fd5b600c60006129a161315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2090615299565b60405180910390fd5b6000612a3361315d565b604051602001612a439190615494565b604051602081830303815290604052805190602001209050612aa9858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483613e64565b612ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adf906154fb565b60405180910390fd5b612af9612af361315d565b876131cf565b6001600c6000612b0761315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050505050565b60135481565b60145481565b612b7461315d565b73ffffffffffffffffffffffffffffffffffffffff16612b92612045565b73ffffffffffffffffffffffffffffffffffffffff1614612be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdf90614db5565b60405180910390fd5b80601760026101000a81548160ff02191690831515021790555050565b600b6020528060005260406000206000915054906101000a900460ff1681565b8260135481612c32611235565b612c3c9190614e04565b1115612c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7490614ea6565b60405180910390fd5b601760039054906101000a900460ff16612ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc3906151c1565b60405180910390fd5b600b6000612cd861315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5790615299565b60405180910390fd5b601654841115612da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9c9061522d565b60405180910390fd5b6000612daf61315d565b604051602001612dbf9190615494565b604051602081830303815290604052805190602001209050612e25848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483613e64565b612e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5b90615567565b60405180910390fd5b612e75612e6f61315d565b866131cf565b6001600b6000612e8361315d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000612f7961315d565b604051602001612f899190615494565b604051602081830303815290604052805190602001209050612fef838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483613e64565b61302e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613025906155d3565b60405180910390fd5b505050565b61303b61315d565b73ffffffffffffffffffffffffffffffffffffffff16613059612045565b73ffffffffffffffffffffffffffffffffffffffff16146130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a690614db5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361311e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311590615665565b60405180910390fd5b61312781613a39565b50565b601760049054906101000a900460ff1681565b600d6020528060005260406000206000915054906101000a900460ff1681565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6131e9828260405180602001604052806000815250613e7b565b5050565b6000816131f86132ed565b11158015613207575060005482105b8015613234575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000613301826137aa565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461336c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661338d61315d565b73ffffffffffffffffffffffffffffffffffffffff1614806133bc57506133bb856133b661315d565b612edb565b5b8061340157506133ca61315d565b73ffffffffffffffffffffffffffffffffffffffff166133e984611000565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061343a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036134a0576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134ad8585856001613e8d565b6134b96000848761323b565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361373857600054821461373757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137a38585856001613e93565b5050505050565b6137b2614375565b6000829050806137c06132ed565b111580156137cf575060005481105b15613a02576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151613a0057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146138e4578092505050613a34565b5b6001156139ff57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146139fa578092505050613a34565b6138e5565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613b4861315d565b8786866040518563ffffffff1660e01b8152600401613b6a94939291906156da565b6020604051808303816000875af1925050508015613ba657506040513d601f19601f82011682018060405250810190613ba3919061573b565b60015b613c1f573d8060008114613bd6576040519150601f19603f3d011682016040523d82523d6000602084013e613bdb565b606091505b506000815103613c17576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f8054613c8190614ef5565b80601f0160208091040260200160405190810160405280929190818152602001828054613cad90614ef5565b8015613cfa5780601f10613ccf57610100808354040283529160200191613cfa565b820191906000526020600020905b815481529060010190602001808311613cdd57829003601f168201915b5050505050905090565b606060008203613d4b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613e5f565b600082905060005b60008214613d7d578080613d66906150c1565b915050600a82613d76919061501b565b9150613d53565b60008167ffffffffffffffff811115613d9957613d98614757565b5b6040519080825280601f01601f191660200182016040528015613dcb5781602001600182028036833780820191505090505b5090505b60008514613e5857600182613de49190615768565b9150600a85613df3919061579c565b6030613dff9190614e04565b60f81b818381518110613e1557613e14615092565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613e51919061501b565b9450613dcf565b8093505050505b919050565b600082613e718584613e99565b1490509392505050565b613e888383836001613f0e565b505050565b50505050565b50505050565b60008082905060005b8451811015613f03576000858281518110613ec057613ebf615092565b5b60200260200101519050808311613ee257613edb83826142d8565b9250613eef565b613eec81846142d8565b92505b508080613efb906150c1565b915050613ea2565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613f7a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613fb4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613fc16000868387613e8d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561418b575061418a8773ffffffffffffffffffffffffffffffffffffffff16613aff565b5b15614250575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46142006000888480600101955088613b22565b614236576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361419157826000541461424b57600080fd5b6142bb565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203614251575b8160008190555050506142d16000868387613e93565b5050505050565b600082600052816020526040600020905092915050565b8280546142fb90614ef5565b90600052602060002090601f01602090048101928261431d5760008555614364565b82601f1061433657805160ff1916838001178555614364565b82800160010185558215614364579182015b82811115614363578251825591602001919060010190614348565b5b50905061437191906143b8565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156143d15760008160009055506001016143b9565b5090565b6000604051905090565b600080fd5b600080fd5b60008115159050919050565b6143fe816143e9565b811461440957600080fd5b50565b60008135905061441b816143f5565b92915050565b600060208284031215614437576144366143df565b5b60006144458482850161440c565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6144838161444e565b811461448e57600080fd5b50565b6000813590506144a08161447a565b92915050565b6000602082840312156144bc576144bb6143df565b5b60006144ca84828501614491565b91505092915050565b6144dc816143e9565b82525050565b60006020820190506144f760008301846144d3565b92915050565b6000819050919050565b614510816144fd565b811461451b57600080fd5b50565b60008135905061452d81614507565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061455e82614533565b9050919050565b61456e81614553565b811461457957600080fd5b50565b60008135905061458b81614565565b92915050565b600080604083850312156145a8576145a76143df565b5b60006145b68582860161451e565b92505060206145c78582860161457c565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561460b5780820151818401526020810190506145f0565b8381111561461a576000848401525b50505050565b6000601f19601f8301169050919050565b600061463c826145d1565b61464681856145dc565b93506146568185602086016145ed565b61465f81614620565b840191505092915050565b600060208201905081810360008301526146848184614631565b905092915050565b6000602082840312156146a2576146a16143df565b5b60006146b08482850161451e565b91505092915050565b6146c281614553565b82525050565b60006020820190506146dd60008301846146b9565b92915050565b600080604083850312156146fa576146f96143df565b5b60006147088582860161457c565b92505060206147198582860161451e565b9150509250929050565b61472c816144fd565b82525050565b60006020820190506147476000830184614723565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61478f82614620565b810181811067ffffffffffffffff821117156147ae576147ad614757565b5b80604052505050565b60006147c16143d5565b90506147cd8282614786565b919050565b600067ffffffffffffffff8211156147ed576147ec614757565b5b6147f682614620565b9050602081019050919050565b82818337600083830152505050565b6000614825614820846147d2565b6147b7565b90508281526020810184848401111561484157614840614752565b5b61484c848285614803565b509392505050565b600082601f8301126148695761486861474d565b5b8135614879848260208601614812565b91505092915050565b600060208284031215614898576148976143df565b5b600082013567ffffffffffffffff8111156148b6576148b56143e4565b5b6148c284828501614854565b91505092915050565b6000806000606084860312156148e4576148e36143df565b5b60006148f28682870161457c565b93505060206149038682870161457c565b92505060406149148682870161451e565b9150509250925092565b6000819050919050565b6149318161491e565b82525050565b600060208201905061494c6000830184614928565b92915050565b600060208284031215614968576149676143df565b5b60006149768482850161457c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6149b4816144fd565b82525050565b60006149c683836149ab565b60208301905092915050565b6000602082019050919050565b60006149ea8261497f565b6149f4818561498a565b93506149ff8361499b565b8060005b83811015614a30578151614a1788826149ba565b9750614a22836149d2565b925050600181019050614a03565b5085935050505092915050565b60006020820190508181036000830152614a5781846149df565b905092915050565b614a688161491e565b8114614a7357600080fd5b50565b600081359050614a8581614a5f565b92915050565b600060208284031215614aa157614aa06143df565b5b6000614aaf84828501614a76565b91505092915050565b60008060408385031215614acf57614ace6143df565b5b6000614add8582860161457c565b9250506020614aee8582860161440c565b9150509250929050565b600067ffffffffffffffff821115614b1357614b12614757565b5b614b1c82614620565b9050602081019050919050565b6000614b3c614b3784614af8565b6147b7565b905082815260208101848484011115614b5857614b57614752565b5b614b63848285614803565b509392505050565b600082601f830112614b8057614b7f61474d565b5b8135614b90848260208601614b29565b91505092915050565b60008060008060808587031215614bb357614bb26143df565b5b6000614bc18782880161457c565b9450506020614bd28782880161457c565b9350506040614be38782880161451e565b925050606085013567ffffffffffffffff811115614c0457614c036143e4565b5b614c1087828801614b6b565b91505092959194509250565b600080fd5b600080fd5b60008083601f840112614c3c57614c3b61474d565b5b8235905067ffffffffffffffff811115614c5957614c58614c1c565b5b602083019150836020820283011115614c7557614c74614c21565b5b9250929050565b600080600060408486031215614c9557614c946143df565b5b6000614ca38682870161451e565b935050602084013567ffffffffffffffff811115614cc457614cc36143e4565b5b614cd086828701614c26565b92509250509250925092565b60008060408385031215614cf357614cf26143df565b5b6000614d018582860161457c565b9250506020614d128582860161457c565b9150509250929050565b60008060208385031215614d3357614d326143df565b5b600083013567ffffffffffffffff811115614d5157614d506143e4565b5b614d5d85828601614c26565b92509250509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614d9f6020836145dc565b9150614daa82614d69565b602082019050919050565b60006020820190508181036000830152614dce81614d92565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e0f826144fd565b9150614e1a836144fd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e4f57614e4e614dd5565b5b828201905092915050565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b6000614e906008836145dc565b9150614e9b82614e5a565b602082019050919050565b60006020820190508181036000830152614ebf81614e83565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614f0d57607f821691505b602082108103614f2057614f1f614ec6565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614f5c601f836145dc565b9150614f6782614f26565b602082019050919050565b60006020820190508181036000830152614f8b81614f4f565b9050919050565b6000614f9d826144fd565b9150614fa8836144fd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fe157614fe0614dd5565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615026826144fd565b9150615031836144fd565b92508261504157615040614fec565b5b828204905092915050565b600081905092915050565b50565b600061506760008361504c565b915061507282615057565b600082019050919050565b60006150888261505a565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006150cc826144fd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036150fe576150fd614dd5565b5b600182019050919050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b600061513f6012836145dc565b915061514a82615109565b602082019050919050565b6000602082019050818103600083015261516e81615132565b9050919050565b7f4e6f742052656164790000000000000000000000000000000000000000000000600082015250565b60006151ab6009836145dc565b91506151b682615175565b602082019050919050565b600060208201905081810360008301526151da8161519e565b9050919050565b7f416d6f756e74204c696d69740000000000000000000000000000000000000000600082015250565b6000615217600c836145dc565b9150615222826151e1565b602082019050919050565b600060208201905081810360008301526152468161520a565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b60006152836018836145dc565b915061528e8261524d565b602082019050919050565b600060208201905081810360008301526152b281615276565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615315602f836145dc565b9150615320826152b9565b604082019050919050565b6000602082019050818103600083015261534481615308565b9050919050565b600081905092915050565b6000615361826145d1565b61536b818561534b565b935061537b8185602086016145ed565b80840191505092915050565b60008190508160005260206000209050919050565b600081546153a981614ef5565b6153b3818661534b565b945060018216600081146153ce57600181146153df57615412565b60ff19831686528186019350615412565b6153e885615387565b60005b8381101561540a578154818901526001820191506020810190506153eb565b838801955050505b50505092915050565b60006154278286615356565b91506154338285615356565b915061543f828461539c565b9150819050949350505050565b60008160601b9050919050565b60006154648261544c565b9050919050565b600061547682615459565b9050919050565b61548e61548982614553565b61546b565b82525050565b60006154a0828461547d565b60148201915081905092915050565b7f4e6f742057686974656c69737400000000000000000000000000000000000000600082015250565b60006154e5600d836145dc565b91506154f0826154af565b602082019050919050565b60006020820190508181036000830152615514816154d8565b9050919050565b7f4e6f7420667265656d696e742061646472657373000000000000000000000000600082015250565b60006155516014836145dc565b915061555c8261551b565b602082019050919050565b6000602082019050818103600083015261558081615544565b9050919050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b60006155bd600e836145dc565b91506155c882615587565b602082019050919050565b600060208201905081810360008301526155ec816155b0565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061564f6026836145dc565b915061565a826155f3565b604082019050919050565b6000602082019050818103600083015261567e81615642565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006156ac82615685565b6156b68185615690565b93506156c68185602086016145ed565b6156cf81614620565b840191505092915050565b60006080820190506156ef60008301876146b9565b6156fc60208301866146b9565b6157096040830185614723565b818103606083015261571b81846156a1565b905095945050505050565b6000815190506157358161447a565b92915050565b600060208284031215615751576157506143df565b5b600061575f84828501615726565b91505092915050565b6000615773826144fd565b915061577e836144fd565b92508282101561579157615790614dd5565b5b828203905092915050565b60006157a7826144fd565b91506157b2836144fd565b9250826157c2576157c1614fec565b5b82820690509291505056fea26469706673582212201d8163d3b982fa4b72411992d07741787ab85405ec39c3c8d66a3599275305f464736f6c634300080d0033

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

00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000022b80000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000054746433344000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000547464333440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046697066733a2f2f516d64346f514854746350713936516267694274657a43314c77487963727054427655697a69315265643154514e2f676663336468696464656e2e6a736f6e0000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): GFC3D
Arg [1] : _tokenSymbol (string): GFC3D
Arg [2] : _cost (uint256): 10000000000000000
Arg [3] : _maxSupply (uint256): 8888
Arg [4] : _capWhitelist (uint256): 5
Arg [5] : _capPublic (uint256): 10
Arg [6] : _capFreemint (uint256): 2
Arg [7] : _hiddenMetadataUri (string): ipfs://Qmd4oQHTtcPq96QbgiBtezC1LwHycrpTBvUizi1Red1TQN/gfc3dhidden.json

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [3] : 00000000000000000000000000000000000000000000000000000000000022b8
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [9] : 4746433344000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [11] : 4746433344000000000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000046
Arg [13] : 697066733a2f2f516d64346f514854746350713936516267694274657a43314c
Arg [14] : 77487963727054427655697a69315265643154514e2f67666333646869646465
Arg [15] : 6e2e6a736f6e0000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

50600:7516:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57280:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32454:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53912:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35567:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37070:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36633:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51221:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51074:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57174:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31703:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37935:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56717:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57609:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50691:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57710:293;;;;;;;;;;;;;:::i;:::-;;38176:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56605:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54647:796;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56195:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56927:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51308:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50996:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53411:437;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50884:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51341:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50946:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35375:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51263:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32823:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10174:103;;;;;;;;;;;;;:::i;:::-;;56819:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50773:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56275:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57068:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51188:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9523:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57498:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35736:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53006:387;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37346:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51034:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57383:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38432:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55556:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51159:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52400:600;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51098:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51127:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56108:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50721:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54065:548;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37704:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56379:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10432:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51381:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50830:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57280:99;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57367:6:::1;57347:17;;:26;;;;;;;;;;;;;;;;;;57280:99:::0;:::o;32454:305::-;32556:4;32608:25;32593:40;;;:11;:40;;;;:105;;;;32665:33;32650:48;;;:11;:48;;;;32593:105;:158;;;;32715:36;32739:11;32715:23;:36::i;:::-;32593:158;32573:178;;32454:305;;;:::o;53912:148::-;53991:11;52098:9;;52083:11;52067:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;52059:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9754:12:::1;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54021:33:::2;54031:9;54042:11;54021:9;:33::i;:::-;53912:148:::0;;;:::o;35567:100::-;35621:13;35654:5;35647:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35567:100;:::o;37070:204::-;37138:7;37163:16;37171:7;37163;:16::i;:::-;37158:64;;37188:34;;;;;;;;;;;;;;37158:64;37242:15;:24;37258:7;37242:24;;;;;;;;;;;;;;;;;;;;;37235:31;;37070:204;;;:::o;36633:371::-;36706:13;36722:24;36738:7;36722:15;:24::i;:::-;36706:40;;36767:5;36761:11;;:2;:11;;;36757:48;;36781:24;;;;;;;;;;;;;;36757:48;36838:5;36822:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;36848:37;36865:5;36872:12;:10;:12::i;:::-;36848:16;:37::i;:::-;36847:38;36822:63;36818:138;;;36909:35;;;;;;;;;;;;;;36818:138;36968:28;36977:2;36981:7;36990:5;36968:8;:28::i;:::-;36695:309;36633:371;;:::o;51221:37::-;;;;;;;;;;;;;:::o;51074:19::-;;;;:::o;57174:100::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57258:10:::1;57246:9;:22;;;;;;;;;;;;:::i;:::-;;57174:100:::0;:::o;31703:303::-;31747:7;31972:15;:13;:15::i;:::-;31957:12;;31941:13;;:28;:46;31934:53;;31703:303;:::o;37935:170::-;38069:28;38079:4;38085:2;38089:7;38069:9;:28::i;:::-;37935:170;;;:::o;56717:98::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56799:10:::1;56787:9;:22;;;;56717:98:::0;:::o;57609:95::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57692:6:::1;57674:15;;:24;;;;;;;;;;;;;;;;;;57609:95:::0;:::o;50691:25::-;;;;:::o;57710:293::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1:::1;2410:7;;:19:::0;2402:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;57768:7:::2;57789:42;57781:56;;57874:3;57869:2;57845:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;57781:101;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57767:115;;;57897:2;57889:11;;;::::0;::::2;;57908:7;57929;:5;:7::i;:::-;57921:21;;57950;57921:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57907:69;;;57991:2;57983:11;;;::::0;::::2;;57760:243;;1768:1:::1;2722:7;:22;;;;57710:293::o:0;38176:185::-;38314:39;38331:4;38337:2;38341:7;38314:39;;;;;;;;;;;;:16;:39::i;:::-;38176:185;;;:::o;56605:106::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56692:13:::1;56677:12;:28;;;;56605:106:::0;:::o;54647:796::-;54707:16;54732:23;54758:17;54768:6;54758:9;:17::i;:::-;54732:43;;54782:30;54829:15;54815:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54782:63;;54852:22;54877:15;:13;:15::i;:::-;54852:40;;54899:23;54933:26;54968:441;54993:15;54975;:33;:64;;;;;55030:9;;55012:14;:27;;54975:64;54968:441;;;55050:31;55084:11;:27;55096:14;55084:27;;;;;;;;;;;55050:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55127:9;:16;;;55126:17;:49;;;;;55173:1;55147:28;;:9;:14;;;:28;;;;55126:49;55122:111;;;55209:9;:14;;;55188:35;;55122:111;55269:6;55247:28;;:18;:28;;;55243:132;;55321:14;55288:13;55302:15;55288:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;55348:17;;;;;:::i;:::-;;;;55243:132;55385:16;;;;;:::i;:::-;;;;55041:368;54968:441;;;55424:13;55417:20;;;;;;;54647:796;;;:::o;56195:74::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56258:5:::1;56251:4;:12;;;;56195:74:::0;:::o;56927:132::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57035:18:::1;57015:17;:38;;;;;;;;;;;;:::i;:::-;;56927:132:::0;:::o;51308:28::-;;;;;;;;;;;;;:::o;50996:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53411:437::-;53483:11;52098:9;;52083:11;52067:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;52059:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;53516:11:::1;52225;52218:4;;:18;;;;:::i;:::-;52205:9;:31;;52197:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;53544:18:::2;;;;;;;;;;;53536:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;53606:9;;53591:11;:24;;53583:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;53660:1;53646:11;:15;:78;;;;;53715:9;;53700:11;53665:18;:32;53684:12;:10;:12::i;:::-;53665:32;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:59;;53646:78;53638:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;53752:36;53762:12;:10;:12::i;:::-;53776:11;53752:9;:36::i;:::-;53831:11;53795:18;:32;53814:12;:10;:12::i;:::-;53795:32;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;52127:1:::1;53411:437:::0;;:::o;50884:53::-;;;;;;;;;;;;;;;;;:::o;51341:35::-;;;;;;;;;;;;;:::o;50946:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35375:125::-;35439:7;35466:21;35479:7;35466:12;:21::i;:::-;:26;;;35459:33;;35375:125;;;:::o;51263:40::-;;;;;;;;;;;;;:::o;32823:206::-;32887:7;32928:1;32911:19;;:5;:19;;;32907:60;;32939:28;;;;;;;;;;;;;;32907:60;32993:12;:19;33006:5;32993:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;32985:36;;32978:43;;32823:206;;;:::o;10174:103::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10239:30:::1;10266:1;10239:18;:30::i;:::-;10174:103::o:0;56819:102::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56903:12:::1;56889:11;:26;;;;56819:102:::0;:::o;50773:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;56275:98::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56356:11:::1;56343:10;:24;;;;56275:98:::0;:::o;57068:100::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57152:10:::1;57140:9;:22;;;;;;;;;;;;:::i;:::-;;57068:100:::0;:::o;51188:26::-;;;;:::o;9523:87::-;9569:7;9596:6;;;;;;;;;;;9589:13;;9523:87;:::o;57498:103::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57589:6:::1;57568:18;;:27;;;;;;;;;;;;;;;;;;57498:103:::0;:::o;35736:104::-;35792:13;35825:7;35818:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35736:104;:::o;53006:387::-;53071:11;52098:9;;52083:11;52067:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;52059:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;53104:11:::1;52225;52218:4;;:18;;;;:::i;:::-;52205:9;:31;;52197:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;53132:17:::2;;;;;;;;;;;53124:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;53193:9;;53178:11;:24;;53170:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;53234:17;:31;53252:12;:10;:12::i;:::-;53234:31;;;;;;;;;;;;;;;;;;;;;;;;;53233:32;53225:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53306:36;53316:12;:10;:12::i;:::-;53330:11;53306:9;:36::i;:::-;53383:4;53349:17;:31;53367:12;:10;:12::i;:::-;53349:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;52127:1:::1;53006:387:::0;;:::o;37346:287::-;37457:12;:10;:12::i;:::-;37445:24;;:8;:24;;;37441:54;;37478:17;;;;;;;;;;;;;;37441:54;37553:8;37508:18;:32;37527:12;:10;:12::i;:::-;37508:32;;;;;;;;;;;;;;;:42;37541:8;37508:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;37606:8;37577:48;;37592:12;:10;:12::i;:::-;37577:48;;;37616:8;37577:48;;;;;;:::i;:::-;;;;;;;;37346:287;;:::o;51034:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57383:107::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57478:6:::1;57455:20;;:29;;;;;;;;;;;;;;;;;;57383:107:::0;:::o;38432:369::-;38599:28;38609:4;38615:2;38619:7;38599:9;:28::i;:::-;38642:15;:2;:13;;;:15::i;:::-;:76;;;;;38662:56;38693:4;38699:2;38703:7;38712:5;38662:30;:56::i;:::-;38661:57;38642:76;38638:156;;;38742:40;;;;;;;;;;;;;;38638:156;38432:369;;;;:::o;55556:445::-;55630:13;55660:17;55668:8;55660:7;:17::i;:::-;55652:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;55754:5;55742:17;;:8;;;;;;;;;;;:17;;;55738:64;;55777:17;55770:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55738:64;55810:28;55841:10;:8;:10::i;:::-;55810:41;;55896:1;55871:14;55865:28;:32;:130;;;;;;;;;;;;;;;;;55933:14;55949:19;:8;:17;:19::i;:::-;55970:9;55916:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55865:130;55858:137;;;55556:445;;;;:::o;51159:24::-;;;;:::o;52400:600::-;52513:11;52098:9;;52083:11;52067:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;52059:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;52552:11:::1;52225;52218:4;;:18;;;;:::i;:::-;52205:9;:31;;52197:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;52580:20:::2;;;;;;;;;;;52572:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;52644:12;;52629:11;:27;;52621:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;52688:20;:34;52709:12;:10;:12::i;:::-;52688:34;;;;;;;;;;;;;;;;;;;;;;;;;52687:35;52679:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;52758:12;52800;:10;:12::i;:::-;52783:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;52773:41;;;;;;52758:56;;52829:50;52848:12;;52829:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52862:10;;52874:4;52829:18;:50::i;:::-;52821:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52910:36;52920:12;:10;:12::i;:::-;52934:11;52910:9;:36::i;:::-;52990:4;52953:20;:34;52974:12;:10;:12::i;:::-;52953:34;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;52565:435;52127:1:::1;52400:600:::0;;;;:::o;51098:24::-;;;;:::o;51127:27::-;;;;:::o;56108:81::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56177:6:::1;56166:8;;:17;;;;;;;;;;;;;;;;;;56108:81:::0;:::o;50721:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;54065:548::-;54173:11;52098:9;;52083:11;52067:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;52059:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54208:15:::1;;;;;;;;;;;54200:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;54253:15;:29;54269:12;:10;:12::i;:::-;54253:29;;;;;;;;;;;;;;;;;;;;;;;;;54252:30;54244:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;54341:11;;54326;:26;;54318:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;54375:12;54417;:10;:12::i;:::-;54400:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;54390:41;;;;;;54375:56;;54446:50;54465:12;;54446:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54479:10;;54491:4;54446:18;:50::i;:::-;54438:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;54528:36;54538:12;:10;:12::i;:::-;54552:11;54528:9;:36::i;:::-;54603:4;54571:15;:29;54587:12;:10;:12::i;:::-;54571:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;54192:421;54065:548:::0;;;;:::o;37704:164::-;37801:4;37825:18;:25;37844:5;37825:25;;;;;;;;;;;;;;;:35;37851:8;37825:35;;;;;;;;;;;;;;;;;;;;;;;;;37818:42;;37704:164;;;;:::o;56379:220::-;56453:12;56495;:10;:12::i;:::-;56478:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;56468:41;;;;;;56453:56;;56524:50;56543:12;;56524:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56557:10;;56569:4;56524:18;:50::i;:::-;56516:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;56446:153;56379:220;;:::o;10432:201::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10541:1:::1;10521:22;;:8;:22;;::::0;10513:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;10597:28;10616:8;10597:18;:28::i;:::-;10432:201:::0;:::o;51381:38::-;;;;;;;;;;;;;:::o;50830:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;8247:98::-;8300:7;8327:10;8320:17;;8247:98;:::o;22330:157::-;22415:4;22454:25;22439:40;;;:11;:40;;;;22432:47;;22330:157;;;:::o;39238:104::-;39307:27;39317:2;39321:8;39307:27;;;;;;;;;;;;:9;:27::i;:::-;39238:104;;:::o;39056:174::-;39113:4;39156:7;39137:15;:13;:15::i;:::-;:26;;:53;;;;;39177:13;;39167:7;:23;39137:53;:85;;;;;39195:11;:20;39207:7;39195:20;;;;;;;;;;;:27;;;;;;;;;;;;39194:28;39137:85;39130:92;;39056:174;;;:::o;47213:196::-;47355:2;47328:15;:24;47344:7;47328:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47393:7;47389:2;47373:28;;47382:5;47373:28;;;;;;;;;;;;47213:196;;;:::o;55449:101::-;55514:7;55541:1;55534:8;;55449:101;:::o;42156:2130::-;42271:35;42309:21;42322:7;42309:12;:21::i;:::-;42271:59;;42369:4;42347:26;;:13;:18;;;:26;;;42343:67;;42382:28;;;;;;;;;;;;;;42343:67;42423:22;42465:4;42449:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;42486:36;42503:4;42509:12;:10;:12::i;:::-;42486:16;:36::i;:::-;42449:73;:126;;;;42563:12;:10;:12::i;:::-;42539:36;;:20;42551:7;42539:11;:20::i;:::-;:36;;;42449:126;42423:153;;42594:17;42589:66;;42620:35;;;;;;;;;;;;;;42589:66;42684:1;42670:16;;:2;:16;;;42666:52;;42695:23;;;;;;;;;;;;;;42666:52;42731:43;42753:4;42759:2;42763:7;42772:1;42731:21;:43::i;:::-;42839:35;42856:1;42860:7;42869:4;42839:8;:35::i;:::-;43200:1;43170:12;:18;43183:4;43170:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43244:1;43216:12;:16;43229:2;43216:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43262:31;43296:11;:20;43308:7;43296:20;;;;;;;;;;;43262:54;;43347:2;43331:8;:13;;;:18;;;;;;;;;;;;;;;;;;43397:15;43364:8;:23;;;:49;;;;;;;;;;;;;;;;;;43665:19;43697:1;43687:7;:11;43665:33;;43713:31;43747:11;:24;43759:11;43747:24;;;;;;;;;;;43713:58;;43815:1;43790:27;;:8;:13;;;;;;;;;;;;:27;;;43786:384;;44000:13;;43985:11;:28;43981:174;;44054:4;44038:8;:13;;;:20;;;;;;;;;;;;;;;;;;44107:13;:28;;;44081:8;:23;;;:54;;;;;;;;;;;;;;;;;;43981:174;43786:384;43145:1036;;;44217:7;44213:2;44198:27;;44207:4;44198:27;;;;;;;;;;;;44236:42;44257:4;44263:2;44267:7;44276:1;44236:20;:42::i;:::-;42260:2026;;42156:2130;;;:::o;34204:1109::-;34266:21;;:::i;:::-;34300:12;34315:7;34300:22;;34383:4;34364:15;:13;:15::i;:::-;:23;;:47;;;;;34398:13;;34391:4;:20;34364:47;34360:886;;;34432:31;34466:11;:17;34478:4;34466:17;;;;;;;;;;;34432:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34507:9;:16;;;34502:729;;34578:1;34552:28;;:9;:14;;;:28;;;34548:101;;34616:9;34609:16;;;;;;34548:101;34951:261;34958:4;34951:261;;;34991:6;;;;;;;;35036:11;:17;35048:4;35036:17;;;;;;;;;;;35024:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35110:1;35084:28;;:9;:14;;;:28;;;35080:109;;35152:9;35145:16;;;;;;35080:109;34951:261;;;34502:729;34413:833;34360:886;35274:31;;;;;;;;;;;;;;34204:1109;;;;:::o;10793:191::-;10867:16;10886:6;;;;;;;;;;;10867:25;;10912:8;10903:6;;:17;;;;;;;;;;;;;;;;;;10967:8;10936:40;;10957:8;10936:40;;;;;;;;;;;;10856:128;10793:191;:::o;12224:326::-;12284:4;12541:1;12519:7;:19;;;:23;12512:30;;12224:326;;;:::o;47901:667::-;48064:4;48101:2;48085:36;;;48122:12;:10;:12::i;:::-;48136:4;48142:7;48151:5;48085:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48081:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48336:1;48319:6;:13;:18;48315:235;;48365:40;;;;;;;;;;;;;;48315:235;48508:6;48502:13;48493:6;48489:2;48485:15;48478:38;48081:480;48214:45;;;48204:55;;;:6;:55;;;;48197:62;;;47901:667;;;;;;:::o;58009:104::-;58069:13;58098:9;58091:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58009:104;:::o;5809:723::-;5865:13;6095:1;6086:5;:10;6082:53;;6113:10;;;;;;;;;;;;;;;;;;;;;6082:53;6145:12;6160:5;6145:20;;6176:14;6201:78;6216:1;6208:4;:9;6201:78;;6234:8;;;;;:::i;:::-;;;;6265:2;6257:10;;;;;:::i;:::-;;;6201:78;;;6289:19;6321:6;6311:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6289:39;;6339:154;6355:1;6346:5;:10;6339:154;;6383:1;6373:11;;;;;:::i;:::-;;;6450:2;6442:5;:10;;;;:::i;:::-;6429:2;:24;;;;:::i;:::-;6416:39;;6399:6;6406;6399:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6479:2;6470:11;;;;;:::i;:::-;;;6339:154;;;6517:6;6503:21;;;;;5809:723;;;;:::o;3979:190::-;4104:4;4157;4128:25;4141:5;4148:4;4128:12;:25::i;:::-;:33;4121:40;;3979:190;;;;;:::o;39705:163::-;39828:32;39834:2;39838:8;39848:5;39855:4;39828:5;:32::i;:::-;39705:163;;;:::o;49216:159::-;;;;;:::o;50034:158::-;;;;;:::o;4530:675::-;4613:7;4633:20;4656:4;4633:27;;4676:9;4671:497;4695:5;:12;4691:1;:16;4671:497;;;4729:20;4752:5;4758:1;4752:8;;;;;;;;:::i;:::-;;;;;;;;4729:31;;4795:12;4779;:28;4775:382;;4922:42;4937:12;4951;4922:14;:42::i;:::-;4907:57;;4775:382;;;5099:42;5114:12;5128;5099:14;:42::i;:::-;5084:57;;4775:382;4714:454;4709:3;;;;;:::i;:::-;;;;4671:497;;;;5185:12;5178:19;;;4530:675;;;;:::o;40127:1775::-;40266:20;40289:13;;40266:36;;40331:1;40317:16;;:2;:16;;;40313:48;;40342:19;;;;;;;;;;;;;;40313:48;40388:1;40376:8;:13;40372:44;;40398:18;;;;;;;;;;;;;;40372:44;40429:61;40459:1;40463:2;40467:12;40481:8;40429:21;:61::i;:::-;40802:8;40767:12;:16;40780:2;40767:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40866:8;40826:12;:16;40839:2;40826:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40925:2;40892:11;:25;40904:12;40892:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40992:15;40942:11;:25;40954:12;40942:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;41025:20;41048:12;41025:35;;41075:11;41104:8;41089:12;:23;41075:37;;41133:4;:23;;;;;41141:15;:2;:13;;;:15::i;:::-;41133:23;41129:641;;;41177:314;41233:12;41229:2;41208:38;;41225:1;41208:38;;;;;;;;;;;;41274:69;41313:1;41317:2;41321:14;;;;;;41337:5;41274:30;:69::i;:::-;41269:174;;41379:40;;;;;;;;;;;;;;41269:174;41486:3;41470:12;:19;41177:314;;41572:12;41555:13;;:29;41551:43;;41586:8;;;41551:43;41129:641;;;41635:120;41691:14;;;;;;41687:2;41666:40;;41683:1;41666:40;;;;;;;;;;;;41750:3;41734:12;:19;41635:120;;41129:641;41800:12;41784:13;:28;;;;40742:1082;;41834:60;41863:1;41867:2;41871:12;41885:8;41834:20;:60::i;:::-;40255:1647;40127:1775;;;;:::o;5213:224::-;5281:13;5344:1;5338:4;5331:15;5373:1;5367:4;5360:15;5414:4;5408;5398:21;5389:30;;5213:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:90;368:7;411:5;404:13;397:21;386:32;;334:90;;;:::o;430:116::-;500:21;515:5;500:21;:::i;:::-;493:5;490:32;480:60;;536:1;533;526:12;480:60;430:116;:::o;552:133::-;595:5;633:6;620:20;611:29;;649:30;673:5;649:30;:::i;:::-;552:133;;;;:::o;691:323::-;747:6;796:2;784:9;775:7;771:23;767:32;764:119;;;802:79;;:::i;:::-;764:119;922:1;947:50;989:7;980:6;969:9;965:22;947:50;:::i;:::-;937:60;;893:114;691:323;;;;:::o;1020:149::-;1056:7;1096:66;1089:5;1085:78;1074:89;;1020:149;;;:::o;1175:120::-;1247:23;1264:5;1247:23;:::i;:::-;1240:5;1237:34;1227:62;;1285:1;1282;1275:12;1227:62;1175:120;:::o;1301:137::-;1346:5;1384:6;1371:20;1362:29;;1400:32;1426:5;1400:32;:::i;:::-;1301:137;;;;:::o;1444:327::-;1502:6;1551:2;1539:9;1530:7;1526:23;1522:32;1519:119;;;1557:79;;:::i;:::-;1519:119;1677:1;1702:52;1746:7;1737:6;1726:9;1722:22;1702:52;:::i;:::-;1692:62;;1648:116;1444:327;;;;:::o;1777:109::-;1858:21;1873:5;1858:21;:::i;:::-;1853:3;1846:34;1777:109;;:::o;1892:210::-;1979:4;2017:2;2006:9;2002:18;1994:26;;2030:65;2092:1;2081:9;2077:17;2068:6;2030:65;:::i;:::-;1892:210;;;;:::o;2108:77::-;2145:7;2174:5;2163:16;;2108:77;;;:::o;2191:122::-;2264:24;2282:5;2264:24;:::i;:::-;2257:5;2254:35;2244:63;;2303:1;2300;2293:12;2244:63;2191:122;:::o;2319:139::-;2365:5;2403:6;2390:20;2381:29;;2419:33;2446:5;2419:33;:::i;:::-;2319:139;;;;:::o;2464:126::-;2501:7;2541:42;2534:5;2530:54;2519:65;;2464:126;;;:::o;2596:96::-;2633:7;2662:24;2680:5;2662:24;:::i;:::-;2651:35;;2596:96;;;:::o;2698:122::-;2771:24;2789:5;2771:24;:::i;:::-;2764:5;2761:35;2751:63;;2810:1;2807;2800:12;2751:63;2698:122;:::o;2826:139::-;2872:5;2910:6;2897:20;2888:29;;2926:33;2953:5;2926:33;:::i;:::-;2826:139;;;;:::o;2971:474::-;3039:6;3047;3096:2;3084:9;3075:7;3071:23;3067:32;3064:119;;;3102:79;;:::i;:::-;3064:119;3222:1;3247:53;3292:7;3283:6;3272:9;3268:22;3247:53;:::i;:::-;3237:63;;3193:117;3349:2;3375:53;3420:7;3411:6;3400:9;3396:22;3375:53;:::i;:::-;3365:63;;3320:118;2971:474;;;;;:::o;3451:99::-;3503:6;3537:5;3531:12;3521:22;;3451:99;;;:::o;3556:169::-;3640:11;3674:6;3669:3;3662:19;3714:4;3709:3;3705:14;3690:29;;3556:169;;;;:::o;3731:307::-;3799:1;3809:113;3823:6;3820:1;3817:13;3809:113;;;3908:1;3903:3;3899:11;3893:18;3889:1;3884:3;3880:11;3873:39;3845:2;3842:1;3838:10;3833:15;;3809:113;;;3940:6;3937:1;3934:13;3931:101;;;4020:1;4011:6;4006:3;4002:16;3995:27;3931:101;3780:258;3731:307;;;:::o;4044:102::-;4085:6;4136:2;4132:7;4127:2;4120:5;4116:14;4112:28;4102:38;;4044:102;;;:::o;4152:364::-;4240:3;4268:39;4301:5;4268:39;:::i;:::-;4323:71;4387:6;4382:3;4323:71;:::i;:::-;4316:78;;4403:52;4448:6;4443:3;4436:4;4429:5;4425:16;4403:52;:::i;:::-;4480:29;4502:6;4480:29;:::i;:::-;4475:3;4471:39;4464:46;;4244:272;4152:364;;;;:::o;4522:313::-;4635:4;4673:2;4662:9;4658:18;4650:26;;4722:9;4716:4;4712:20;4708:1;4697:9;4693:17;4686:47;4750:78;4823:4;4814:6;4750:78;:::i;:::-;4742:86;;4522:313;;;;:::o;4841:329::-;4900:6;4949:2;4937:9;4928:7;4924:23;4920:32;4917:119;;;4955:79;;:::i;:::-;4917:119;5075:1;5100:53;5145:7;5136:6;5125:9;5121:22;5100:53;:::i;:::-;5090:63;;5046:117;4841:329;;;;:::o;5176:118::-;5263:24;5281:5;5263:24;:::i;:::-;5258:3;5251:37;5176:118;;:::o;5300:222::-;5393:4;5431:2;5420:9;5416:18;5408:26;;5444:71;5512:1;5501:9;5497:17;5488:6;5444:71;:::i;:::-;5300:222;;;;:::o;5528:474::-;5596:6;5604;5653:2;5641:9;5632:7;5628:23;5624:32;5621:119;;;5659:79;;:::i;:::-;5621:119;5779:1;5804:53;5849:7;5840:6;5829:9;5825:22;5804:53;:::i;:::-;5794:63;;5750:117;5906:2;5932:53;5977:7;5968:6;5957:9;5953:22;5932:53;:::i;:::-;5922:63;;5877:118;5528:474;;;;;:::o;6008:118::-;6095:24;6113:5;6095:24;:::i;:::-;6090:3;6083:37;6008:118;;:::o;6132:222::-;6225:4;6263:2;6252:9;6248:18;6240:26;;6276:71;6344:1;6333:9;6329:17;6320:6;6276:71;:::i;:::-;6132:222;;;;:::o;6360:117::-;6469:1;6466;6459:12;6483:117;6592:1;6589;6582:12;6606:180;6654:77;6651:1;6644:88;6751:4;6748:1;6741:15;6775:4;6772:1;6765:15;6792:281;6875:27;6897:4;6875:27;:::i;:::-;6867:6;6863:40;7005:6;6993:10;6990:22;6969:18;6957:10;6954:34;6951:62;6948:88;;;7016:18;;:::i;:::-;6948:88;7056:10;7052:2;7045:22;6835:238;6792:281;;:::o;7079:129::-;7113:6;7140:20;;:::i;:::-;7130:30;;7169:33;7197:4;7189:6;7169:33;:::i;:::-;7079:129;;;:::o;7214:308::-;7276:4;7366:18;7358:6;7355:30;7352:56;;;7388:18;;:::i;:::-;7352:56;7426:29;7448:6;7426:29;:::i;:::-;7418:37;;7510:4;7504;7500:15;7492:23;;7214:308;;;:::o;7528:154::-;7612:6;7607:3;7602;7589:30;7674:1;7665:6;7660:3;7656:16;7649:27;7528:154;;;:::o;7688:412::-;7766:5;7791:66;7807:49;7849:6;7807:49;:::i;:::-;7791:66;:::i;:::-;7782:75;;7880:6;7873:5;7866:21;7918:4;7911:5;7907:16;7956:3;7947:6;7942:3;7938:16;7935:25;7932:112;;;7963:79;;:::i;:::-;7932:112;8053:41;8087:6;8082:3;8077;8053:41;:::i;:::-;7772:328;7688:412;;;;;:::o;8120:340::-;8176:5;8225:3;8218:4;8210:6;8206:17;8202:27;8192:122;;8233:79;;:::i;:::-;8192:122;8350:6;8337:20;8375:79;8450:3;8442:6;8435:4;8427:6;8423:17;8375:79;:::i;:::-;8366:88;;8182:278;8120:340;;;;:::o;8466:509::-;8535:6;8584:2;8572:9;8563:7;8559:23;8555:32;8552:119;;;8590:79;;:::i;:::-;8552:119;8738:1;8727:9;8723:17;8710:31;8768:18;8760:6;8757:30;8754:117;;;8790:79;;:::i;:::-;8754:117;8895:63;8950:7;8941:6;8930:9;8926:22;8895:63;:::i;:::-;8885:73;;8681:287;8466:509;;;;:::o;8981:619::-;9058:6;9066;9074;9123:2;9111:9;9102:7;9098:23;9094:32;9091:119;;;9129:79;;:::i;:::-;9091:119;9249:1;9274:53;9319:7;9310:6;9299:9;9295:22;9274:53;:::i;:::-;9264:63;;9220:117;9376:2;9402:53;9447:7;9438:6;9427:9;9423:22;9402:53;:::i;:::-;9392:63;;9347:118;9504:2;9530:53;9575:7;9566:6;9555:9;9551:22;9530:53;:::i;:::-;9520:63;;9475:118;8981:619;;;;;:::o;9606:77::-;9643:7;9672:5;9661:16;;9606:77;;;:::o;9689:118::-;9776:24;9794:5;9776:24;:::i;:::-;9771:3;9764:37;9689:118;;:::o;9813:222::-;9906:4;9944:2;9933:9;9929:18;9921:26;;9957:71;10025:1;10014:9;10010:17;10001:6;9957:71;:::i;:::-;9813:222;;;;:::o;10041:329::-;10100:6;10149:2;10137:9;10128:7;10124:23;10120:32;10117:119;;;10155:79;;:::i;:::-;10117:119;10275:1;10300:53;10345:7;10336:6;10325:9;10321:22;10300:53;:::i;:::-;10290:63;;10246:117;10041:329;;;;:::o;10376:114::-;10443:6;10477:5;10471:12;10461:22;;10376:114;;;:::o;10496:184::-;10595:11;10629:6;10624:3;10617:19;10669:4;10664:3;10660:14;10645:29;;10496:184;;;;:::o;10686:132::-;10753:4;10776:3;10768:11;;10806:4;10801:3;10797:14;10789:22;;10686:132;;;:::o;10824:108::-;10901:24;10919:5;10901:24;:::i;:::-;10896:3;10889:37;10824:108;;:::o;10938:179::-;11007:10;11028:46;11070:3;11062:6;11028:46;:::i;:::-;11106:4;11101:3;11097:14;11083:28;;10938:179;;;;:::o;11123:113::-;11193:4;11225;11220:3;11216:14;11208:22;;11123:113;;;:::o;11272:732::-;11391:3;11420:54;11468:5;11420:54;:::i;:::-;11490:86;11569:6;11564:3;11490:86;:::i;:::-;11483:93;;11600:56;11650:5;11600:56;:::i;:::-;11679:7;11710:1;11695:284;11720:6;11717:1;11714:13;11695:284;;;11796:6;11790:13;11823:63;11882:3;11867:13;11823:63;:::i;:::-;11816:70;;11909:60;11962:6;11909:60;:::i;:::-;11899:70;;11755:224;11742:1;11739;11735:9;11730:14;;11695:284;;;11699:14;11995:3;11988:10;;11396:608;;;11272:732;;;;:::o;12010:373::-;12153:4;12191:2;12180:9;12176:18;12168:26;;12240:9;12234:4;12230:20;12226:1;12215:9;12211:17;12204:47;12268:108;12371:4;12362:6;12268:108;:::i;:::-;12260:116;;12010:373;;;;:::o;12389:122::-;12462:24;12480:5;12462:24;:::i;:::-;12455:5;12452:35;12442:63;;12501:1;12498;12491:12;12442:63;12389:122;:::o;12517:139::-;12563:5;12601:6;12588:20;12579:29;;12617:33;12644:5;12617:33;:::i;:::-;12517:139;;;;:::o;12662:329::-;12721:6;12770:2;12758:9;12749:7;12745:23;12741:32;12738:119;;;12776:79;;:::i;:::-;12738:119;12896:1;12921:53;12966:7;12957:6;12946:9;12942:22;12921:53;:::i;:::-;12911:63;;12867:117;12662:329;;;;:::o;12997:468::-;13062:6;13070;13119:2;13107:9;13098:7;13094:23;13090:32;13087:119;;;13125:79;;:::i;:::-;13087:119;13245:1;13270:53;13315:7;13306:6;13295:9;13291:22;13270:53;:::i;:::-;13260:63;;13216:117;13372:2;13398:50;13440:7;13431:6;13420:9;13416:22;13398:50;:::i;:::-;13388:60;;13343:115;12997:468;;;;;:::o;13471:307::-;13532:4;13622:18;13614:6;13611:30;13608:56;;;13644:18;;:::i;:::-;13608:56;13682:29;13704:6;13682:29;:::i;:::-;13674:37;;13766:4;13760;13756:15;13748:23;;13471:307;;;:::o;13784:410::-;13861:5;13886:65;13902:48;13943:6;13902:48;:::i;:::-;13886:65;:::i;:::-;13877:74;;13974:6;13967:5;13960:21;14012:4;14005:5;14001:16;14050:3;14041:6;14036:3;14032:16;14029:25;14026:112;;;14057:79;;:::i;:::-;14026:112;14147:41;14181:6;14176:3;14171;14147:41;:::i;:::-;13867:327;13784:410;;;;;:::o;14213:338::-;14268:5;14317:3;14310:4;14302:6;14298:17;14294:27;14284:122;;14325:79;;:::i;:::-;14284:122;14442:6;14429:20;14467:78;14541:3;14533:6;14526:4;14518:6;14514:17;14467:78;:::i;:::-;14458:87;;14274:277;14213:338;;;;:::o;14557:943::-;14652:6;14660;14668;14676;14725:3;14713:9;14704:7;14700:23;14696:33;14693:120;;;14732:79;;:::i;:::-;14693:120;14852:1;14877:53;14922:7;14913:6;14902:9;14898:22;14877:53;:::i;:::-;14867:63;;14823:117;14979:2;15005:53;15050:7;15041:6;15030:9;15026:22;15005:53;:::i;:::-;14995:63;;14950:118;15107:2;15133:53;15178:7;15169:6;15158:9;15154:22;15133:53;:::i;:::-;15123:63;;15078:118;15263:2;15252:9;15248:18;15235:32;15294:18;15286:6;15283:30;15280:117;;;15316:79;;:::i;:::-;15280:117;15421:62;15475:7;15466:6;15455:9;15451:22;15421:62;:::i;:::-;15411:72;;15206:287;14557:943;;;;;;;:::o;15506:117::-;15615:1;15612;15605:12;15629:117;15738:1;15735;15728:12;15769:568;15842:8;15852:6;15902:3;15895:4;15887:6;15883:17;15879:27;15869:122;;15910:79;;:::i;:::-;15869:122;16023:6;16010:20;16000:30;;16053:18;16045:6;16042:30;16039:117;;;16075:79;;:::i;:::-;16039:117;16189:4;16181:6;16177:17;16165:29;;16243:3;16235:4;16227:6;16223:17;16213:8;16209:32;16206:41;16203:128;;;16250:79;;:::i;:::-;16203:128;15769:568;;;;;:::o;16343:704::-;16438:6;16446;16454;16503:2;16491:9;16482:7;16478:23;16474:32;16471:119;;;16509:79;;:::i;:::-;16471:119;16629:1;16654:53;16699:7;16690:6;16679:9;16675:22;16654:53;:::i;:::-;16644:63;;16600:117;16784:2;16773:9;16769:18;16756:32;16815:18;16807:6;16804:30;16801:117;;;16837:79;;:::i;:::-;16801:117;16950:80;17022:7;17013:6;17002:9;16998:22;16950:80;:::i;:::-;16932:98;;;;16727:313;16343:704;;;;;:::o;17053:474::-;17121:6;17129;17178:2;17166:9;17157:7;17153:23;17149:32;17146:119;;;17184:79;;:::i;:::-;17146:119;17304:1;17329:53;17374:7;17365:6;17354:9;17350:22;17329:53;:::i;:::-;17319:63;;17275:117;17431:2;17457:53;17502:7;17493:6;17482:9;17478:22;17457:53;:::i;:::-;17447:63;;17402:118;17053:474;;;;;:::o;17533:559::-;17619:6;17627;17676:2;17664:9;17655:7;17651:23;17647:32;17644:119;;;17682:79;;:::i;:::-;17644:119;17830:1;17819:9;17815:17;17802:31;17860:18;17852:6;17849:30;17846:117;;;17882:79;;:::i;:::-;17846:117;17995:80;18067:7;18058:6;18047:9;18043:22;17995:80;:::i;:::-;17977:98;;;;17773:312;17533:559;;;;;:::o;18098:182::-;18238:34;18234:1;18226:6;18222:14;18215:58;18098:182;:::o;18286:366::-;18428:3;18449:67;18513:2;18508:3;18449:67;:::i;:::-;18442:74;;18525:93;18614:3;18525:93;:::i;:::-;18643:2;18638:3;18634:12;18627:19;;18286:366;;;:::o;18658:419::-;18824:4;18862:2;18851:9;18847:18;18839:26;;18911:9;18905:4;18901:20;18897:1;18886:9;18882:17;18875:47;18939:131;19065:4;18939:131;:::i;:::-;18931:139;;18658:419;;;:::o;19083:180::-;19131:77;19128:1;19121:88;19228:4;19225:1;19218:15;19252:4;19249:1;19242:15;19269:305;19309:3;19328:20;19346:1;19328:20;:::i;:::-;19323:25;;19362:20;19380:1;19362:20;:::i;:::-;19357:25;;19516:1;19448:66;19444:74;19441:1;19438:81;19435:107;;;19522:18;;:::i;:::-;19435:107;19566:1;19563;19559:9;19552:16;;19269:305;;;;:::o;19580:158::-;19720:10;19716:1;19708:6;19704:14;19697:34;19580:158;:::o;19744:365::-;19886:3;19907:66;19971:1;19966:3;19907:66;:::i;:::-;19900:73;;19982:93;20071:3;19982:93;:::i;:::-;20100:2;20095:3;20091:12;20084:19;;19744:365;;;:::o;20115:419::-;20281:4;20319:2;20308:9;20304:18;20296:26;;20368:9;20362:4;20358:20;20354:1;20343:9;20339:17;20332:47;20396:131;20522:4;20396:131;:::i;:::-;20388:139;;20115:419;;;:::o;20540:180::-;20588:77;20585:1;20578:88;20685:4;20682:1;20675:15;20709:4;20706:1;20699:15;20726:320;20770:6;20807:1;20801:4;20797:12;20787:22;;20854:1;20848:4;20844:12;20875:18;20865:81;;20931:4;20923:6;20919:17;20909:27;;20865:81;20993:2;20985:6;20982:14;20962:18;20959:38;20956:84;;21012:18;;:::i;:::-;20956:84;20777:269;20726:320;;;:::o;21052:181::-;21192:33;21188:1;21180:6;21176:14;21169:57;21052:181;:::o;21239:366::-;21381:3;21402:67;21466:2;21461:3;21402:67;:::i;:::-;21395:74;;21478:93;21567:3;21478:93;:::i;:::-;21596:2;21591:3;21587:12;21580:19;;21239:366;;;:::o;21611:419::-;21777:4;21815:2;21804:9;21800:18;21792:26;;21864:9;21858:4;21854:20;21850:1;21839:9;21835:17;21828:47;21892:131;22018:4;21892:131;:::i;:::-;21884:139;;21611:419;;;:::o;22036:348::-;22076:7;22099:20;22117:1;22099:20;:::i;:::-;22094:25;;22133:20;22151:1;22133:20;:::i;:::-;22128:25;;22321:1;22253:66;22249:74;22246:1;22243:81;22238:1;22231:9;22224:17;22220:105;22217:131;;;22328:18;;:::i;:::-;22217:131;22376:1;22373;22369:9;22358:20;;22036:348;;;;:::o;22390:180::-;22438:77;22435:1;22428:88;22535:4;22532:1;22525:15;22559:4;22556:1;22549:15;22576:185;22616:1;22633:20;22651:1;22633:20;:::i;:::-;22628:25;;22667:20;22685:1;22667:20;:::i;:::-;22662:25;;22706:1;22696:35;;22711:18;;:::i;:::-;22696:35;22753:1;22750;22746:9;22741:14;;22576:185;;;;:::o;22767:147::-;22868:11;22905:3;22890:18;;22767:147;;;;:::o;22920:114::-;;:::o;23040:398::-;23199:3;23220:83;23301:1;23296:3;23220:83;:::i;:::-;23213:90;;23312:93;23401:3;23312:93;:::i;:::-;23430:1;23425:3;23421:11;23414:18;;23040:398;;;:::o;23444:379::-;23628:3;23650:147;23793:3;23650:147;:::i;:::-;23643:154;;23814:3;23807:10;;23444:379;;;:::o;23829:180::-;23877:77;23874:1;23867:88;23974:4;23971:1;23964:15;23998:4;23995:1;23988:15;24015:233;24054:3;24077:24;24095:5;24077:24;:::i;:::-;24068:33;;24123:66;24116:5;24113:77;24110:103;;24193:18;;:::i;:::-;24110:103;24240:1;24233:5;24229:13;24222:20;;24015:233;;;:::o;24254:168::-;24394:20;24390:1;24382:6;24378:14;24371:44;24254:168;:::o;24428:366::-;24570:3;24591:67;24655:2;24650:3;24591:67;:::i;:::-;24584:74;;24667:93;24756:3;24667:93;:::i;:::-;24785:2;24780:3;24776:12;24769:19;;24428:366;;;:::o;24800:419::-;24966:4;25004:2;24993:9;24989:18;24981:26;;25053:9;25047:4;25043:20;25039:1;25028:9;25024:17;25017:47;25081:131;25207:4;25081:131;:::i;:::-;25073:139;;24800:419;;;:::o;25225:159::-;25365:11;25361:1;25353:6;25349:14;25342:35;25225:159;:::o;25390:365::-;25532:3;25553:66;25617:1;25612:3;25553:66;:::i;:::-;25546:73;;25628:93;25717:3;25628:93;:::i;:::-;25746:2;25741:3;25737:12;25730:19;;25390:365;;;:::o;25761:419::-;25927:4;25965:2;25954:9;25950:18;25942:26;;26014:9;26008:4;26004:20;26000:1;25989:9;25985:17;25978:47;26042:131;26168:4;26042:131;:::i;:::-;26034:139;;25761:419;;;:::o;26186:162::-;26326:14;26322:1;26314:6;26310:14;26303:38;26186:162;:::o;26354:366::-;26496:3;26517:67;26581:2;26576:3;26517:67;:::i;:::-;26510:74;;26593:93;26682:3;26593:93;:::i;:::-;26711:2;26706:3;26702:12;26695:19;;26354:366;;;:::o;26726:419::-;26892:4;26930:2;26919:9;26915:18;26907:26;;26979:9;26973:4;26969:20;26965:1;26954:9;26950:17;26943:47;27007:131;27133:4;27007:131;:::i;:::-;26999:139;;26726:419;;;:::o;27151:174::-;27291:26;27287:1;27279:6;27275:14;27268:50;27151:174;:::o;27331:366::-;27473:3;27494:67;27558:2;27553:3;27494:67;:::i;:::-;27487:74;;27570:93;27659:3;27570:93;:::i;:::-;27688:2;27683:3;27679:12;27672:19;;27331:366;;;:::o;27703:419::-;27869:4;27907:2;27896:9;27892:18;27884:26;;27956:9;27950:4;27946:20;27942:1;27931:9;27927:17;27920:47;27984:131;28110:4;27984:131;:::i;:::-;27976:139;;27703:419;;;:::o;28128:234::-;28268:34;28264:1;28256:6;28252:14;28245:58;28337:17;28332:2;28324:6;28320:15;28313:42;28128:234;:::o;28368:366::-;28510:3;28531:67;28595:2;28590:3;28531:67;:::i;:::-;28524:74;;28607:93;28696:3;28607:93;:::i;:::-;28725:2;28720:3;28716:12;28709:19;;28368:366;;;:::o;28740:419::-;28906:4;28944:2;28933:9;28929:18;28921:26;;28993:9;28987:4;28983:20;28979:1;28968:9;28964:17;28957:47;29021:131;29147:4;29021:131;:::i;:::-;29013:139;;28740:419;;;:::o;29165:148::-;29267:11;29304:3;29289:18;;29165:148;;;;:::o;29319:377::-;29425:3;29453:39;29486:5;29453:39;:::i;:::-;29508:89;29590:6;29585:3;29508:89;:::i;:::-;29501:96;;29606:52;29651:6;29646:3;29639:4;29632:5;29628:16;29606:52;:::i;:::-;29683:6;29678:3;29674:16;29667:23;;29429:267;29319:377;;;;:::o;29702:141::-;29751:4;29774:3;29766:11;;29797:3;29794:1;29787:14;29831:4;29828:1;29818:18;29810:26;;29702:141;;;:::o;29873:845::-;29976:3;30013:5;30007:12;30042:36;30068:9;30042:36;:::i;:::-;30094:89;30176:6;30171:3;30094:89;:::i;:::-;30087:96;;30214:1;30203:9;30199:17;30230:1;30225:137;;;;30376:1;30371:341;;;;30192:520;;30225:137;30309:4;30305:9;30294;30290:25;30285:3;30278:38;30345:6;30340:3;30336:16;30329:23;;30225:137;;30371:341;30438:38;30470:5;30438:38;:::i;:::-;30498:1;30512:154;30526:6;30523:1;30520:13;30512:154;;;30600:7;30594:14;30590:1;30585:3;30581:11;30574:35;30650:1;30641:7;30637:15;30626:26;;30548:4;30545:1;30541:12;30536:17;;30512:154;;;30695:6;30690:3;30686:16;30679:23;;30378:334;;30192:520;;29980:738;;29873:845;;;;:::o;30724:589::-;30949:3;30971:95;31062:3;31053:6;30971:95;:::i;:::-;30964:102;;31083:95;31174:3;31165:6;31083:95;:::i;:::-;31076:102;;31195:92;31283:3;31274:6;31195:92;:::i;:::-;31188:99;;31304:3;31297:10;;30724:589;;;;;;:::o;31319:94::-;31352:8;31400:5;31396:2;31392:14;31371:35;;31319:94;;;:::o;31419:::-;31458:7;31487:20;31501:5;31487:20;:::i;:::-;31476:31;;31419:94;;;:::o;31519:100::-;31558:7;31587:26;31607:5;31587:26;:::i;:::-;31576:37;;31519:100;;;:::o;31625:157::-;31730:45;31750:24;31768:5;31750:24;:::i;:::-;31730:45;:::i;:::-;31725:3;31718:58;31625:157;;:::o;31788:256::-;31900:3;31915:75;31986:3;31977:6;31915:75;:::i;:::-;32015:2;32010:3;32006:12;31999:19;;32035:3;32028:10;;31788:256;;;;:::o;32050:163::-;32190:15;32186:1;32178:6;32174:14;32167:39;32050:163;:::o;32219:366::-;32361:3;32382:67;32446:2;32441:3;32382:67;:::i;:::-;32375:74;;32458:93;32547:3;32458:93;:::i;:::-;32576:2;32571:3;32567:12;32560:19;;32219:366;;;:::o;32591:419::-;32757:4;32795:2;32784:9;32780:18;32772:26;;32844:9;32838:4;32834:20;32830:1;32819:9;32815:17;32808:47;32872:131;32998:4;32872:131;:::i;:::-;32864:139;;32591:419;;;:::o;33016:170::-;33156:22;33152:1;33144:6;33140:14;33133:46;33016:170;:::o;33192:366::-;33334:3;33355:67;33419:2;33414:3;33355:67;:::i;:::-;33348:74;;33431:93;33520:3;33431:93;:::i;:::-;33549:2;33544:3;33540:12;33533:19;;33192:366;;;:::o;33564:419::-;33730:4;33768:2;33757:9;33753:18;33745:26;;33817:9;33811:4;33807:20;33803:1;33792:9;33788:17;33781:47;33845:131;33971:4;33845:131;:::i;:::-;33837:139;;33564:419;;;:::o;33989:164::-;34129:16;34125:1;34117:6;34113:14;34106:40;33989:164;:::o;34159:366::-;34301:3;34322:67;34386:2;34381:3;34322:67;:::i;:::-;34315:74;;34398:93;34487:3;34398:93;:::i;:::-;34516:2;34511:3;34507:12;34500:19;;34159:366;;;:::o;34531:419::-;34697:4;34735:2;34724:9;34720:18;34712:26;;34784:9;34778:4;34774:20;34770:1;34759:9;34755:17;34748:47;34812:131;34938:4;34812:131;:::i;:::-;34804:139;;34531:419;;;:::o;34956:225::-;35096:34;35092:1;35084:6;35080:14;35073:58;35165:8;35160:2;35152:6;35148:15;35141:33;34956:225;:::o;35187:366::-;35329:3;35350:67;35414:2;35409:3;35350:67;:::i;:::-;35343:74;;35426:93;35515:3;35426:93;:::i;:::-;35544:2;35539:3;35535:12;35528:19;;35187:366;;;:::o;35559:419::-;35725:4;35763:2;35752:9;35748:18;35740:26;;35812:9;35806:4;35802:20;35798:1;35787:9;35783:17;35776:47;35840:131;35966:4;35840:131;:::i;:::-;35832:139;;35559:419;;;:::o;35984:98::-;36035:6;36069:5;36063:12;36053:22;;35984:98;;;:::o;36088:168::-;36171:11;36205:6;36200:3;36193:19;36245:4;36240:3;36236:14;36221:29;;36088:168;;;;:::o;36262:360::-;36348:3;36376:38;36408:5;36376:38;:::i;:::-;36430:70;36493:6;36488:3;36430:70;:::i;:::-;36423:77;;36509:52;36554:6;36549:3;36542:4;36535:5;36531:16;36509:52;:::i;:::-;36586:29;36608:6;36586:29;:::i;:::-;36581:3;36577:39;36570:46;;36352:270;36262:360;;;;:::o;36628:640::-;36823:4;36861:3;36850:9;36846:19;36838:27;;36875:71;36943:1;36932:9;36928:17;36919:6;36875:71;:::i;:::-;36956:72;37024:2;37013:9;37009:18;37000:6;36956:72;:::i;:::-;37038;37106:2;37095:9;37091:18;37082:6;37038:72;:::i;:::-;37157:9;37151:4;37147:20;37142:2;37131:9;37127:18;37120:48;37185:76;37256:4;37247:6;37185:76;:::i;:::-;37177:84;;36628:640;;;;;;;:::o;37274:141::-;37330:5;37361:6;37355:13;37346:22;;37377:32;37403:5;37377:32;:::i;:::-;37274:141;;;;:::o;37421:349::-;37490:6;37539:2;37527:9;37518:7;37514:23;37510:32;37507:119;;;37545:79;;:::i;:::-;37507:119;37665:1;37690:63;37745:7;37736:6;37725:9;37721:22;37690:63;:::i;:::-;37680:73;;37636:127;37421:349;;;;:::o;37776:191::-;37816:4;37836:20;37854:1;37836:20;:::i;:::-;37831:25;;37870:20;37888:1;37870:20;:::i;:::-;37865:25;;37909:1;37906;37903:8;37900:34;;;37914:18;;:::i;:::-;37900:34;37959:1;37956;37952:9;37944:17;;37776:191;;;;:::o;37973:176::-;38005:1;38022:20;38040:1;38022:20;:::i;:::-;38017:25;;38056:20;38074:1;38056:20;:::i;:::-;38051:25;;38095:1;38085:35;;38100:18;;:::i;:::-;38085:35;38141:1;38138;38134:9;38129:14;;37973:176;;;;:::o

Swarm Source

ipfs://1d8163d3b982fa4b72411992d07741787ab85405ec39c3c8d66a3599275305f4
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.