ETH Price: $3,422.17 (-0.53%)
Gas: 2 Gwei

Token

Dragon Fruits (DF)
 

Overview

Max Total Supply

119 DF

Holders

75

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
mcning.eth
Balance
2 DF
0xddb0766ff83a91980c0cc4b9137e089bd8385d7a
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:
SimpleMinter

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @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/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/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/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @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: contracts/SmartContract.sol



pragma solidity^0.8.0;




contract SimpleMinter is ERC721Enumerable, Ownable {
    using Counters for Counters.Counter;
    using Strings for uint256;
    using SafeMath for uint256;

    string baseURI; // pointer for our nft image location
    string baseExtension = ".json";
    uint256 price = 0.01 ether; // price of nft
    uint256 maxMintAmount= 1; // max per tx
    uint256 maxPerWallet = 5; // max per wallet
    uint256 maxSupply = 555; // total amount of nfts we have
    uint256 public startTime;
    Counters.Counter private _tokenTracker;
    constructor( // just a simple constructor
        string memory _baseUri,  
        string memory _symbol, 
        string memory _name,
        uint256 _startTime)
        ERC721(_name, _symbol) {
            setBaseURI(_baseUri);
            startTime = _startTime;

        }
    function setStartTime(uint256 _startTime) public onlyOwner {
        startTime = _startTime;
    }
    function setMaxTx(uint256 num) public onlyOwner {
        maxMintAmount = num;
    }

    function setBaseExtension(string memory _ext) public onlyOwner {
        baseExtension = _ext;
    }

    function setMaxWallet(uint256 num) public onlyOwner {
        maxPerWallet = num;
    }

    function setMaxSupply(uint256 num) public onlyOwner {
        maxSupply = num;
    }


    function setBaseURI(string memory _givenBaseURI) public onlyOwner {
        baseURI = _givenBaseURI; // set our baseURI to x 
    }

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

    function mint() public payable {
        uint256 alreadyMinted = totalSupply(); // see how many have already been minted
        require(alreadyMinted + 1 <= maxSupply, "We cannot supply this amount"); // check we have enough to mint 
        uint256 userBal = balanceOf(msg.sender);
        require(userBal < maxPerWallet, "You are not allowed this many in one wallet");
        require(block.timestamp >= startTime, "Sale is not live yet");
        if (alreadyMinted >= 55) {
            require(msg.value >= price, "User did not send enough ether with this tx"); // check they are paying enough
        } else {
            require(userBal == 0, "You have minted the max amount during the free period"); 
        }
        _safeMint(msg.sender, _tokenTracker.current()); // mint the user there nft
        _tokenTracker.increment();
    }
    function tokenURI(uint256 tokenID) public view virtual override returns(string memory) {
        require(_exists(tokenID), "This token does not exist");
        string memory currBaseURI = _baseURI();
        return bytes(currBaseURI).length > 0 ? string(abi.encodePacked(currBaseURI, tokenID.toString(), baseExtension)):""; // for opensea and other places to find the data of our nft    
    }

    function _widthdraw(address _address, uint256 _amount) internal {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }

    function withdrawAll() public onlyOwner {
       uint256 balance = address(this).balance;
       require(balance > 0, "There is no funds to withdraw");
       _widthdraw(0x43558232F2fD87c34F5a254f96493e55aBb89C50 , balance.mul(20).div(100)); // 20%
       _widthdraw(0xb82F051524Ff138ceac7A62184739D399D714388 , balance.mul(50).div(100)); // 50%
       _widthdraw(0x48D7B79a2b31C2ad4fE285F9F6De9a02033D12a1 , balance.mul(20).div(100)); // 20%
       _widthdraw(0xfA86599BBAc7e2B2A32922D575d38DA31E27Ca6F , balance.mul(10).div(100)); // 10%
       _widthdraw(0xb82F051524Ff138ceac7A62184739D399D714388, address(this).balance); // anything else (this should never be reached)
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_startTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_ext","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_givenBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c908051906020019062000051929190620002bb565b50662386f26fc10000600d556001600e556005600f5561022b6010553480156200007a57600080fd5b5060405162004af438038062004af48339818101604052810190620000a0919062000400565b81838160009080519060200190620000ba929190620002bb565b508060019080519060200190620000d3929190620002bb565b505050620000f6620000ea6200011860201b60201c565b6200012060201b60201c565b6200010784620001e660201b60201c565b8060118190555050505050620006fa565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001f66200011860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200021c6200029160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000275576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026c90620004f6565b60405180910390fd5b80600b90805190602001906200028d929190620002bb565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002c990620005c8565b90600052602060002090601f016020900481019282620002ed576000855562000339565b82601f106200030857805160ff191683800117855562000339565b8280016001018555821562000339579182015b82811115620003385782518255916020019190600101906200031b565b5b5090506200034891906200034c565b5090565b5b80821115620003675760008160009055506001016200034d565b5090565b6000620003826200037c8462000541565b62000518565b905082815260208101848484011115620003a157620003a062000697565b5b620003ae84828562000592565b509392505050565b600082601f830112620003ce57620003cd62000692565b5b8151620003e08482602086016200036b565b91505092915050565b600081519050620003fa81620006e0565b92915050565b600080600080608085870312156200041d576200041c620006a1565b5b600085015167ffffffffffffffff8111156200043e576200043d6200069c565b5b6200044c87828801620003b6565b945050602085015167ffffffffffffffff81111562000470576200046f6200069c565b5b6200047e87828801620003b6565b935050604085015167ffffffffffffffff811115620004a257620004a16200069c565b5b620004b087828801620003b6565b9250506060620004c387828801620003e9565b91505092959194509250565b6000620004de60208362000577565b9150620004eb82620006b7565b602082019050919050565b600060208201905081810360008301526200051181620004cf565b9050919050565b60006200052462000537565b9050620005328282620005fe565b919050565b6000604051905090565b600067ffffffffffffffff8211156200055f576200055e62000663565b5b6200056a82620006a6565b9050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60005b83811015620005b257808201518184015260208101905062000595565b83811115620005c2576000848401525b50505050565b60006002820490506001821680620005e157607f821691505b60208210811415620005f857620005f762000634565b5b50919050565b6200060982620006a6565b810181811067ffffffffffffffff821117156200062b576200062a62000663565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620006eb8162000588565b8114620006f757600080fd5b50565b6143ea806200070a6000396000f3fe6080604052600436106101b75760003560e01c80636f8b44b0116100ec578063a22cb4651161008a578063c87b56dd11610064578063c87b56dd146105d3578063da3ef23f14610610578063e985e9c514610639578063f2fde38b14610676576101b7565b8063a22cb46514610558578063b88d4fde14610581578063bc337182146105aa576101b7565b806378e97925116100c657806378e97925146104c0578063853828b6146104eb5780638da5cb5b1461050257806395d89b411461052d576101b7565b80636f8b44b01461044357806370a082311461046c578063715018a6146104a9576101b7565b80632f745c59116101595780634f6ccce7116101335780634f6ccce71461037757806355f804b3146103b45780635d0044ca146103dd5780636352211e14610406576101b7565b80632f745c59146102e85780633e0a322d1461032557806342842e0e1461034e576101b7565b8063095ea7b311610195578063095ea7b3146102615780631249c58b1461028a57806318160ddd1461029457806323b872dd146102bf576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612e51565b61069f565b6040516101f091906134ab565b60405180910390f35b34801561020557600080fd5b5061020e610719565b60405161021b91906134c6565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612ef4565b6107ab565b6040516102589190613444565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612e11565b610830565b005b610292610948565b005b3480156102a057600080fd5b506102a9610af2565b6040516102b69190613808565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190612cfb565b610aff565b005b3480156102f457600080fd5b5061030f600480360381019061030a9190612e11565b610b5f565b60405161031c9190613808565b60405180910390f35b34801561033157600080fd5b5061034c60048036038101906103479190612ef4565b610c04565b005b34801561035a57600080fd5b5061037560048036038101906103709190612cfb565b610c8a565b005b34801561038357600080fd5b5061039e60048036038101906103999190612ef4565b610caa565b6040516103ab9190613808565b60405180910390f35b3480156103c057600080fd5b506103db60048036038101906103d69190612eab565b610d1b565b005b3480156103e957600080fd5b5061040460048036038101906103ff9190612ef4565b610db1565b005b34801561041257600080fd5b5061042d60048036038101906104289190612ef4565b610e37565b60405161043a9190613444565b60405180910390f35b34801561044f57600080fd5b5061046a60048036038101906104659190612ef4565b610ee9565b005b34801561047857600080fd5b50610493600480360381019061048e9190612c8e565b610f6f565b6040516104a09190613808565b60405180910390f35b3480156104b557600080fd5b506104be611027565b005b3480156104cc57600080fd5b506104d56110af565b6040516104e29190613808565b60405180910390f35b3480156104f757600080fd5b506105006110b5565b005b34801561050e57600080fd5b506105176112aa565b6040516105249190613444565b60405180910390f35b34801561053957600080fd5b506105426112d4565b60405161054f91906134c6565b60405180910390f35b34801561056457600080fd5b5061057f600480360381019061057a9190612dd1565b611366565b005b34801561058d57600080fd5b506105a860048036038101906105a39190612d4e565b61137c565b005b3480156105b657600080fd5b506105d160048036038101906105cc9190612ef4565b6113de565b005b3480156105df57600080fd5b506105fa60048036038101906105f59190612ef4565b611464565b60405161060791906134c6565b60405180910390f35b34801561061c57600080fd5b5061063760048036038101906106329190612eab565b61150e565b005b34801561064557600080fd5b50610660600480360381019061065b9190612cbb565b6115a4565b60405161066d91906134ab565b60405180910390f35b34801561068257600080fd5b5061069d60048036038101906106989190612c8e565b611638565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610712575061071182611730565b5b9050919050565b60606000805461072890613ad8565b80601f016020809104026020016040519081016040528092919081815260200182805461075490613ad8565b80156107a15780601f10610776576101008083540402835291602001916107a1565b820191906000526020600020905b81548152906001019060200180831161078457829003601f168201915b5050505050905090565b60006107b682611812565b6107f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ec906136c8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083b82610e37565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a390613708565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108cb61187e565b73ffffffffffffffffffffffffffffffffffffffff1614806108fa57506108f9816108f461187e565b6115a4565b5b610939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093090613648565b60405180910390fd5b6109438383611886565b505050565b6000610952610af2565b9050601054600182610964919061390d565b11156109a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099c906137e8565b60405180910390fd5b60006109b033610f6f565b9050600f5481106109f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ed906137a8565b60405180910390fd5b601154421015610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290613768565b60405180910390fd5b60378210610a8d57600d54341015610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f906134e8565b60405180910390fd5b610ad1565b60008114610ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac790613508565b60405180910390fd5b5b610ae433610adf601261193f565b61194d565b610aee601261196b565b5050565b6000600880549050905090565b610b10610b0a61187e565b82611981565b610b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4690613748565b60405180910390fd5b610b5a838383611a5f565b505050565b6000610b6a83610f6f565b8210610bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba290613528565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c0c61187e565b73ffffffffffffffffffffffffffffffffffffffff16610c2a6112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c77906136e8565b60405180910390fd5b8060118190555050565b610ca58383836040518060200160405280600081525061137c565b505050565b6000610cb4610af2565b8210610cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cec90613788565b60405180910390fd5b60088281548110610d0957610d08613c71565b5b90600052602060002001549050919050565b610d2361187e565b73ffffffffffffffffffffffffffffffffffffffff16610d416112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e906136e8565b60405180910390fd5b80600b9080519060200190610dad929190612aa2565b5050565b610db961187e565b73ffffffffffffffffffffffffffffffffffffffff16610dd76112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e24906136e8565b60405180910390fd5b80600f8190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed790613688565b60405180910390fd5b80915050919050565b610ef161187e565b73ffffffffffffffffffffffffffffffffffffffff16610f0f6112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c906136e8565b60405180910390fd5b8060108190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd790613668565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61102f61187e565b73ffffffffffffffffffffffffffffffffffffffff1661104d6112aa565b73ffffffffffffffffffffffffffffffffffffffff16146110a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109a906136e8565b60405180910390fd5b6110ad6000611cc6565b565b60115481565b6110bd61187e565b73ffffffffffffffffffffffffffffffffffffffff166110db6112aa565b73ffffffffffffffffffffffffffffffffffffffff1614611131576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611128906136e8565b60405180910390fd5b600047905060008111611179576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611170906137c8565b60405180910390fd5b6111bd7343558232f2fd87c34f5a254f96493e55abb89c506111b860646111aa601486611d8c90919063ffffffff16565b611da290919063ffffffff16565b611db8565b61120173b82f051524ff138ceac7a62184739d399d7143886111fc60646111ee603286611d8c90919063ffffffff16565b611da290919063ffffffff16565b611db8565b6112457348d7b79a2b31c2ad4fe285f9f6de9a02033d12a16112406064611232601486611d8c90919063ffffffff16565b611da290919063ffffffff16565b611db8565b61128973fa86599bbac7e2b2a32922d575d38da31e27ca6f6112846064611276600a86611d8c90919063ffffffff16565b611da290919063ffffffff16565b611db8565b6112a773b82f051524ff138ceac7a62184739d399d71438847611db8565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112e390613ad8565b80601f016020809104026020016040519081016040528092919081815260200182805461130f90613ad8565b801561135c5780601f106113315761010080835404028352916020019161135c565b820191906000526020600020905b81548152906001019060200180831161133f57829003601f168201915b5050505050905090565b61137861137161187e565b8383611e69565b5050565b61138d61138761187e565b83611981565b6113cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c390613748565b60405180910390fd5b6113d884848484611fd6565b50505050565b6113e661187e565b73ffffffffffffffffffffffffffffffffffffffff166114046112aa565b73ffffffffffffffffffffffffffffffffffffffff161461145a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611451906136e8565b60405180910390fd5b80600e8190555050565b606061146f82611812565b6114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a590613628565b60405180910390fd5b60006114b8612032565b905060008151116114d85760405180602001604052806000815250611506565b806114e2846120c4565b600c6040516020016114f6939291906133fe565b6040516020818303038152906040525b915050919050565b61151661187e565b73ffffffffffffffffffffffffffffffffffffffff166115346112aa565b73ffffffffffffffffffffffffffffffffffffffff161461158a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611581906136e8565b60405180910390fd5b80600c90805190602001906115a0929190612aa2565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61164061187e565b73ffffffffffffffffffffffffffffffffffffffff1661165e6112aa565b73ffffffffffffffffffffffffffffffffffffffff16146116b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ab906136e8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171b90613568565b60405180910390fd5b61172d81611cc6565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117fb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061180b575061180a82612225565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118f983610e37565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b61196782826040518060200160405280600081525061228f565b5050565b6001816000016000828254019250508190555050565b600061198c82611812565b6119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290613608565b60405180910390fd5b60006119d683610e37565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a4557508373ffffffffffffffffffffffffffffffffffffffff16611a2d846107ab565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a565750611a5581856115a4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a7f82610e37565b73ffffffffffffffffffffffffffffffffffffffff1614611ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acc90613588565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c906135c8565b60405180910390fd5b611b508383836122ea565b611b5b600082611886565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bab91906139ee565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c02919061390d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cc18383836123fe565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183611d9a9190613994565b905092915050565b60008183611db09190613963565b905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611dde9061342f565b60006040518083038185875af1925050503d8060008114611e1b576040519150601f19603f3d011682016040523d82523d6000602084013e611e20565b606091505b5050905080611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5b90613728565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecf906135e8565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fc991906134ab565b60405180910390a3505050565b611fe1848484611a5f565b611fed84848484612403565b61202c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202390613548565b60405180910390fd5b50505050565b6060600b805461204190613ad8565b80601f016020809104026020016040519081016040528092919081815260200182805461206d90613ad8565b80156120ba5780601f1061208f576101008083540402835291602001916120ba565b820191906000526020600020905b81548152906001019060200180831161209d57829003601f168201915b5050505050905090565b6060600082141561210c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612220565b600082905060005b6000821461213e57808061212790613b3b565b915050600a826121379190613963565b9150612114565b60008167ffffffffffffffff81111561215a57612159613ca0565b5b6040519080825280601f01601f19166020018201604052801561218c5781602001600182028036833780820191505090505b5090505b60008514612219576001826121a591906139ee565b9150600a856121b49190613b84565b60306121c0919061390d565b60f81b8183815181106121d6576121d5613c71565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122129190613963565b9450612190565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612299838361259a565b6122a66000848484612403565b6122e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122dc90613548565b60405180910390fd5b505050565b6122f5838383612774565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123385761233381612779565b612377565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123765761237583826127c2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123ba576123b58161292f565b6123f9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123f8576123f78282612a00565b5b5b505050565b505050565b60006124248473ffffffffffffffffffffffffffffffffffffffff16612a7f565b1561258d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261244d61187e565b8786866040518563ffffffff1660e01b815260040161246f949392919061345f565b602060405180830381600087803b15801561248957600080fd5b505af19250505080156124ba57506040513d601f19601f820116820180604052508101906124b79190612e7e565b60015b61253d573d80600081146124ea576040519150601f19603f3d011682016040523d82523d6000602084013e6124ef565b606091505b50600081511415612535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252c90613548565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612592565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561260a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612601906136a8565b60405180910390fd5b61261381611812565b15612653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264a906135a8565b60405180910390fd5b61265f600083836122ea565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126af919061390d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612770600083836123fe565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127cf84610f6f565b6127d991906139ee565b90506000600760008481526020019081526020016000205490508181146128be576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061294391906139ee565b905060006009600084815260200190815260200160002054905060006008838154811061297357612972613c71565b5b90600052602060002001549050806008838154811061299557612994613c71565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806129e4576129e3613c42565b5b6001900381819060005260206000200160009055905550505050565b6000612a0b83610f6f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612aae90613ad8565b90600052602060002090601f016020900481019282612ad05760008555612b17565b82601f10612ae957805160ff1916838001178555612b17565b82800160010185558215612b17579182015b82811115612b16578251825591602001919060010190612afb565b5b509050612b249190612b28565b5090565b5b80821115612b41576000816000905550600101612b29565b5090565b6000612b58612b5384613848565b613823565b905082815260208101848484011115612b7457612b73613cd4565b5b612b7f848285613a96565b509392505050565b6000612b9a612b9584613879565b613823565b905082815260208101848484011115612bb657612bb5613cd4565b5b612bc1848285613a96565b509392505050565b600081359050612bd881614358565b92915050565b600081359050612bed8161436f565b92915050565b600081359050612c0281614386565b92915050565b600081519050612c1781614386565b92915050565b600082601f830112612c3257612c31613ccf565b5b8135612c42848260208601612b45565b91505092915050565b600082601f830112612c6057612c5f613ccf565b5b8135612c70848260208601612b87565b91505092915050565b600081359050612c888161439d565b92915050565b600060208284031215612ca457612ca3613cde565b5b6000612cb284828501612bc9565b91505092915050565b60008060408385031215612cd257612cd1613cde565b5b6000612ce085828601612bc9565b9250506020612cf185828601612bc9565b9150509250929050565b600080600060608486031215612d1457612d13613cde565b5b6000612d2286828701612bc9565b9350506020612d3386828701612bc9565b9250506040612d4486828701612c79565b9150509250925092565b60008060008060808587031215612d6857612d67613cde565b5b6000612d7687828801612bc9565b9450506020612d8787828801612bc9565b9350506040612d9887828801612c79565b925050606085013567ffffffffffffffff811115612db957612db8613cd9565b5b612dc587828801612c1d565b91505092959194509250565b60008060408385031215612de857612de7613cde565b5b6000612df685828601612bc9565b9250506020612e0785828601612bde565b9150509250929050565b60008060408385031215612e2857612e27613cde565b5b6000612e3685828601612bc9565b9250506020612e4785828601612c79565b9150509250929050565b600060208284031215612e6757612e66613cde565b5b6000612e7584828501612bf3565b91505092915050565b600060208284031215612e9457612e93613cde565b5b6000612ea284828501612c08565b91505092915050565b600060208284031215612ec157612ec0613cde565b5b600082013567ffffffffffffffff811115612edf57612ede613cd9565b5b612eeb84828501612c4b565b91505092915050565b600060208284031215612f0a57612f09613cde565b5b6000612f1884828501612c79565b91505092915050565b612f2a81613a22565b82525050565b612f3981613a34565b82525050565b6000612f4a826138bf565b612f5481856138d5565b9350612f64818560208601613aa5565b612f6d81613ce3565b840191505092915050565b6000612f83826138ca565b612f8d81856138f1565b9350612f9d818560208601613aa5565b612fa681613ce3565b840191505092915050565b6000612fbc826138ca565b612fc68185613902565b9350612fd6818560208601613aa5565b80840191505092915050565b60008154612fef81613ad8565b612ff98186613902565b94506001821660008114613014576001811461302557613058565b60ff19831686528186019350613058565b61302e856138aa565b60005b8381101561305057815481890152600182019150602081019050613031565b838801955050505b50505092915050565b600061306e602b836138f1565b915061307982613cf4565b604082019050919050565b60006130916035836138f1565b915061309c82613d43565b604082019050919050565b60006130b4602b836138f1565b91506130bf82613d92565b604082019050919050565b60006130d76032836138f1565b91506130e282613de1565b604082019050919050565b60006130fa6026836138f1565b915061310582613e30565b604082019050919050565b600061311d6025836138f1565b915061312882613e7f565b604082019050919050565b6000613140601c836138f1565b915061314b82613ece565b602082019050919050565b60006131636024836138f1565b915061316e82613ef7565b604082019050919050565b60006131866019836138f1565b915061319182613f46565b602082019050919050565b60006131a9602c836138f1565b91506131b482613f6f565b604082019050919050565b60006131cc6019836138f1565b91506131d782613fbe565b602082019050919050565b60006131ef6038836138f1565b91506131fa82613fe7565b604082019050919050565b6000613212602a836138f1565b915061321d82614036565b604082019050919050565b60006132356029836138f1565b915061324082614085565b604082019050919050565b60006132586020836138f1565b9150613263826140d4565b602082019050919050565b600061327b602c836138f1565b9150613286826140fd565b604082019050919050565b600061329e6020836138f1565b91506132a98261414c565b602082019050919050565b60006132c16021836138f1565b91506132cc82614175565b604082019050919050565b60006132e46000836138e6565b91506132ef826141c4565b600082019050919050565b60006133076010836138f1565b9150613312826141c7565b602082019050919050565b600061332a6031836138f1565b9150613335826141f0565b604082019050919050565b600061334d6014836138f1565b91506133588261423f565b602082019050919050565b6000613370602c836138f1565b915061337b82614268565b604082019050919050565b6000613393602b836138f1565b915061339e826142b7565b604082019050919050565b60006133b6601d836138f1565b91506133c182614306565b602082019050919050565b60006133d9601c836138f1565b91506133e48261432f565b602082019050919050565b6133f881613a8c565b82525050565b600061340a8286612fb1565b91506134168285612fb1565b91506134228284612fe2565b9150819050949350505050565b600061343a826132d7565b9150819050919050565b60006020820190506134596000830184612f21565b92915050565b60006080820190506134746000830187612f21565b6134816020830186612f21565b61348e60408301856133ef565b81810360608301526134a08184612f3f565b905095945050505050565b60006020820190506134c06000830184612f30565b92915050565b600060208201905081810360008301526134e08184612f78565b905092915050565b6000602082019050818103600083015261350181613061565b9050919050565b6000602082019050818103600083015261352181613084565b9050919050565b60006020820190508181036000830152613541816130a7565b9050919050565b60006020820190508181036000830152613561816130ca565b9050919050565b60006020820190508181036000830152613581816130ed565b9050919050565b600060208201905081810360008301526135a181613110565b9050919050565b600060208201905081810360008301526135c181613133565b9050919050565b600060208201905081810360008301526135e181613156565b9050919050565b6000602082019050818103600083015261360181613179565b9050919050565b600060208201905081810360008301526136218161319c565b9050919050565b60006020820190508181036000830152613641816131bf565b9050919050565b60006020820190508181036000830152613661816131e2565b9050919050565b6000602082019050818103600083015261368181613205565b9050919050565b600060208201905081810360008301526136a181613228565b9050919050565b600060208201905081810360008301526136c18161324b565b9050919050565b600060208201905081810360008301526136e18161326e565b9050919050565b6000602082019050818103600083015261370181613291565b9050919050565b60006020820190508181036000830152613721816132b4565b9050919050565b60006020820190508181036000830152613741816132fa565b9050919050565b600060208201905081810360008301526137618161331d565b9050919050565b6000602082019050818103600083015261378181613340565b9050919050565b600060208201905081810360008301526137a181613363565b9050919050565b600060208201905081810360008301526137c181613386565b9050919050565b600060208201905081810360008301526137e1816133a9565b9050919050565b60006020820190508181036000830152613801816133cc565b9050919050565b600060208201905061381d60008301846133ef565b92915050565b600061382d61383e565b90506138398282613b0a565b919050565b6000604051905090565b600067ffffffffffffffff82111561386357613862613ca0565b5b61386c82613ce3565b9050602081019050919050565b600067ffffffffffffffff82111561389457613893613ca0565b5b61389d82613ce3565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061391882613a8c565b915061392383613a8c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561395857613957613bb5565b5b828201905092915050565b600061396e82613a8c565b915061397983613a8c565b92508261398957613988613be4565b5b828204905092915050565b600061399f82613a8c565b91506139aa83613a8c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139e3576139e2613bb5565b5b828202905092915050565b60006139f982613a8c565b9150613a0483613a8c565b925082821015613a1757613a16613bb5565b5b828203905092915050565b6000613a2d82613a6c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ac3578082015181840152602081019050613aa8565b83811115613ad2576000848401525b50505050565b60006002820490506001821680613af057607f821691505b60208210811415613b0457613b03613c13565b5b50919050565b613b1382613ce3565b810181811067ffffffffffffffff82111715613b3257613b31613ca0565b5b80604052505050565b6000613b4682613a8c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b7957613b78613bb5565b5b600182019050919050565b6000613b8f82613a8c565b9150613b9a83613a8c565b925082613baa57613ba9613be4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5573657220646964206e6f742073656e6420656e6f756768206574686572207760008201527f6974682074686973207478000000000000000000000000000000000000000000602082015250565b7f596f752068617665206d696e74656420746865206d617820616d6f756e74206460008201527f7572696e6720746865206672656520706572696f640000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5468697320746f6b656e20646f6573206e6f7420657869737400000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206c69766520796574000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420616c6c6f7765642074686973206d616e7920696e60008201527f206f6e652077616c6c6574000000000000000000000000000000000000000000602082015250565b7f5468657265206973206e6f2066756e647320746f207769746864726177000000600082015250565b7f57652063616e6e6f7420737570706c79207468697320616d6f756e7400000000600082015250565b61436181613a22565b811461436c57600080fd5b50565b61437881613a34565b811461438357600080fd5b50565b61438f81613a40565b811461439a57600080fd5b50565b6143a681613a8c565b81146143b157600080fd5b5056fea264697066735822122045d253dcf1925bc67f6405775117e639a96e135887f51b024717218c724b4fee64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000625c6284000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f647261676f6e6672756974736e66742e78797a2f73746f726167652f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024446000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d447261676f6e2046727569747300000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101b75760003560e01c80636f8b44b0116100ec578063a22cb4651161008a578063c87b56dd11610064578063c87b56dd146105d3578063da3ef23f14610610578063e985e9c514610639578063f2fde38b14610676576101b7565b8063a22cb46514610558578063b88d4fde14610581578063bc337182146105aa576101b7565b806378e97925116100c657806378e97925146104c0578063853828b6146104eb5780638da5cb5b1461050257806395d89b411461052d576101b7565b80636f8b44b01461044357806370a082311461046c578063715018a6146104a9576101b7565b80632f745c59116101595780634f6ccce7116101335780634f6ccce71461037757806355f804b3146103b45780635d0044ca146103dd5780636352211e14610406576101b7565b80632f745c59146102e85780633e0a322d1461032557806342842e0e1461034e576101b7565b8063095ea7b311610195578063095ea7b3146102615780631249c58b1461028a57806318160ddd1461029457806323b872dd146102bf576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612e51565b61069f565b6040516101f091906134ab565b60405180910390f35b34801561020557600080fd5b5061020e610719565b60405161021b91906134c6565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612ef4565b6107ab565b6040516102589190613444565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612e11565b610830565b005b610292610948565b005b3480156102a057600080fd5b506102a9610af2565b6040516102b69190613808565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190612cfb565b610aff565b005b3480156102f457600080fd5b5061030f600480360381019061030a9190612e11565b610b5f565b60405161031c9190613808565b60405180910390f35b34801561033157600080fd5b5061034c60048036038101906103479190612ef4565b610c04565b005b34801561035a57600080fd5b5061037560048036038101906103709190612cfb565b610c8a565b005b34801561038357600080fd5b5061039e60048036038101906103999190612ef4565b610caa565b6040516103ab9190613808565b60405180910390f35b3480156103c057600080fd5b506103db60048036038101906103d69190612eab565b610d1b565b005b3480156103e957600080fd5b5061040460048036038101906103ff9190612ef4565b610db1565b005b34801561041257600080fd5b5061042d60048036038101906104289190612ef4565b610e37565b60405161043a9190613444565b60405180910390f35b34801561044f57600080fd5b5061046a60048036038101906104659190612ef4565b610ee9565b005b34801561047857600080fd5b50610493600480360381019061048e9190612c8e565b610f6f565b6040516104a09190613808565b60405180910390f35b3480156104b557600080fd5b506104be611027565b005b3480156104cc57600080fd5b506104d56110af565b6040516104e29190613808565b60405180910390f35b3480156104f757600080fd5b506105006110b5565b005b34801561050e57600080fd5b506105176112aa565b6040516105249190613444565b60405180910390f35b34801561053957600080fd5b506105426112d4565b60405161054f91906134c6565b60405180910390f35b34801561056457600080fd5b5061057f600480360381019061057a9190612dd1565b611366565b005b34801561058d57600080fd5b506105a860048036038101906105a39190612d4e565b61137c565b005b3480156105b657600080fd5b506105d160048036038101906105cc9190612ef4565b6113de565b005b3480156105df57600080fd5b506105fa60048036038101906105f59190612ef4565b611464565b60405161060791906134c6565b60405180910390f35b34801561061c57600080fd5b5061063760048036038101906106329190612eab565b61150e565b005b34801561064557600080fd5b50610660600480360381019061065b9190612cbb565b6115a4565b60405161066d91906134ab565b60405180910390f35b34801561068257600080fd5b5061069d60048036038101906106989190612c8e565b611638565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610712575061071182611730565b5b9050919050565b60606000805461072890613ad8565b80601f016020809104026020016040519081016040528092919081815260200182805461075490613ad8565b80156107a15780601f10610776576101008083540402835291602001916107a1565b820191906000526020600020905b81548152906001019060200180831161078457829003601f168201915b5050505050905090565b60006107b682611812565b6107f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ec906136c8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083b82610e37565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a390613708565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108cb61187e565b73ffffffffffffffffffffffffffffffffffffffff1614806108fa57506108f9816108f461187e565b6115a4565b5b610939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093090613648565b60405180910390fd5b6109438383611886565b505050565b6000610952610af2565b9050601054600182610964919061390d565b11156109a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099c906137e8565b60405180910390fd5b60006109b033610f6f565b9050600f5481106109f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ed906137a8565b60405180910390fd5b601154421015610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290613768565b60405180910390fd5b60378210610a8d57600d54341015610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f906134e8565b60405180910390fd5b610ad1565b60008114610ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac790613508565b60405180910390fd5b5b610ae433610adf601261193f565b61194d565b610aee601261196b565b5050565b6000600880549050905090565b610b10610b0a61187e565b82611981565b610b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4690613748565b60405180910390fd5b610b5a838383611a5f565b505050565b6000610b6a83610f6f565b8210610bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba290613528565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c0c61187e565b73ffffffffffffffffffffffffffffffffffffffff16610c2a6112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c77906136e8565b60405180910390fd5b8060118190555050565b610ca58383836040518060200160405280600081525061137c565b505050565b6000610cb4610af2565b8210610cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cec90613788565b60405180910390fd5b60088281548110610d0957610d08613c71565b5b90600052602060002001549050919050565b610d2361187e565b73ffffffffffffffffffffffffffffffffffffffff16610d416112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e906136e8565b60405180910390fd5b80600b9080519060200190610dad929190612aa2565b5050565b610db961187e565b73ffffffffffffffffffffffffffffffffffffffff16610dd76112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e24906136e8565b60405180910390fd5b80600f8190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed790613688565b60405180910390fd5b80915050919050565b610ef161187e565b73ffffffffffffffffffffffffffffffffffffffff16610f0f6112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c906136e8565b60405180910390fd5b8060108190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd790613668565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61102f61187e565b73ffffffffffffffffffffffffffffffffffffffff1661104d6112aa565b73ffffffffffffffffffffffffffffffffffffffff16146110a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109a906136e8565b60405180910390fd5b6110ad6000611cc6565b565b60115481565b6110bd61187e565b73ffffffffffffffffffffffffffffffffffffffff166110db6112aa565b73ffffffffffffffffffffffffffffffffffffffff1614611131576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611128906136e8565b60405180910390fd5b600047905060008111611179576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611170906137c8565b60405180910390fd5b6111bd7343558232f2fd87c34f5a254f96493e55abb89c506111b860646111aa601486611d8c90919063ffffffff16565b611da290919063ffffffff16565b611db8565b61120173b82f051524ff138ceac7a62184739d399d7143886111fc60646111ee603286611d8c90919063ffffffff16565b611da290919063ffffffff16565b611db8565b6112457348d7b79a2b31c2ad4fe285f9f6de9a02033d12a16112406064611232601486611d8c90919063ffffffff16565b611da290919063ffffffff16565b611db8565b61128973fa86599bbac7e2b2a32922d575d38da31e27ca6f6112846064611276600a86611d8c90919063ffffffff16565b611da290919063ffffffff16565b611db8565b6112a773b82f051524ff138ceac7a62184739d399d71438847611db8565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112e390613ad8565b80601f016020809104026020016040519081016040528092919081815260200182805461130f90613ad8565b801561135c5780601f106113315761010080835404028352916020019161135c565b820191906000526020600020905b81548152906001019060200180831161133f57829003601f168201915b5050505050905090565b61137861137161187e565b8383611e69565b5050565b61138d61138761187e565b83611981565b6113cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c390613748565b60405180910390fd5b6113d884848484611fd6565b50505050565b6113e661187e565b73ffffffffffffffffffffffffffffffffffffffff166114046112aa565b73ffffffffffffffffffffffffffffffffffffffff161461145a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611451906136e8565b60405180910390fd5b80600e8190555050565b606061146f82611812565b6114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a590613628565b60405180910390fd5b60006114b8612032565b905060008151116114d85760405180602001604052806000815250611506565b806114e2846120c4565b600c6040516020016114f6939291906133fe565b6040516020818303038152906040525b915050919050565b61151661187e565b73ffffffffffffffffffffffffffffffffffffffff166115346112aa565b73ffffffffffffffffffffffffffffffffffffffff161461158a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611581906136e8565b60405180910390fd5b80600c90805190602001906115a0929190612aa2565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61164061187e565b73ffffffffffffffffffffffffffffffffffffffff1661165e6112aa565b73ffffffffffffffffffffffffffffffffffffffff16146116b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ab906136e8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171b90613568565b60405180910390fd5b61172d81611cc6565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117fb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061180b575061180a82612225565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118f983610e37565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b61196782826040518060200160405280600081525061228f565b5050565b6001816000016000828254019250508190555050565b600061198c82611812565b6119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290613608565b60405180910390fd5b60006119d683610e37565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a4557508373ffffffffffffffffffffffffffffffffffffffff16611a2d846107ab565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a565750611a5581856115a4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a7f82610e37565b73ffffffffffffffffffffffffffffffffffffffff1614611ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acc90613588565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c906135c8565b60405180910390fd5b611b508383836122ea565b611b5b600082611886565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bab91906139ee565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c02919061390d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cc18383836123fe565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183611d9a9190613994565b905092915050565b60008183611db09190613963565b905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611dde9061342f565b60006040518083038185875af1925050503d8060008114611e1b576040519150601f19603f3d011682016040523d82523d6000602084013e611e20565b606091505b5050905080611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5b90613728565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecf906135e8565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fc991906134ab565b60405180910390a3505050565b611fe1848484611a5f565b611fed84848484612403565b61202c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202390613548565b60405180910390fd5b50505050565b6060600b805461204190613ad8565b80601f016020809104026020016040519081016040528092919081815260200182805461206d90613ad8565b80156120ba5780601f1061208f576101008083540402835291602001916120ba565b820191906000526020600020905b81548152906001019060200180831161209d57829003601f168201915b5050505050905090565b6060600082141561210c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612220565b600082905060005b6000821461213e57808061212790613b3b565b915050600a826121379190613963565b9150612114565b60008167ffffffffffffffff81111561215a57612159613ca0565b5b6040519080825280601f01601f19166020018201604052801561218c5781602001600182028036833780820191505090505b5090505b60008514612219576001826121a591906139ee565b9150600a856121b49190613b84565b60306121c0919061390d565b60f81b8183815181106121d6576121d5613c71565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122129190613963565b9450612190565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612299838361259a565b6122a66000848484612403565b6122e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122dc90613548565b60405180910390fd5b505050565b6122f5838383612774565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123385761233381612779565b612377565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123765761237583826127c2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123ba576123b58161292f565b6123f9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123f8576123f78282612a00565b5b5b505050565b505050565b60006124248473ffffffffffffffffffffffffffffffffffffffff16612a7f565b1561258d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261244d61187e565b8786866040518563ffffffff1660e01b815260040161246f949392919061345f565b602060405180830381600087803b15801561248957600080fd5b505af19250505080156124ba57506040513d601f19601f820116820180604052508101906124b79190612e7e565b60015b61253d573d80600081146124ea576040519150601f19603f3d011682016040523d82523d6000602084013e6124ef565b606091505b50600081511415612535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252c90613548565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612592565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561260a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612601906136a8565b60405180910390fd5b61261381611812565b15612653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264a906135a8565b60405180910390fd5b61265f600083836122ea565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126af919061390d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612770600083836123fe565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127cf84610f6f565b6127d991906139ee565b90506000600760008481526020019081526020016000205490508181146128be576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061294391906139ee565b905060006009600084815260200190815260200160002054905060006008838154811061297357612972613c71565b5b90600052602060002001549050806008838154811061299557612994613c71565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806129e4576129e3613c42565b5b6001900381819060005260206000200160009055905550505050565b6000612a0b83610f6f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612aae90613ad8565b90600052602060002090601f016020900481019282612ad05760008555612b17565b82601f10612ae957805160ff1916838001178555612b17565b82800160010185558215612b17579182015b82811115612b16578251825591602001919060010190612afb565b5b509050612b249190612b28565b5090565b5b80821115612b41576000816000905550600101612b29565b5090565b6000612b58612b5384613848565b613823565b905082815260208101848484011115612b7457612b73613cd4565b5b612b7f848285613a96565b509392505050565b6000612b9a612b9584613879565b613823565b905082815260208101848484011115612bb657612bb5613cd4565b5b612bc1848285613a96565b509392505050565b600081359050612bd881614358565b92915050565b600081359050612bed8161436f565b92915050565b600081359050612c0281614386565b92915050565b600081519050612c1781614386565b92915050565b600082601f830112612c3257612c31613ccf565b5b8135612c42848260208601612b45565b91505092915050565b600082601f830112612c6057612c5f613ccf565b5b8135612c70848260208601612b87565b91505092915050565b600081359050612c888161439d565b92915050565b600060208284031215612ca457612ca3613cde565b5b6000612cb284828501612bc9565b91505092915050565b60008060408385031215612cd257612cd1613cde565b5b6000612ce085828601612bc9565b9250506020612cf185828601612bc9565b9150509250929050565b600080600060608486031215612d1457612d13613cde565b5b6000612d2286828701612bc9565b9350506020612d3386828701612bc9565b9250506040612d4486828701612c79565b9150509250925092565b60008060008060808587031215612d6857612d67613cde565b5b6000612d7687828801612bc9565b9450506020612d8787828801612bc9565b9350506040612d9887828801612c79565b925050606085013567ffffffffffffffff811115612db957612db8613cd9565b5b612dc587828801612c1d565b91505092959194509250565b60008060408385031215612de857612de7613cde565b5b6000612df685828601612bc9565b9250506020612e0785828601612bde565b9150509250929050565b60008060408385031215612e2857612e27613cde565b5b6000612e3685828601612bc9565b9250506020612e4785828601612c79565b9150509250929050565b600060208284031215612e6757612e66613cde565b5b6000612e7584828501612bf3565b91505092915050565b600060208284031215612e9457612e93613cde565b5b6000612ea284828501612c08565b91505092915050565b600060208284031215612ec157612ec0613cde565b5b600082013567ffffffffffffffff811115612edf57612ede613cd9565b5b612eeb84828501612c4b565b91505092915050565b600060208284031215612f0a57612f09613cde565b5b6000612f1884828501612c79565b91505092915050565b612f2a81613a22565b82525050565b612f3981613a34565b82525050565b6000612f4a826138bf565b612f5481856138d5565b9350612f64818560208601613aa5565b612f6d81613ce3565b840191505092915050565b6000612f83826138ca565b612f8d81856138f1565b9350612f9d818560208601613aa5565b612fa681613ce3565b840191505092915050565b6000612fbc826138ca565b612fc68185613902565b9350612fd6818560208601613aa5565b80840191505092915050565b60008154612fef81613ad8565b612ff98186613902565b94506001821660008114613014576001811461302557613058565b60ff19831686528186019350613058565b61302e856138aa565b60005b8381101561305057815481890152600182019150602081019050613031565b838801955050505b50505092915050565b600061306e602b836138f1565b915061307982613cf4565b604082019050919050565b60006130916035836138f1565b915061309c82613d43565b604082019050919050565b60006130b4602b836138f1565b91506130bf82613d92565b604082019050919050565b60006130d76032836138f1565b91506130e282613de1565b604082019050919050565b60006130fa6026836138f1565b915061310582613e30565b604082019050919050565b600061311d6025836138f1565b915061312882613e7f565b604082019050919050565b6000613140601c836138f1565b915061314b82613ece565b602082019050919050565b60006131636024836138f1565b915061316e82613ef7565b604082019050919050565b60006131866019836138f1565b915061319182613f46565b602082019050919050565b60006131a9602c836138f1565b91506131b482613f6f565b604082019050919050565b60006131cc6019836138f1565b91506131d782613fbe565b602082019050919050565b60006131ef6038836138f1565b91506131fa82613fe7565b604082019050919050565b6000613212602a836138f1565b915061321d82614036565b604082019050919050565b60006132356029836138f1565b915061324082614085565b604082019050919050565b60006132586020836138f1565b9150613263826140d4565b602082019050919050565b600061327b602c836138f1565b9150613286826140fd565b604082019050919050565b600061329e6020836138f1565b91506132a98261414c565b602082019050919050565b60006132c16021836138f1565b91506132cc82614175565b604082019050919050565b60006132e46000836138e6565b91506132ef826141c4565b600082019050919050565b60006133076010836138f1565b9150613312826141c7565b602082019050919050565b600061332a6031836138f1565b9150613335826141f0565b604082019050919050565b600061334d6014836138f1565b91506133588261423f565b602082019050919050565b6000613370602c836138f1565b915061337b82614268565b604082019050919050565b6000613393602b836138f1565b915061339e826142b7565b604082019050919050565b60006133b6601d836138f1565b91506133c182614306565b602082019050919050565b60006133d9601c836138f1565b91506133e48261432f565b602082019050919050565b6133f881613a8c565b82525050565b600061340a8286612fb1565b91506134168285612fb1565b91506134228284612fe2565b9150819050949350505050565b600061343a826132d7565b9150819050919050565b60006020820190506134596000830184612f21565b92915050565b60006080820190506134746000830187612f21565b6134816020830186612f21565b61348e60408301856133ef565b81810360608301526134a08184612f3f565b905095945050505050565b60006020820190506134c06000830184612f30565b92915050565b600060208201905081810360008301526134e08184612f78565b905092915050565b6000602082019050818103600083015261350181613061565b9050919050565b6000602082019050818103600083015261352181613084565b9050919050565b60006020820190508181036000830152613541816130a7565b9050919050565b60006020820190508181036000830152613561816130ca565b9050919050565b60006020820190508181036000830152613581816130ed565b9050919050565b600060208201905081810360008301526135a181613110565b9050919050565b600060208201905081810360008301526135c181613133565b9050919050565b600060208201905081810360008301526135e181613156565b9050919050565b6000602082019050818103600083015261360181613179565b9050919050565b600060208201905081810360008301526136218161319c565b9050919050565b60006020820190508181036000830152613641816131bf565b9050919050565b60006020820190508181036000830152613661816131e2565b9050919050565b6000602082019050818103600083015261368181613205565b9050919050565b600060208201905081810360008301526136a181613228565b9050919050565b600060208201905081810360008301526136c18161324b565b9050919050565b600060208201905081810360008301526136e18161326e565b9050919050565b6000602082019050818103600083015261370181613291565b9050919050565b60006020820190508181036000830152613721816132b4565b9050919050565b60006020820190508181036000830152613741816132fa565b9050919050565b600060208201905081810360008301526137618161331d565b9050919050565b6000602082019050818103600083015261378181613340565b9050919050565b600060208201905081810360008301526137a181613363565b9050919050565b600060208201905081810360008301526137c181613386565b9050919050565b600060208201905081810360008301526137e1816133a9565b9050919050565b60006020820190508181036000830152613801816133cc565b9050919050565b600060208201905061381d60008301846133ef565b92915050565b600061382d61383e565b90506138398282613b0a565b919050565b6000604051905090565b600067ffffffffffffffff82111561386357613862613ca0565b5b61386c82613ce3565b9050602081019050919050565b600067ffffffffffffffff82111561389457613893613ca0565b5b61389d82613ce3565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061391882613a8c565b915061392383613a8c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561395857613957613bb5565b5b828201905092915050565b600061396e82613a8c565b915061397983613a8c565b92508261398957613988613be4565b5b828204905092915050565b600061399f82613a8c565b91506139aa83613a8c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139e3576139e2613bb5565b5b828202905092915050565b60006139f982613a8c565b9150613a0483613a8c565b925082821015613a1757613a16613bb5565b5b828203905092915050565b6000613a2d82613a6c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ac3578082015181840152602081019050613aa8565b83811115613ad2576000848401525b50505050565b60006002820490506001821680613af057607f821691505b60208210811415613b0457613b03613c13565b5b50919050565b613b1382613ce3565b810181811067ffffffffffffffff82111715613b3257613b31613ca0565b5b80604052505050565b6000613b4682613a8c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b7957613b78613bb5565b5b600182019050919050565b6000613b8f82613a8c565b9150613b9a83613a8c565b925082613baa57613ba9613be4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5573657220646964206e6f742073656e6420656e6f756768206574686572207760008201527f6974682074686973207478000000000000000000000000000000000000000000602082015250565b7f596f752068617665206d696e74656420746865206d617820616d6f756e74206460008201527f7572696e6720746865206672656520706572696f640000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5468697320746f6b656e20646f6573206e6f7420657869737400000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206c69766520796574000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420616c6c6f7765642074686973206d616e7920696e60008201527f206f6e652077616c6c6574000000000000000000000000000000000000000000602082015250565b7f5468657265206973206e6f2066756e647320746f207769746864726177000000600082015250565b7f57652063616e6e6f7420737570706c79207468697320616d6f756e7400000000600082015250565b61436181613a22565b811461436c57600080fd5b50565b61437881613a34565b811461438357600080fd5b50565b61438f81613a40565b811461439a57600080fd5b50565b6143a681613a8c565b81146143b157600080fd5b5056fea264697066735822122045d253dcf1925bc67f6405775117e639a96e135887f51b024717218c724b4fee64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000625c6284000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f647261676f6e6672756974736e66742e78797a2f73746f726167652f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024446000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d447261676f6e2046727569747300000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseUri (string): https://dragonfruitsnft.xyz/storage/
Arg [1] : _symbol (string): DF
Arg [2] : _name (string): Dragon Fruits
Arg [3] : _startTime (uint256): 1650221700

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 00000000000000000000000000000000000000000000000000000000625c6284
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [5] : 68747470733a2f2f647261676f6e6672756974736e66742e78797a2f73746f72
Arg [6] : 6167652f00000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [8] : 4446000000000000000000000000000000000000000000000000000000000000
Arg [9] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [10] : 447261676f6e2046727569747300000000000000000000000000000000000000


Deployed Bytecode Sourcemap

54030:3766:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45276:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32096:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33655:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33178:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55650:854;;;:::i;:::-;;45916:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34405:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45584:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54867:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34815:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46106:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55370:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55177:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31790:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55274:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31520:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53137:103;;;;;;;;;;;;;:::i;:::-;;54498:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57106:687;;;;;;;;;;;;;:::i;:::-;;52486:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32265:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33948:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35071:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54973:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56510:398;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55067:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34174:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53395:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45276:224;45378:4;45417:35;45402:50;;;:11;:50;;;;:90;;;;45456:36;45480:11;45456:23;:36::i;:::-;45402:90;45395:97;;45276:224;;;:::o;32096:100::-;32150:13;32183:5;32176:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32096:100;:::o;33655:221::-;33731:7;33759:16;33767:7;33759;:16::i;:::-;33751:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33844:15;:24;33860:7;33844:24;;;;;;;;;;;;;;;;;;;;;33837:31;;33655:221;;;:::o;33178:411::-;33259:13;33275:23;33290:7;33275:14;:23::i;:::-;33259:39;;33323:5;33317:11;;:2;:11;;;;33309:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33417:5;33401:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33426:37;33443:5;33450:12;:10;:12::i;:::-;33426:16;:37::i;:::-;33401:62;33379:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;33560:21;33569:2;33573:7;33560:8;:21::i;:::-;33248:341;33178:411;;:::o;55650:854::-;55692:21;55716:13;:11;:13::i;:::-;55692:37;;55810:9;;55805:1;55789:13;:17;;;;:::i;:::-;:30;;55781:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;55896:15;55914:21;55924:10;55914:9;:21::i;:::-;55896:39;;55964:12;;55954:7;:22;55946:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;56062:9;;56043:15;:28;;56035:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;56128:2;56111:13;:19;56107:270;;56168:5;;56155:9;:18;;56147:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;56107:270;;;56305:1;56294:7;:12;56286:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;56107:270;56387:46;56397:10;56409:23;:13;:21;:23::i;:::-;56387:9;:46::i;:::-;56471:25;:13;:23;:25::i;:::-;55681:823;;55650:854::o;45916:113::-;45977:7;46004:10;:17;;;;45997:24;;45916:113;:::o;34405:339::-;34600:41;34619:12;:10;:12::i;:::-;34633:7;34600:18;:41::i;:::-;34592:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34708:28;34718:4;34724:2;34728:7;34708:9;:28::i;:::-;34405:339;;;:::o;45584:256::-;45681:7;45717:23;45734:5;45717:16;:23::i;:::-;45709:5;:31;45701:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;45806:12;:19;45819:5;45806:19;;;;;;;;;;;;;;;:26;45826:5;45806:26;;;;;;;;;;;;45799:33;;45584:256;;;;:::o;54867:100::-;52717:12;:10;:12::i;:::-;52706:23;;:7;:5;:7::i;:::-;:23;;;52698:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54949:10:::1;54937:9;:22;;;;54867:100:::0;:::o;34815:185::-;34953:39;34970:4;34976:2;34980:7;34953:39;;;;;;;;;;;;:16;:39::i;:::-;34815:185;;;:::o;46106:233::-;46181:7;46217:30;:28;:30::i;:::-;46209:5;:38;46201:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;46314:10;46325:5;46314:17;;;;;;;;:::i;:::-;;;;;;;;;;46307:24;;46106:233;;;:::o;55370:133::-;52717:12;:10;:12::i;:::-;52706:23;;:7;:5;:7::i;:::-;:23;;;52698:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55457:13:::1;55447:7;:23;;;;;;;;;;;;:::i;:::-;;55370:133:::0;:::o;55177:89::-;52717:12;:10;:12::i;:::-;52706:23;;:7;:5;:7::i;:::-;:23;;;52698:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55255:3:::1;55240:12;:18;;;;55177:89:::0;:::o;31790:239::-;31862:7;31882:13;31898:7;:16;31906:7;31898:16;;;;;;;;;;;;;;;;;;;;;31882:32;;31950:1;31933:19;;:5;:19;;;;31925:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32016:5;32009:12;;;31790:239;;;:::o;55274:86::-;52717:12;:10;:12::i;:::-;52706:23;;:7;:5;:7::i;:::-;:23;;;52698:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55349:3:::1;55337:9;:15;;;;55274:86:::0;:::o;31520:208::-;31592:7;31637:1;31620:19;;:5;:19;;;;31612:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31704:9;:16;31714:5;31704:16;;;;;;;;;;;;;;;;31697:23;;31520:208;;;:::o;53137:103::-;52717:12;:10;:12::i;:::-;52706:23;;:7;:5;:7::i;:::-;:23;;;52698:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53202:30:::1;53229:1;53202:18;:30::i;:::-;53137:103::o:0;54498:24::-;;;;:::o;57106:687::-;52717:12;:10;:12::i;:::-;52706:23;;:7;:5;:7::i;:::-;:23;;;52698:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57156:15:::1;57174:21;57156:39;;57223:1;57213:7;:11;57205:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;57268:81;57279:42;57324:24;57344:3;57324:15;57336:2;57324:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;57268:10;:81::i;:::-;57366;57377:42;57422:24;57442:3;57422:15;57434:2;57422:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;57366:10;:81::i;:::-;57464;57475:42;57520:24;57540:3;57520:15;57532:2;57520:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;57464:10;:81::i;:::-;57562;57573:42;57618:24;57638:3;57618:15;57630:2;57618:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;57562:10;:81::i;:::-;57660:77;57671:42;57715:21;57660:10;:77::i;:::-;57146:647;57106:687::o:0;52486:87::-;52532:7;52559:6;;;;;;;;;;;52552:13;;52486:87;:::o;32265:104::-;32321:13;32354:7;32347:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32265:104;:::o;33948:155::-;34043:52;34062:12;:10;:12::i;:::-;34076:8;34086;34043:18;:52::i;:::-;33948:155;;:::o;35071:328::-;35246:41;35265:12;:10;:12::i;:::-;35279:7;35246:18;:41::i;:::-;35238:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35352:39;35366:4;35372:2;35376:7;35385:5;35352:13;:39::i;:::-;35071:328;;;;:::o;54973:86::-;52717:12;:10;:12::i;:::-;52706:23;;:7;:5;:7::i;:::-;:23;;;52698:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55048:3:::1;55032:13;:19;;;;54973:86:::0;:::o;56510:398::-;56582:13;56616:16;56624:7;56616;:16::i;:::-;56608:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;56673:25;56701:10;:8;:10::i;:::-;56673:38;;56757:1;56735:11;56729:25;:29;:107;;;;;;;;;;;;;;;;;56785:11;56798:18;:7;:16;:18::i;:::-;56818:13;56768:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56729:107;56722:114;;;56510:398;;;:::o;55067:102::-;52717:12;:10;:12::i;:::-;52706:23;;:7;:5;:7::i;:::-;:23;;;52698:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55157:4:::1;55141:13;:20;;;;;;;;;;;;:::i;:::-;;55067:102:::0;:::o;34174:164::-;34271:4;34295:18;:25;34314:5;34295:25;;;;;;;;;;;;;;;:35;34321:8;34295:35;;;;;;;;;;;;;;;;;;;;;;;;;34288:42;;34174:164;;;;:::o;53395:201::-;52717:12;:10;:12::i;:::-;52706:23;;:7;:5;:7::i;:::-;:23;;;52698:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53504:1:::1;53484:22;;:8;:22;;;;53476:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53560:28;53579:8;53560:18;:28::i;:::-;53395:201:::0;:::o;31151:305::-;31253:4;31305:25;31290:40;;;:11;:40;;;;:105;;;;31362:33;31347:48;;;:11;:48;;;;31290:105;:158;;;;31412:36;31436:11;31412:23;:36::i;:::-;31290:158;31270:178;;31151:305;;;:::o;36909:127::-;36974:4;37026:1;36998:30;;:7;:16;37006:7;36998:16;;;;;;;;;;;;;;;;;;;;;:30;;;;36991:37;;36909:127;;;:::o;29530:98::-;29583:7;29610:10;29603:17;;29530:98;:::o;41055:174::-;41157:2;41130:15;:24;41146:7;41130:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41213:7;41209:2;41175:46;;41184:23;41199:7;41184:14;:23::i;:::-;41175:46;;;;;;;;;;;;41055:174;;:::o;7899:114::-;7964:7;7991;:14;;;7984:21;;7899:114;;;:::o;37893:110::-;37969:26;37979:2;37983:7;37969:26;;;;;;;;;;;;:9;:26::i;:::-;37893:110;;:::o;8021:127::-;8128:1;8110:7;:14;;;:19;;;;;;;;;;;8021:127;:::o;37203:348::-;37296:4;37321:16;37329:7;37321;:16::i;:::-;37313:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37397:13;37413:23;37428:7;37413:14;:23::i;:::-;37397:39;;37466:5;37455:16;;:7;:16;;;:51;;;;37499:7;37475:31;;:20;37487:7;37475:11;:20::i;:::-;:31;;;37455:51;:87;;;;37510:32;37527:5;37534:7;37510:16;:32::i;:::-;37455:87;37447:96;;;37203:348;;;;:::o;40312:625::-;40471:4;40444:31;;:23;40459:7;40444:14;:23::i;:::-;:31;;;40436:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;40550:1;40536:16;;:2;:16;;;;40528:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40606:39;40627:4;40633:2;40637:7;40606:20;:39::i;:::-;40710:29;40727:1;40731:7;40710:8;:29::i;:::-;40771:1;40752:9;:15;40762:4;40752:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;40800:1;40783:9;:13;40793:2;40783:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40831:2;40812:7;:16;40820:7;40812:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40870:7;40866:2;40851:27;;40860:4;40851:27;;;;;;;;;;;;40891:38;40911:4;40917:2;40921:7;40891:19;:38::i;:::-;40312:625;;;:::o;53756:191::-;53830:16;53849:6;;;;;;;;;;;53830:25;;53875:8;53866:6;;:17;;;;;;;;;;;;;;;;;;53930:8;53899:40;;53920:8;53899:40;;;;;;;;;;;;53819:128;53756:191;:::o;3600:98::-;3658:7;3689:1;3685;:5;;;;:::i;:::-;3678:12;;3600:98;;;;:::o;3999:::-;4057:7;4088:1;4084;:5;;;;:::i;:::-;4077:12;;3999:98;;;;:::o;56916:182::-;56992:12;57010:8;:13;;57031:7;57010:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56991:52;;;57062:7;57054:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;56980:118;56916:182;;:::o;41371:315::-;41526:8;41517:17;;:5;:17;;;;41509:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;41613:8;41575:18;:25;41594:5;41575:25;;;;;;;;;;;;;;;:35;41601:8;41575:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;41659:8;41637:41;;41652:5;41637:41;;;41669:8;41637:41;;;;;;:::i;:::-;;;;;;;;41371:315;;;:::o;36281:::-;36438:28;36448:4;36454:2;36458:7;36438:9;:28::i;:::-;36485:48;36508:4;36514:2;36518:7;36527:5;36485:22;:48::i;:::-;36477:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;36281:315;;;;:::o;55511:131::-;55570:13;55603:7;55596:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55511:131;:::o;8857:723::-;8913:13;9143:1;9134:5;:10;9130:53;;;9161:10;;;;;;;;;;;;;;;;;;;;;9130:53;9193:12;9208:5;9193:20;;9224:14;9249:78;9264:1;9256:4;:9;9249:78;;9282:8;;;;;:::i;:::-;;;;9313:2;9305:10;;;;;:::i;:::-;;;9249:78;;;9337:19;9369:6;9359:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9337:39;;9387:154;9403:1;9394:5;:10;9387:154;;9431:1;9421:11;;;;;:::i;:::-;;;9498:2;9490:5;:10;;;;:::i;:::-;9477:2;:24;;;;:::i;:::-;9464:39;;9447:6;9454;9447:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9527:2;9518:11;;;;;:::i;:::-;;;9387:154;;;9565:6;9551:21;;;;;8857:723;;;;:::o;21932:157::-;22017:4;22056:25;22041:40;;;:11;:40;;;;22034:47;;21932:157;;;:::o;38230:321::-;38360:18;38366:2;38370:7;38360:5;:18::i;:::-;38411:54;38442:1;38446:2;38450:7;38459:5;38411:22;:54::i;:::-;38389:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;38230:321;;;:::o;46952:589::-;47096:45;47123:4;47129:2;47133:7;47096:26;:45::i;:::-;47174:1;47158:18;;:4;:18;;;47154:187;;;47193:40;47225:7;47193:31;:40::i;:::-;47154:187;;;47263:2;47255:10;;:4;:10;;;47251:90;;47282:47;47315:4;47321:7;47282:32;:47::i;:::-;47251:90;47154:187;47369:1;47355:16;;:2;:16;;;47351:183;;;47388:45;47425:7;47388:36;:45::i;:::-;47351:183;;;47461:4;47455:10;;:2;:10;;;47451:83;;47482:40;47510:2;47514:7;47482:27;:40::i;:::-;47451:83;47351:183;46952:589;;;:::o;44133:125::-;;;;:::o;42251:799::-;42406:4;42427:15;:2;:13;;;:15::i;:::-;42423:620;;;42479:2;42463:36;;;42500:12;:10;:12::i;:::-;42514:4;42520:7;42529:5;42463:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42459:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42722:1;42705:6;:13;:18;42701:272;;;42748:60;;;;;;;;;;:::i;:::-;;;;;;;;42701:272;42923:6;42917:13;42908:6;42904:2;42900:15;42893:38;42459:529;42596:41;;;42586:51;;;:6;:51;;;;42579:58;;;;;42423:620;43027:4;43020:11;;42251:799;;;;;;;:::o;38887:439::-;38981:1;38967:16;;:2;:16;;;;38959:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39040:16;39048:7;39040;:16::i;:::-;39039:17;39031:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39102:45;39131:1;39135:2;39139:7;39102:20;:45::i;:::-;39177:1;39160:9;:13;39170:2;39160:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39208:2;39189:7;:16;39197:7;39189:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39253:7;39249:2;39228:33;;39245:1;39228:33;;;;;;;;;;;;39274:44;39302:1;39306:2;39310:7;39274:19;:44::i;:::-;38887:439;;:::o;43622:126::-;;;;:::o;48264:164::-;48368:10;:17;;;;48341:15;:24;48357:7;48341:24;;;;;;;;;;;:44;;;;48396:10;48412:7;48396:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48264:164;:::o;49055:988::-;49321:22;49371:1;49346:22;49363:4;49346:16;:22::i;:::-;:26;;;;:::i;:::-;49321:51;;49383:18;49404:17;:26;49422:7;49404:26;;;;;;;;;;;;49383:47;;49551:14;49537:10;:28;49533:328;;49582:19;49604:12;:18;49617:4;49604:18;;;;;;;;;;;;;;;:34;49623:14;49604:34;;;;;;;;;;;;49582:56;;49688:11;49655:12;:18;49668:4;49655:18;;;;;;;;;;;;;;;:30;49674:10;49655:30;;;;;;;;;;;:44;;;;49805:10;49772:17;:30;49790:11;49772:30;;;;;;;;;;;:43;;;;49567:294;49533:328;49957:17;:26;49975:7;49957:26;;;;;;;;;;;49950:33;;;50001:12;:18;50014:4;50001:18;;;;;;;;;;;;;;;:34;50020:14;50001:34;;;;;;;;;;;49994:41;;;49136:907;;49055:988;;:::o;50338:1079::-;50591:22;50636:1;50616:10;:17;;;;:21;;;;:::i;:::-;50591:46;;50648:18;50669:15;:24;50685:7;50669:24;;;;;;;;;;;;50648:45;;51020:19;51042:10;51053:14;51042:26;;;;;;;;:::i;:::-;;;;;;;;;;51020:48;;51106:11;51081:10;51092;51081:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;51217:10;51186:15;:28;51202:11;51186:28;;;;;;;;;;;:41;;;;51358:15;:24;51374:7;51358:24;;;;;;;;;;;51351:31;;;51393:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50409:1008;;;50338:1079;:::o;47842:221::-;47927:14;47944:20;47961:2;47944:16;:20::i;:::-;47927:37;;48002:7;47975:12;:16;47988:2;47975:16;;;;;;;;;;;;;;;:24;47992:6;47975:24;;;;;;;;;;;:34;;;;48049:6;48020:17;:26;48038:7;48020:26;;;;;;;;;;;:35;;;;47916:147;47842:221;;:::o;11849:326::-;11909:4;12166:1;12144:7;:19;;;:23;12137:30;;11849:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8540:845::-;8643:3;8680:5;8674:12;8709:36;8735:9;8709:36;:::i;:::-;8761:89;8843:6;8838:3;8761:89;:::i;:::-;8754:96;;8881:1;8870:9;8866:17;8897:1;8892:137;;;;9043:1;9038:341;;;;8859:520;;8892:137;8976:4;8972:9;8961;8957:25;8952:3;8945:38;9012:6;9007:3;9003:16;8996:23;;8892:137;;9038:341;9105:38;9137:5;9105:38;:::i;:::-;9165:1;9179:154;9193:6;9190:1;9187:13;9179:154;;;9267:7;9261:14;9257:1;9252:3;9248:11;9241:35;9317:1;9308:7;9304:15;9293:26;;9215:4;9212:1;9208:12;9203:17;;9179:154;;;9362:6;9357:3;9353:16;9346:23;;9045:334;;8859:520;;8647:738;;8540:845;;;;:::o;9391:366::-;9533:3;9554:67;9618:2;9613:3;9554:67;:::i;:::-;9547:74;;9630:93;9719:3;9630:93;:::i;:::-;9748:2;9743:3;9739:12;9732:19;;9391:366;;;:::o;9763:::-;9905:3;9926:67;9990:2;9985:3;9926:67;:::i;:::-;9919:74;;10002:93;10091:3;10002:93;:::i;:::-;10120:2;10115:3;10111:12;10104:19;;9763:366;;;:::o;10135:::-;10277:3;10298:67;10362:2;10357:3;10298:67;:::i;:::-;10291:74;;10374:93;10463:3;10374:93;:::i;:::-;10492:2;10487:3;10483:12;10476:19;;10135:366;;;:::o;10507:::-;10649:3;10670:67;10734:2;10729:3;10670:67;:::i;:::-;10663:74;;10746:93;10835:3;10746:93;:::i;:::-;10864:2;10859:3;10855:12;10848:19;;10507:366;;;:::o;10879:::-;11021:3;11042:67;11106:2;11101:3;11042:67;:::i;:::-;11035:74;;11118:93;11207:3;11118:93;:::i;:::-;11236:2;11231:3;11227:12;11220:19;;10879:366;;;:::o;11251:::-;11393:3;11414:67;11478:2;11473:3;11414:67;:::i;:::-;11407:74;;11490:93;11579:3;11490:93;:::i;:::-;11608:2;11603:3;11599:12;11592:19;;11251:366;;;:::o;11623:::-;11765:3;11786:67;11850:2;11845:3;11786:67;:::i;:::-;11779:74;;11862:93;11951:3;11862:93;:::i;:::-;11980:2;11975:3;11971:12;11964:19;;11623:366;;;:::o;11995:::-;12137:3;12158:67;12222:2;12217:3;12158:67;:::i;:::-;12151:74;;12234:93;12323:3;12234:93;:::i;:::-;12352:2;12347:3;12343:12;12336:19;;11995:366;;;:::o;12367:::-;12509:3;12530:67;12594:2;12589:3;12530:67;:::i;:::-;12523:74;;12606:93;12695:3;12606:93;:::i;:::-;12724:2;12719:3;12715:12;12708:19;;12367:366;;;:::o;12739:::-;12881:3;12902:67;12966:2;12961:3;12902:67;:::i;:::-;12895:74;;12978:93;13067:3;12978:93;:::i;:::-;13096:2;13091:3;13087:12;13080:19;;12739:366;;;:::o;13111:::-;13253:3;13274:67;13338:2;13333:3;13274:67;:::i;:::-;13267:74;;13350:93;13439:3;13350:93;:::i;:::-;13468:2;13463:3;13459:12;13452:19;;13111:366;;;:::o;13483:::-;13625:3;13646:67;13710:2;13705:3;13646:67;:::i;:::-;13639:74;;13722:93;13811:3;13722:93;:::i;:::-;13840:2;13835:3;13831:12;13824:19;;13483:366;;;:::o;13855:::-;13997:3;14018:67;14082:2;14077:3;14018:67;:::i;:::-;14011:74;;14094:93;14183:3;14094:93;:::i;:::-;14212:2;14207:3;14203:12;14196:19;;13855:366;;;:::o;14227:::-;14369:3;14390:67;14454:2;14449:3;14390:67;:::i;:::-;14383:74;;14466:93;14555:3;14466:93;:::i;:::-;14584:2;14579:3;14575:12;14568:19;;14227:366;;;:::o;14599:::-;14741:3;14762:67;14826:2;14821:3;14762:67;:::i;:::-;14755:74;;14838:93;14927:3;14838:93;:::i;:::-;14956:2;14951:3;14947:12;14940:19;;14599:366;;;:::o;14971:::-;15113:3;15134:67;15198:2;15193:3;15134:67;:::i;:::-;15127:74;;15210:93;15299:3;15210:93;:::i;:::-;15328:2;15323:3;15319:12;15312:19;;14971:366;;;:::o;15343:::-;15485:3;15506:67;15570:2;15565:3;15506:67;:::i;:::-;15499:74;;15582:93;15671:3;15582:93;:::i;:::-;15700:2;15695:3;15691:12;15684:19;;15343:366;;;:::o;15715:::-;15857:3;15878:67;15942:2;15937:3;15878:67;:::i;:::-;15871:74;;15954:93;16043:3;15954:93;:::i;:::-;16072:2;16067:3;16063:12;16056:19;;15715:366;;;:::o;16087:398::-;16246:3;16267:83;16348:1;16343:3;16267:83;:::i;:::-;16260:90;;16359:93;16448:3;16359:93;:::i;:::-;16477:1;16472:3;16468:11;16461:18;;16087:398;;;:::o;16491:366::-;16633:3;16654:67;16718:2;16713:3;16654:67;:::i;:::-;16647:74;;16730:93;16819:3;16730:93;:::i;:::-;16848:2;16843:3;16839:12;16832:19;;16491:366;;;:::o;16863:::-;17005:3;17026:67;17090:2;17085:3;17026:67;:::i;:::-;17019:74;;17102:93;17191:3;17102:93;:::i;:::-;17220:2;17215:3;17211:12;17204:19;;16863:366;;;:::o;17235:::-;17377:3;17398:67;17462:2;17457:3;17398:67;:::i;:::-;17391:74;;17474:93;17563:3;17474:93;:::i;:::-;17592:2;17587:3;17583:12;17576:19;;17235:366;;;:::o;17607:::-;17749:3;17770:67;17834:2;17829:3;17770:67;:::i;:::-;17763:74;;17846:93;17935:3;17846:93;:::i;:::-;17964:2;17959:3;17955:12;17948:19;;17607:366;;;:::o;17979:::-;18121:3;18142:67;18206:2;18201:3;18142:67;:::i;:::-;18135:74;;18218:93;18307:3;18218:93;:::i;:::-;18336:2;18331:3;18327:12;18320:19;;17979:366;;;:::o;18351:::-;18493:3;18514:67;18578:2;18573:3;18514:67;:::i;:::-;18507:74;;18590:93;18679:3;18590:93;:::i;:::-;18708:2;18703:3;18699:12;18692:19;;18351:366;;;:::o;18723:::-;18865:3;18886:67;18950:2;18945:3;18886:67;:::i;:::-;18879:74;;18962:93;19051:3;18962:93;:::i;:::-;19080:2;19075:3;19071:12;19064:19;;18723:366;;;:::o;19095:118::-;19182:24;19200:5;19182:24;:::i;:::-;19177:3;19170:37;19095:118;;:::o;19219:589::-;19444:3;19466:95;19557:3;19548:6;19466:95;:::i;:::-;19459:102;;19578:95;19669:3;19660:6;19578:95;:::i;:::-;19571:102;;19690:92;19778:3;19769:6;19690:92;:::i;:::-;19683:99;;19799:3;19792:10;;19219:589;;;;;;:::o;19814:379::-;19998:3;20020:147;20163:3;20020:147;:::i;:::-;20013:154;;20184:3;20177:10;;19814:379;;;:::o;20199:222::-;20292:4;20330:2;20319:9;20315:18;20307:26;;20343:71;20411:1;20400:9;20396:17;20387:6;20343:71;:::i;:::-;20199:222;;;;:::o;20427:640::-;20622:4;20660:3;20649:9;20645:19;20637:27;;20674:71;20742:1;20731:9;20727:17;20718:6;20674:71;:::i;:::-;20755:72;20823:2;20812:9;20808:18;20799:6;20755:72;:::i;:::-;20837;20905:2;20894:9;20890:18;20881:6;20837:72;:::i;:::-;20956:9;20950:4;20946:20;20941:2;20930:9;20926:18;20919:48;20984:76;21055:4;21046:6;20984:76;:::i;:::-;20976:84;;20427:640;;;;;;;:::o;21073:210::-;21160:4;21198:2;21187:9;21183:18;21175:26;;21211:65;21273:1;21262:9;21258:17;21249:6;21211:65;:::i;:::-;21073:210;;;;:::o;21289:313::-;21402:4;21440:2;21429:9;21425:18;21417:26;;21489:9;21483:4;21479:20;21475:1;21464:9;21460:17;21453:47;21517:78;21590:4;21581:6;21517:78;:::i;:::-;21509:86;;21289:313;;;;:::o;21608:419::-;21774:4;21812:2;21801:9;21797:18;21789:26;;21861:9;21855:4;21851:20;21847:1;21836:9;21832:17;21825:47;21889:131;22015:4;21889:131;:::i;:::-;21881:139;;21608:419;;;:::o;22033:::-;22199:4;22237:2;22226:9;22222:18;22214:26;;22286:9;22280:4;22276:20;22272:1;22261:9;22257:17;22250:47;22314:131;22440:4;22314:131;:::i;:::-;22306:139;;22033:419;;;:::o;22458:::-;22624:4;22662:2;22651:9;22647:18;22639:26;;22711:9;22705:4;22701:20;22697:1;22686:9;22682:17;22675:47;22739:131;22865:4;22739:131;:::i;:::-;22731:139;;22458:419;;;:::o;22883:::-;23049:4;23087:2;23076:9;23072:18;23064:26;;23136:9;23130:4;23126:20;23122:1;23111:9;23107:17;23100:47;23164:131;23290:4;23164:131;:::i;:::-;23156:139;;22883:419;;;:::o;23308:::-;23474:4;23512:2;23501:9;23497:18;23489:26;;23561:9;23555:4;23551:20;23547:1;23536:9;23532:17;23525:47;23589:131;23715:4;23589:131;:::i;:::-;23581:139;;23308:419;;;:::o;23733:::-;23899:4;23937:2;23926:9;23922:18;23914:26;;23986:9;23980:4;23976:20;23972:1;23961:9;23957:17;23950:47;24014:131;24140:4;24014:131;:::i;:::-;24006:139;;23733:419;;;:::o;24158:::-;24324:4;24362:2;24351:9;24347:18;24339:26;;24411:9;24405:4;24401:20;24397:1;24386:9;24382:17;24375:47;24439:131;24565:4;24439:131;:::i;:::-;24431:139;;24158:419;;;:::o;24583:::-;24749:4;24787:2;24776:9;24772:18;24764:26;;24836:9;24830:4;24826:20;24822:1;24811:9;24807:17;24800:47;24864:131;24990:4;24864:131;:::i;:::-;24856:139;;24583:419;;;:::o;25008:::-;25174:4;25212:2;25201:9;25197:18;25189:26;;25261:9;25255:4;25251:20;25247:1;25236:9;25232:17;25225:47;25289:131;25415:4;25289:131;:::i;:::-;25281:139;;25008:419;;;:::o;25433:::-;25599:4;25637:2;25626:9;25622:18;25614:26;;25686:9;25680:4;25676:20;25672:1;25661:9;25657:17;25650:47;25714:131;25840:4;25714:131;:::i;:::-;25706:139;;25433:419;;;:::o;25858:::-;26024:4;26062:2;26051:9;26047:18;26039:26;;26111:9;26105:4;26101:20;26097:1;26086:9;26082:17;26075:47;26139:131;26265:4;26139:131;:::i;:::-;26131:139;;25858:419;;;:::o;26283:::-;26449:4;26487:2;26476:9;26472:18;26464:26;;26536:9;26530:4;26526:20;26522:1;26511:9;26507:17;26500:47;26564:131;26690:4;26564:131;:::i;:::-;26556:139;;26283:419;;;:::o;26708:::-;26874:4;26912:2;26901:9;26897:18;26889:26;;26961:9;26955:4;26951:20;26947:1;26936:9;26932:17;26925:47;26989:131;27115:4;26989:131;:::i;:::-;26981:139;;26708:419;;;:::o;27133:::-;27299:4;27337:2;27326:9;27322:18;27314:26;;27386:9;27380:4;27376:20;27372:1;27361:9;27357:17;27350:47;27414:131;27540:4;27414:131;:::i;:::-;27406:139;;27133:419;;;:::o;27558:::-;27724:4;27762:2;27751:9;27747:18;27739:26;;27811:9;27805:4;27801:20;27797:1;27786:9;27782:17;27775:47;27839:131;27965:4;27839:131;:::i;:::-;27831:139;;27558:419;;;:::o;27983:::-;28149:4;28187:2;28176:9;28172:18;28164:26;;28236:9;28230:4;28226:20;28222:1;28211:9;28207:17;28200:47;28264:131;28390:4;28264:131;:::i;:::-;28256:139;;27983:419;;;:::o;28408:::-;28574:4;28612:2;28601:9;28597:18;28589:26;;28661:9;28655:4;28651:20;28647:1;28636:9;28632:17;28625:47;28689:131;28815:4;28689:131;:::i;:::-;28681:139;;28408:419;;;:::o;28833:::-;28999:4;29037:2;29026:9;29022:18;29014:26;;29086:9;29080:4;29076:20;29072:1;29061:9;29057:17;29050:47;29114:131;29240:4;29114:131;:::i;:::-;29106:139;;28833:419;;;:::o;29258:::-;29424:4;29462:2;29451:9;29447:18;29439:26;;29511:9;29505:4;29501:20;29497:1;29486:9;29482:17;29475:47;29539:131;29665:4;29539:131;:::i;:::-;29531:139;;29258:419;;;:::o;29683:::-;29849:4;29887:2;29876:9;29872:18;29864:26;;29936:9;29930:4;29926:20;29922:1;29911:9;29907:17;29900:47;29964:131;30090:4;29964:131;:::i;:::-;29956:139;;29683:419;;;:::o;30108:::-;30274:4;30312:2;30301:9;30297:18;30289:26;;30361:9;30355:4;30351:20;30347:1;30336:9;30332:17;30325:47;30389:131;30515:4;30389:131;:::i;:::-;30381:139;;30108:419;;;:::o;30533:::-;30699:4;30737:2;30726:9;30722:18;30714:26;;30786:9;30780:4;30776:20;30772:1;30761:9;30757:17;30750:47;30814:131;30940:4;30814:131;:::i;:::-;30806:139;;30533:419;;;:::o;30958:::-;31124:4;31162:2;31151:9;31147:18;31139:26;;31211:9;31205:4;31201:20;31197:1;31186:9;31182:17;31175:47;31239:131;31365:4;31239:131;:::i;:::-;31231:139;;30958:419;;;:::o;31383:::-;31549:4;31587:2;31576:9;31572:18;31564:26;;31636:9;31630:4;31626:20;31622:1;31611:9;31607:17;31600:47;31664:131;31790:4;31664:131;:::i;:::-;31656:139;;31383:419;;;:::o;31808:::-;31974:4;32012:2;32001:9;31997:18;31989:26;;32061:9;32055:4;32051:20;32047:1;32036:9;32032:17;32025:47;32089:131;32215:4;32089:131;:::i;:::-;32081:139;;31808:419;;;:::o;32233:222::-;32326:4;32364:2;32353:9;32349:18;32341:26;;32377:71;32445:1;32434:9;32430:17;32421:6;32377:71;:::i;:::-;32233:222;;;;:::o;32461:129::-;32495:6;32522:20;;:::i;:::-;32512:30;;32551:33;32579:4;32571:6;32551:33;:::i;:::-;32461:129;;;:::o;32596:75::-;32629:6;32662:2;32656:9;32646:19;;32596:75;:::o;32677:307::-;32738:4;32828:18;32820:6;32817:30;32814:56;;;32850:18;;:::i;:::-;32814:56;32888:29;32910:6;32888:29;:::i;:::-;32880:37;;32972:4;32966;32962:15;32954:23;;32677:307;;;:::o;32990:308::-;33052:4;33142:18;33134:6;33131:30;33128:56;;;33164:18;;:::i;:::-;33128:56;33202:29;33224:6;33202:29;:::i;:::-;33194:37;;33286:4;33280;33276:15;33268:23;;32990:308;;;:::o;33304:141::-;33353:4;33376:3;33368:11;;33399:3;33396:1;33389:14;33433:4;33430:1;33420:18;33412:26;;33304:141;;;:::o;33451:98::-;33502:6;33536:5;33530:12;33520:22;;33451:98;;;:::o;33555:99::-;33607:6;33641:5;33635:12;33625:22;;33555:99;;;:::o;33660:168::-;33743:11;33777:6;33772:3;33765:19;33817:4;33812:3;33808:14;33793:29;;33660:168;;;;:::o;33834:147::-;33935:11;33972:3;33957:18;;33834:147;;;;:::o;33987:169::-;34071:11;34105:6;34100:3;34093:19;34145:4;34140:3;34136:14;34121:29;;33987:169;;;;:::o;34162:148::-;34264:11;34301:3;34286:18;;34162:148;;;;:::o;34316:305::-;34356:3;34375:20;34393:1;34375:20;:::i;:::-;34370:25;;34409:20;34427:1;34409:20;:::i;:::-;34404:25;;34563:1;34495:66;34491:74;34488:1;34485:81;34482:107;;;34569:18;;:::i;:::-;34482:107;34613:1;34610;34606:9;34599:16;;34316:305;;;;:::o;34627:185::-;34667:1;34684:20;34702:1;34684:20;:::i;:::-;34679:25;;34718:20;34736:1;34718:20;:::i;:::-;34713:25;;34757:1;34747:35;;34762:18;;:::i;:::-;34747:35;34804:1;34801;34797:9;34792:14;;34627:185;;;;:::o;34818:348::-;34858:7;34881:20;34899:1;34881:20;:::i;:::-;34876:25;;34915:20;34933:1;34915:20;:::i;:::-;34910:25;;35103:1;35035:66;35031:74;35028:1;35025:81;35020:1;35013:9;35006:17;35002:105;34999:131;;;35110:18;;:::i;:::-;34999:131;35158:1;35155;35151:9;35140:20;;34818:348;;;;:::o;35172:191::-;35212:4;35232:20;35250:1;35232:20;:::i;:::-;35227:25;;35266:20;35284:1;35266:20;:::i;:::-;35261:25;;35305:1;35302;35299:8;35296:34;;;35310:18;;:::i;:::-;35296:34;35355:1;35352;35348:9;35340:17;;35172:191;;;;:::o;35369:96::-;35406:7;35435:24;35453:5;35435:24;:::i;:::-;35424:35;;35369:96;;;:::o;35471:90::-;35505:7;35548:5;35541:13;35534:21;35523:32;;35471:90;;;:::o;35567:149::-;35603:7;35643:66;35636:5;35632:78;35621:89;;35567:149;;;:::o;35722:126::-;35759:7;35799:42;35792:5;35788:54;35777:65;;35722:126;;;:::o;35854:77::-;35891:7;35920:5;35909:16;;35854:77;;;:::o;35937:154::-;36021:6;36016:3;36011;35998:30;36083:1;36074:6;36069:3;36065:16;36058:27;35937:154;;;:::o;36097:307::-;36165:1;36175:113;36189:6;36186:1;36183:13;36175:113;;;36274:1;36269:3;36265:11;36259:18;36255:1;36250:3;36246:11;36239:39;36211:2;36208:1;36204:10;36199:15;;36175:113;;;36306:6;36303:1;36300:13;36297:101;;;36386:1;36377:6;36372:3;36368:16;36361:27;36297:101;36146:258;36097:307;;;:::o;36410:320::-;36454:6;36491:1;36485:4;36481:12;36471:22;;36538:1;36532:4;36528:12;36559:18;36549:81;;36615:4;36607:6;36603:17;36593:27;;36549:81;36677:2;36669:6;36666:14;36646:18;36643:38;36640:84;;;36696:18;;:::i;:::-;36640:84;36461:269;36410:320;;;:::o;36736:281::-;36819:27;36841:4;36819:27;:::i;:::-;36811:6;36807:40;36949:6;36937:10;36934:22;36913:18;36901:10;36898:34;36895:62;36892:88;;;36960:18;;:::i;:::-;36892:88;37000:10;36996:2;36989:22;36779:238;36736:281;;:::o;37023:233::-;37062:3;37085:24;37103:5;37085:24;:::i;:::-;37076:33;;37131:66;37124:5;37121:77;37118:103;;;37201:18;;:::i;:::-;37118:103;37248:1;37241:5;37237:13;37230:20;;37023:233;;;:::o;37262:176::-;37294:1;37311:20;37329:1;37311:20;:::i;:::-;37306:25;;37345:20;37363:1;37345:20;:::i;:::-;37340:25;;37384:1;37374:35;;37389:18;;:::i;:::-;37374:35;37430:1;37427;37423:9;37418:14;;37262:176;;;;:::o;37444:180::-;37492:77;37489:1;37482:88;37589:4;37586:1;37579:15;37613:4;37610:1;37603:15;37630:180;37678:77;37675:1;37668:88;37775:4;37772:1;37765:15;37799:4;37796:1;37789:15;37816:180;37864:77;37861:1;37854:88;37961:4;37958:1;37951:15;37985:4;37982:1;37975:15;38002:180;38050:77;38047:1;38040:88;38147:4;38144:1;38137:15;38171:4;38168:1;38161:15;38188:180;38236:77;38233:1;38226:88;38333:4;38330:1;38323:15;38357:4;38354:1;38347:15;38374:180;38422:77;38419:1;38412:88;38519:4;38516:1;38509:15;38543:4;38540:1;38533:15;38560:117;38669:1;38666;38659:12;38683:117;38792:1;38789;38782:12;38806:117;38915:1;38912;38905:12;38929:117;39038:1;39035;39028:12;39052:102;39093:6;39144:2;39140:7;39135:2;39128:5;39124:14;39120:28;39110:38;;39052:102;;;:::o;39160:230::-;39300:34;39296:1;39288:6;39284:14;39277:58;39369:13;39364:2;39356:6;39352:15;39345:38;39160:230;:::o;39396:240::-;39536:34;39532:1;39524:6;39520:14;39513:58;39605:23;39600:2;39592:6;39588:15;39581:48;39396:240;:::o;39642:230::-;39782:34;39778:1;39770:6;39766:14;39759:58;39851:13;39846:2;39838:6;39834:15;39827:38;39642:230;:::o;39878:237::-;40018:34;40014:1;40006:6;40002:14;39995:58;40087:20;40082:2;40074:6;40070:15;40063:45;39878:237;:::o;40121:225::-;40261:34;40257:1;40249:6;40245:14;40238:58;40330:8;40325:2;40317:6;40313:15;40306:33;40121:225;:::o;40352:224::-;40492:34;40488:1;40480:6;40476:14;40469:58;40561:7;40556:2;40548:6;40544:15;40537:32;40352:224;:::o;40582:178::-;40722:30;40718:1;40710:6;40706:14;40699:54;40582:178;:::o;40766:223::-;40906:34;40902:1;40894:6;40890:14;40883:58;40975:6;40970:2;40962:6;40958:15;40951:31;40766:223;:::o;40995:175::-;41135:27;41131:1;41123:6;41119:14;41112:51;40995:175;:::o;41176:231::-;41316:34;41312:1;41304:6;41300:14;41293:58;41385:14;41380:2;41372:6;41368:15;41361:39;41176:231;:::o;41413:175::-;41553:27;41549:1;41541:6;41537:14;41530:51;41413:175;:::o;41594:243::-;41734:34;41730:1;41722:6;41718:14;41711:58;41803:26;41798:2;41790:6;41786:15;41779:51;41594:243;:::o;41843:229::-;41983:34;41979:1;41971:6;41967:14;41960:58;42052:12;42047:2;42039:6;42035:15;42028:37;41843:229;:::o;42078:228::-;42218:34;42214:1;42206:6;42202:14;42195:58;42287:11;42282:2;42274:6;42270:15;42263:36;42078:228;:::o;42312:182::-;42452:34;42448:1;42440:6;42436:14;42429:58;42312:182;:::o;42500:231::-;42640:34;42636:1;42628:6;42624:14;42617:58;42709:14;42704:2;42696:6;42692:15;42685:39;42500:231;:::o;42737:182::-;42877:34;42873:1;42865:6;42861:14;42854:58;42737:182;:::o;42925:220::-;43065:34;43061:1;43053:6;43049:14;43042:58;43134:3;43129:2;43121:6;43117:15;43110:28;42925:220;:::o;43151:114::-;;:::o;43271:166::-;43411:18;43407:1;43399:6;43395:14;43388:42;43271:166;:::o;43443:236::-;43583:34;43579:1;43571:6;43567:14;43560:58;43652:19;43647:2;43639:6;43635:15;43628:44;43443:236;:::o;43685:170::-;43825:22;43821:1;43813:6;43809:14;43802:46;43685:170;:::o;43861:231::-;44001:34;43997:1;43989:6;43985:14;43978:58;44070:14;44065:2;44057:6;44053:15;44046:39;43861:231;:::o;44098:230::-;44238:34;44234:1;44226:6;44222:14;44215:58;44307:13;44302:2;44294:6;44290:15;44283:38;44098:230;:::o;44334:179::-;44474:31;44470:1;44462:6;44458:14;44451:55;44334:179;:::o;44519:178::-;44659:30;44655:1;44647:6;44643:14;44636:54;44519:178;:::o;44703:122::-;44776:24;44794:5;44776:24;:::i;:::-;44769:5;44766:35;44756:63;;44815:1;44812;44805:12;44756:63;44703:122;:::o;44831:116::-;44901:21;44916:5;44901:21;:::i;:::-;44894:5;44891:32;44881:60;;44937:1;44934;44927:12;44881:60;44831:116;:::o;44953:120::-;45025:23;45042:5;45025:23;:::i;:::-;45018:5;45015:34;45005:62;;45063:1;45060;45053:12;45005:62;44953:120;:::o;45079:122::-;45152:24;45170:5;45152:24;:::i;:::-;45145:5;45142:35;45132:63;;45191:1;45188;45181:12;45132:63;45079:122;:::o

Swarm Source

ipfs://45d253dcf1925bc67f6405775117e639a96e135887f51b024717218c724b4fee
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.