ETH Price: $3,619.54 (+8.93%)

BearFvckers (BearFvcker)
 

Overview

TokenID

291

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
BearFvckers

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.4;









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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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


pragma solidity >=0.8.9 <0.9.0;













contract BearFvckers is ERC721A, Ownable, ReentrancyGuard {

  using Strings for uint256;

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

  string public uriPrefix = '';
  string public uriSuffix = '.json';
  string public hiddenMetadataUri;
  
  uint256 public cost= 0.002 ether;
  uint256 public maxSupply = 3000;
  uint256 public maxMintAmountPerTx = 10;
  uint256 public constant MAX_FREE = 1;
  uint256 public MAX_PER_WALLET = 10;

  bool public paused = false;
  bool public whitelistMintEnabled = false;
  bool public revealed = true;
  mapping(address => uint) private _walletMintedCount;

  constructor(
    string memory _tokenName,
    string memory _tokenSymbol,
    uint256 _cost,
    uint256 _maxSupply,
    uint256 _maxMintAmountPerTx,
    string memory _hiddenMetadataUri
  ) ERC721A(_tokenName, _tokenSymbol) {
    setCost(_cost);
    maxSupply = _maxSupply;
    setMaxMintAmountPerTx(_maxMintAmountPerTx);
    setHiddenMetadataUri(_hiddenMetadataUri);
  }

  modifier mintCompliance(uint256 count) {
    require(count > 0 && count <= maxMintAmountPerTx, 'Invalid mint amount!');
    require(totalSupply() + count <= maxSupply, 'Max supply exceeded!');
    _;
  }

  modifier mintPriceCompliance(uint256 count) {
    require(msg.value >= cost * count, 'Insufficient funds!');
    _;
  }

  function whitelistMint(uint256 count, bytes32[] calldata _merkleProof) public payable mintCompliance(count) mintPriceCompliance(count) {
    require(whitelistMintEnabled, 'The whitelist sale is not enabled!');
    require(!whitelistClaimed[_msgSender()], 'Address already claimed!');
    bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
    require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Invalid proof!');

    whitelistClaimed[_msgSender()] = true;
    _safeMint(_msgSender(), count);
  }

  function mint(uint256 count) external payable  {
    require(!paused, 'The contract is paused!');
		require(count <= maxMintAmountPerTx,'Exceeds NFT per transaction limit');
		require(totalSupply() + count <= maxSupply,'Exceeds max supply');
    require(
            _numberMinted(msg.sender) + count <= MAX_PER_WALLET,
            "Too many for address"
        );

        uint payForCount = count;
        uint mintedSoFar = _walletMintedCount[msg.sender];
        if(mintedSoFar < MAX_FREE) {
            uint remainingFreeMints = MAX_FREE - mintedSoFar;
            if(count > remainingFreeMints) {
                payForCount = count - remainingFreeMints;
            }
            else {
                payForCount = 0;
            }
        }

		require(
			msg.value >= payForCount * cost,
			'Ether value sent is not sufficient'
		);

		_walletMintedCount[msg.sender] += count;
		_safeMint(msg.sender, count);
    // require(isContract(msg.sender) == false, "Cannot mint from a contract");
    // require(!paused, 'The contract is paused!');

    // _safeMint(_msgSender(), count);
  }
  

  function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
  
  function mintForAddress(uint256 count, address _receiver) public mintCompliance(count) onlyOwner {
    _safeMint(_receiver, count);
  }

  function walletOfOwner(address _owner) public view returns (uint256[] memory) {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = _startTokenId();
    uint256 ownedTokenIndex = 0;
    address latestOwnerAddress;

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

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

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

          ownedTokenIndex++;
        }
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

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

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

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

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

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

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

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

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

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

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

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

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

  function setWhitelistMintEnabled(bool _state) public onlyOwner {
    whitelistMintEnabled = _state;
  }

  function mintedCount(address owner) external view returns (uint) {
        return _walletMintedCount[owner];
    }

  function withdraw() public onlyOwner nonReentrant {
    (bool os, ) = payable(owner()).call{value: address(this).balance}('');
    require(os);
  }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"},{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_FREE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","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":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"mintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600c908162000024919062000708565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90816200006b919062000708565b5066071afd498d0000600f55610bb8601055600a601155600a6012556000601360006101000a81548160ff0219169083151502179055506000601360016101000a81548160ff0219169083151502179055506001601360026101000a81548160ff021916908315150217905550348015620000e557600080fd5b5060405162005b3538038062005b3583398181016040528101906200010b919062000984565b858581600290816200011e919062000708565b50806003908162000130919062000708565b5062000141620001b760201b60201c565b6000819055505050620001696200015d620001c060201b60201c565b620001c860201b60201c565b600160098190555062000182846200028e60201b60201c565b826010819055506200019a826200032760201b60201c565b620001ab81620003c060201b60201c565b50505050505062000b00565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200029e620001c060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002c46200046460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200031d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003149062000ade565b60405180910390fd5b80600f8190555050565b62000337620001c060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200035d6200046460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003b6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ad9062000ade565b60405180910390fd5b8060118190555050565b620003d0620001c060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003f66200046460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200044f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004469062000ade565b60405180910390fd5b80600e908162000460919062000708565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200051057607f821691505b602082108103620005265762000525620004c8565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000551565b6200059c868362000551565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005e9620005e3620005dd84620005b4565b620005be565b620005b4565b9050919050565b6000819050919050565b6200060583620005c8565b6200061d6200061482620005f0565b8484546200055e565b825550505050565b600090565b6200063462000625565b62000641818484620005fa565b505050565b5b8181101562000669576200065d6000826200062a565b60018101905062000647565b5050565b601f821115620006b85762000682816200052c565b6200068d8462000541565b810160208510156200069d578190505b620006b5620006ac8562000541565b83018262000646565b50505b505050565b600082821c905092915050565b6000620006dd60001984600802620006bd565b1980831691505092915050565b6000620006f88383620006ca565b9150826002028217905092915050565b62000713826200048e565b67ffffffffffffffff8111156200072f576200072e62000499565b5b6200073b8254620004f7565b620007488282856200066d565b600060209050601f8311600181146200078057600084156200076b578287015190505b620007778582620006ea565b865550620007e7565b601f19841662000790866200052c565b60005b82811015620007ba5784890151825560018201915060208501945060208101905062000793565b86831015620007da5784890151620007d6601f891682620006ca565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000829826200080d565b810181811067ffffffffffffffff821117156200084b576200084a62000499565b5b80604052505050565b600062000860620007ef565b90506200086e82826200081e565b919050565b600067ffffffffffffffff82111562000891576200089062000499565b5b6200089c826200080d565b9050602081019050919050565b60005b83811015620008c9578082015181840152602081019050620008ac565b60008484015250505050565b6000620008ec620008e68462000873565b62000854565b9050828152602081018484840111156200090b576200090a62000808565b5b62000918848285620008a9565b509392505050565b600082601f83011262000938576200093762000803565b5b81516200094a848260208601620008d5565b91505092915050565b6200095e81620005b4565b81146200096a57600080fd5b50565b6000815190506200097e8162000953565b92915050565b60008060008060008060c08789031215620009a457620009a3620007f9565b5b600087015167ffffffffffffffff811115620009c557620009c4620007fe565b5b620009d389828a0162000920565b965050602087015167ffffffffffffffff811115620009f757620009f6620007fe565b5b62000a0589828a0162000920565b955050604062000a1889828a016200096d565b945050606062000a2b89828a016200096d565b935050608062000a3e89828a016200096d565b92505060a087015167ffffffffffffffff81111562000a625762000a61620007fe565b5b62000a7089828a0162000920565b9150509295509295509295565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000ac660208362000a7d565b915062000ad38262000a8e565b602082019050919050565b6000602082019050818103600083015262000af98162000ab7565b9050919050565b6150258062000b106000396000f3fe6080604052600436106102725760003560e01c806370a082311161014f578063b767a098116100c1578063e0a808531161007a578063e0a8085314610922578063e985e9c51461094b578063ed6661c214610988578063efbd73f4146109b3578063f2fde38b146109dc578063fddcb5ea14610a0557610272565b8063b767a0981461080f578063b88d4fde14610838578063c87b56dd14610861578063d2cab0561461089e578063d5abeb01146108ba578063db4bec44146108e557610272565b806394354fd01161011357806394354fd01461072057806395d89b411461074b578063a0712d6814610776578063a22cb46514610792578063a45ba8e7146107bb578063b071401b146107e657610272565b806370a082311461064f578063715018a61461068c5780637cb64759146106a35780637ec4a659146106cc5780638da5cb5b146106f557610272565b80633ccfd60b116101e857806351830227116101ac578063518302271461053b5780635503a0e8146105665780635c975abb1461059157806362b99ad4146105bc5780636352211e146105e75780636caede3d1461062457610272565b80633ccfd60b1461046c57806342842e0e14610483578063438b6300146104ac57806344a0d68a146104e95780634fdd43cb1461051257610272565b806313faede61161023a57806313faede61461037057806316ba10e01461039b57806316c38b3c146103c457806318160ddd146103ed57806323b872dd146104185780632eb4a7ab1461044157610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780630f2cdd6c14610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906138d0565b610a42565b6040516102ab9190613918565b60405180910390f35b3480156102c057600080fd5b506102c9610b24565b6040516102d691906139c3565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613a1b565b610bb6565b6040516103139190613a89565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613ad0565b610c32565b005b34801561035157600080fd5b5061035a610d3c565b6040516103679190613b1f565b60405180910390f35b34801561037c57600080fd5b50610385610d42565b6040516103929190613b1f565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd9190613c6f565b610d48565b005b3480156103d057600080fd5b506103eb60048036038101906103e69190613ce4565b610dd7565b005b3480156103f957600080fd5b50610402610e70565b60405161040f9190613b1f565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190613d11565b610e87565b005b34801561044d57600080fd5b50610456610e97565b6040516104639190613d7d565b60405180910390f35b34801561047857600080fd5b50610481610e9d565b005b34801561048f57600080fd5b506104aa60048036038101906104a59190613d11565b610fee565b005b3480156104b857600080fd5b506104d360048036038101906104ce9190613d98565b61100e565b6040516104e09190613e83565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b9190613a1b565b611221565b005b34801561051e57600080fd5b5061053960048036038101906105349190613c6f565b6112a7565b005b34801561054757600080fd5b50610550611336565b60405161055d9190613918565b60405180910390f35b34801561057257600080fd5b5061057b611349565b60405161058891906139c3565b60405180910390f35b34801561059d57600080fd5b506105a66113d7565b6040516105b39190613918565b60405180910390f35b3480156105c857600080fd5b506105d16113ea565b6040516105de91906139c3565b60405180910390f35b3480156105f357600080fd5b5061060e60048036038101906106099190613a1b565b611478565b60405161061b9190613a89565b60405180910390f35b34801561063057600080fd5b5061063961148e565b6040516106469190613918565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190613d98565b6114a1565b6040516106839190613b1f565b60405180910390f35b34801561069857600080fd5b506106a1611570565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190613ed1565b6115f8565b005b3480156106d857600080fd5b506106f360048036038101906106ee9190613c6f565b61167e565b005b34801561070157600080fd5b5061070a61170d565b6040516107179190613a89565b60405180910390f35b34801561072c57600080fd5b50610735611737565b6040516107429190613b1f565b60405180910390f35b34801561075757600080fd5b5061076061173d565b60405161076d91906139c3565b60405180910390f35b610790600480360381019061078b9190613a1b565b6117cf565b005b34801561079e57600080fd5b506107b960048036038101906107b49190613efe565b611a4d565b005b3480156107c757600080fd5b506107d0611bc4565b6040516107dd91906139c3565b60405180910390f35b3480156107f257600080fd5b5061080d60048036038101906108089190613a1b565b611c52565b005b34801561081b57600080fd5b5061083660048036038101906108319190613ce4565b611cd8565b005b34801561084457600080fd5b5061085f600480360381019061085a9190613fdf565b611d71565b005b34801561086d57600080fd5b5061088860048036038101906108839190613a1b565b611ded565b60405161089591906139c3565b60405180910390f35b6108b860048036038101906108b391906140c2565b611f45565b005b3480156108c657600080fd5b506108cf612259565b6040516108dc9190613b1f565b60405180910390f35b3480156108f157600080fd5b5061090c60048036038101906109079190613d98565b61225f565b6040516109199190613918565b60405180910390f35b34801561092e57600080fd5b5061094960048036038101906109449190613ce4565b61227f565b005b34801561095757600080fd5b50610972600480360381019061096d9190614122565b612318565b60405161097f9190613918565b60405180910390f35b34801561099457600080fd5b5061099d6123ac565b6040516109aa9190613b1f565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d59190614162565b6123b1565b005b3480156109e857600080fd5b50610a0360048036038101906109fe9190613d98565b6124e5565b005b348015610a1157600080fd5b50610a2c6004803603810190610a279190613d98565b6125dc565b604051610a399190613b1f565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b0d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b1d5750610b1c82612625565b5b9050919050565b606060028054610b33906141d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5f906141d1565b8015610bac5780601f10610b8157610100808354040283529160200191610bac565b820191906000526020600020905b815481529060010190602001808311610b8f57829003601f168201915b5050505050905090565b6000610bc18261268f565b610bf7576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c3d82611478565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ca4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc36126dd565b73ffffffffffffffffffffffffffffffffffffffff1614158015610cf55750610cf381610cee6126dd565b612318565b155b15610d2c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d378383836126e5565b505050565b60125481565b600f5481565b610d506126dd565b73ffffffffffffffffffffffffffffffffffffffff16610d6e61170d565b73ffffffffffffffffffffffffffffffffffffffff1614610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb9061424e565b60405180910390fd5b80600d9081610dd3919061441a565b5050565b610ddf6126dd565b73ffffffffffffffffffffffffffffffffffffffff16610dfd61170d565b73ffffffffffffffffffffffffffffffffffffffff1614610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a9061424e565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b6000610e7a612797565b6001546000540303905090565b610e928383836127a0565b505050565b600a5481565b610ea56126dd565b73ffffffffffffffffffffffffffffffffffffffff16610ec361170d565b73ffffffffffffffffffffffffffffffffffffffff1614610f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f109061424e565b60405180910390fd5b600260095403610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5590614538565b60405180910390fd5b60026009819055506000610f7061170d565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f9390614589565b60006040518083038185875af1925050503d8060008114610fd0576040519150601f19603f3d011682016040523d82523d6000602084013e610fd5565b606091505b5050905080610fe357600080fd5b506001600981905550565b61100983838360405180602001604052806000815250611d71565b505050565b6060600061101b836114a1565b905060008167ffffffffffffffff81111561103957611038613b44565b5b6040519080825280602002602001820160405280156110675781602001602082028036833780820191505090505b5090506000611074612797565b90506000805b848210801561108a575060005483105b15611214576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161120057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461119d57806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111ff57838584815181106111e4576111e361459e565b5b60200260200101818152505082806111fb906145fc565b9350505b5b838061120b906145fc565b9450505061107a565b8395505050505050919050565b6112296126dd565b73ffffffffffffffffffffffffffffffffffffffff1661124761170d565b73ffffffffffffffffffffffffffffffffffffffff161461129d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112949061424e565b60405180910390fd5b80600f8190555050565b6112af6126dd565b73ffffffffffffffffffffffffffffffffffffffff166112cd61170d565b73ffffffffffffffffffffffffffffffffffffffff1614611323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131a9061424e565b60405180910390fd5b80600e9081611332919061441a565b5050565b601360029054906101000a900460ff1681565b600d8054611356906141d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611382906141d1565b80156113cf5780601f106113a4576101008083540402835291602001916113cf565b820191906000526020600020905b8154815290600101906020018083116113b257829003601f168201915b505050505081565b601360009054906101000a900460ff1681565b600c80546113f7906141d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611423906141d1565b80156114705780601f1061144557610100808354040283529160200191611470565b820191906000526020600020905b81548152906001019060200180831161145357829003601f168201915b505050505081565b600061148382612c54565b600001519050919050565b601360019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611508576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6115786126dd565b73ffffffffffffffffffffffffffffffffffffffff1661159661170d565b73ffffffffffffffffffffffffffffffffffffffff16146115ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e39061424e565b60405180910390fd5b6115f66000612ee3565b565b6116006126dd565b73ffffffffffffffffffffffffffffffffffffffff1661161e61170d565b73ffffffffffffffffffffffffffffffffffffffff1614611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b9061424e565b60405180910390fd5b80600a8190555050565b6116866126dd565b73ffffffffffffffffffffffffffffffffffffffff166116a461170d565b73ffffffffffffffffffffffffffffffffffffffff16146116fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f19061424e565b60405180910390fd5b80600c9081611709919061441a565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b60606003805461174c906141d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611778906141d1565b80156117c55780601f1061179a576101008083540402835291602001916117c5565b820191906000526020600020905b8154815290600101906020018083116117a857829003601f168201915b5050505050905090565b601360009054906101000a900460ff161561181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690614690565b60405180910390fd5b601154811115611864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185b90614722565b60405180910390fd5b60105481611870610e70565b61187a9190614742565b11156118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b2906147c2565b60405180910390fd5b601254816118c833612fa9565b6118d29190614742565b1115611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a9061482e565b60405180910390fd5b60008190506000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506001811015611998576000816001611974919061484e565b90508084111561199157808461198a919061484e565b9250611996565b600092505b505b600f54826119a69190614882565b3410156119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df90614936565b60405180910390fd5b82601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a379190614742565b92505081905550611a483384613013565b505050565b611a556126dd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ab9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611ac66126dd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b736126dd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bb89190613918565b60405180910390a35050565b600e8054611bd1906141d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611bfd906141d1565b8015611c4a5780601f10611c1f57610100808354040283529160200191611c4a565b820191906000526020600020905b815481529060010190602001808311611c2d57829003601f168201915b505050505081565b611c5a6126dd565b73ffffffffffffffffffffffffffffffffffffffff16611c7861170d565b73ffffffffffffffffffffffffffffffffffffffff1614611cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc59061424e565b60405180910390fd5b8060118190555050565b611ce06126dd565b73ffffffffffffffffffffffffffffffffffffffff16611cfe61170d565b73ffffffffffffffffffffffffffffffffffffffff1614611d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4b9061424e565b60405180910390fd5b80601360016101000a81548160ff02191690831515021790555050565b611d7c8484846127a0565b611d9b8373ffffffffffffffffffffffffffffffffffffffff16613031565b8015611db05750611dae84848484613054565b155b15611de7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611df88261268f565b611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e906149c8565b60405180910390fd5b60001515601360029054906101000a900460ff16151503611ee457600e8054611e5f906141d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611e8b906141d1565b8015611ed85780601f10611ead57610100808354040283529160200191611ed8565b820191906000526020600020905b815481529060010190602001808311611ebb57829003601f168201915b50505050509050611f40565b6000611eee6131a4565b90506000815111611f0e5760405180602001604052806000815250611f3c565b80611f1884613236565b600d604051602001611f2c93929190614aa7565b6040516020818303038152906040525b9150505b919050565b82600081118015611f5857506011548111155b611f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8e90614b24565b60405180910390fd5b60105481611fa3610e70565b611fad9190614742565b1115611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe590614b90565b60405180910390fd5b8380600f54611ffd9190614882565b34101561203f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203690614bfc565b60405180910390fd5b601360019054906101000a900460ff1661208e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208590614c8e565b60405180910390fd5b600b600061209a6126dd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211990614cfa565b60405180910390fd5b600061212c6126dd565b60405160200161213c9190614d62565b6040516020818303038152906040528051906020012090506121a2858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483613396565b6121e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d890614dc9565b60405180910390fd5b6001600b60006121ef6126dd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061225161224b6126dd565b87613013565b505050505050565b60105481565b600b6020528060005260406000206000915054906101000a900460ff1681565b6122876126dd565b73ffffffffffffffffffffffffffffffffffffffff166122a561170d565b73ffffffffffffffffffffffffffffffffffffffff16146122fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f29061424e565b60405180910390fd5b80601360026101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600181565b816000811180156123c457506011548111155b612403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fa90614b24565b60405180910390fd5b6010548161240f610e70565b6124199190614742565b111561245a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245190614b90565b60405180910390fd5b6124626126dd565b73ffffffffffffffffffffffffffffffffffffffff1661248061170d565b73ffffffffffffffffffffffffffffffffffffffff16146124d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cd9061424e565b60405180910390fd5b6124e08284613013565b505050565b6124ed6126dd565b73ffffffffffffffffffffffffffffffffffffffff1661250b61170d565b73ffffffffffffffffffffffffffffffffffffffff1614612561576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125589061424e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c790614e5b565b60405180910390fd5b6125d981612ee3565b50565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161269a612797565b111580156126a9575060005482105b80156126d6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006127ab82612c54565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612816576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166128376126dd565b73ffffffffffffffffffffffffffffffffffffffff1614806128665750612865856128606126dd565b612318565b5b806128ab57506128746126dd565b73ffffffffffffffffffffffffffffffffffffffff1661289384610bb6565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806128e4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361294a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61295785858560016133ad565b612963600084876126e5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612be2576000548214612be157878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c4d85858560016133b3565b5050505050565b612c5c613821565b600082905080612c6a612797565b11158015612c79575060005481105b15612eac576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612eaa57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d8e578092505050612ede565b5b600115612ea957818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ea4578092505050612ede565b612d8f565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61302d8282604051806020016040528060008152506133b9565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261307a6126dd565b8786866040518563ffffffff1660e01b815260040161309c9493929190614ed0565b6020604051808303816000875af19250505080156130d857506040513d601f19601f820116820180604052508101906130d59190614f31565b60015b613151573d8060008114613108576040519150601f19603f3d011682016040523d82523d6000602084013e61310d565b606091505b506000815103613149576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c80546131b3906141d1565b80601f01602080910402602001604051908101604052809291908181526020018280546131df906141d1565b801561322c5780601f106132015761010080835404028352916020019161322c565b820191906000526020600020905b81548152906001019060200180831161320f57829003601f168201915b5050505050905090565b60606000820361327d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613391565b600082905060005b600082146132af578080613298906145fc565b915050600a826132a89190614f8d565b9150613285565b60008167ffffffffffffffff8111156132cb576132ca613b44565b5b6040519080825280601f01601f1916602001820160405280156132fd5781602001600182028036833780820191505090505b5090505b6000851461338a57600182613316919061484e565b9150600a856133259190614fbe565b60306133319190614742565b60f81b8183815181106133475761334661459e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133839190614f8d565b9450613301565b8093505050505b919050565b6000826133a385846133cb565b1490509392505050565b50505050565b50505050565b6133c68383836001613440565b505050565b60008082905060005b84518110156134355760008582815181106133f2576133f161459e565b5b602002602001015190508083116134145761340d838261380a565b9250613421565b61341e818461380a565b92505b50808061342d906145fc565b9150506133d4565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036134ac576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036134e6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134f360008683876133ad565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156136bd57506136bc8773ffffffffffffffffffffffffffffffffffffffff16613031565b5b15613782575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137326000888480600101955088613054565b613768576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036136c357826000541461377d57600080fd5b6137ed565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613783575b81600081905550505061380360008683876133b3565b5050505050565b600082600052816020526040600020905092915050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138ad81613878565b81146138b857600080fd5b50565b6000813590506138ca816138a4565b92915050565b6000602082840312156138e6576138e561386e565b5b60006138f4848285016138bb565b91505092915050565b60008115159050919050565b613912816138fd565b82525050565b600060208201905061392d6000830184613909565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561396d578082015181840152602081019050613952565b60008484015250505050565b6000601f19601f8301169050919050565b600061399582613933565b61399f818561393e565b93506139af81856020860161394f565b6139b881613979565b840191505092915050565b600060208201905081810360008301526139dd818461398a565b905092915050565b6000819050919050565b6139f8816139e5565b8114613a0357600080fd5b50565b600081359050613a15816139ef565b92915050565b600060208284031215613a3157613a3061386e565b5b6000613a3f84828501613a06565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a7382613a48565b9050919050565b613a8381613a68565b82525050565b6000602082019050613a9e6000830184613a7a565b92915050565b613aad81613a68565b8114613ab857600080fd5b50565b600081359050613aca81613aa4565b92915050565b60008060408385031215613ae757613ae661386e565b5b6000613af585828601613abb565b9250506020613b0685828601613a06565b9150509250929050565b613b19816139e5565b82525050565b6000602082019050613b346000830184613b10565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b7c82613979565b810181811067ffffffffffffffff82111715613b9b57613b9a613b44565b5b80604052505050565b6000613bae613864565b9050613bba8282613b73565b919050565b600067ffffffffffffffff821115613bda57613bd9613b44565b5b613be382613979565b9050602081019050919050565b82818337600083830152505050565b6000613c12613c0d84613bbf565b613ba4565b905082815260208101848484011115613c2e57613c2d613b3f565b5b613c39848285613bf0565b509392505050565b600082601f830112613c5657613c55613b3a565b5b8135613c66848260208601613bff565b91505092915050565b600060208284031215613c8557613c8461386e565b5b600082013567ffffffffffffffff811115613ca357613ca2613873565b5b613caf84828501613c41565b91505092915050565b613cc1816138fd565b8114613ccc57600080fd5b50565b600081359050613cde81613cb8565b92915050565b600060208284031215613cfa57613cf961386e565b5b6000613d0884828501613ccf565b91505092915050565b600080600060608486031215613d2a57613d2961386e565b5b6000613d3886828701613abb565b9350506020613d4986828701613abb565b9250506040613d5a86828701613a06565b9150509250925092565b6000819050919050565b613d7781613d64565b82525050565b6000602082019050613d926000830184613d6e565b92915050565b600060208284031215613dae57613dad61386e565b5b6000613dbc84828501613abb565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613dfa816139e5565b82525050565b6000613e0c8383613df1565b60208301905092915050565b6000602082019050919050565b6000613e3082613dc5565b613e3a8185613dd0565b9350613e4583613de1565b8060005b83811015613e76578151613e5d8882613e00565b9750613e6883613e18565b925050600181019050613e49565b5085935050505092915050565b60006020820190508181036000830152613e9d8184613e25565b905092915050565b613eae81613d64565b8114613eb957600080fd5b50565b600081359050613ecb81613ea5565b92915050565b600060208284031215613ee757613ee661386e565b5b6000613ef584828501613ebc565b91505092915050565b60008060408385031215613f1557613f1461386e565b5b6000613f2385828601613abb565b9250506020613f3485828601613ccf565b9150509250929050565b600067ffffffffffffffff821115613f5957613f58613b44565b5b613f6282613979565b9050602081019050919050565b6000613f82613f7d84613f3e565b613ba4565b905082815260208101848484011115613f9e57613f9d613b3f565b5b613fa9848285613bf0565b509392505050565b600082601f830112613fc657613fc5613b3a565b5b8135613fd6848260208601613f6f565b91505092915050565b60008060008060808587031215613ff957613ff861386e565b5b600061400787828801613abb565b945050602061401887828801613abb565b935050604061402987828801613a06565b925050606085013567ffffffffffffffff81111561404a57614049613873565b5b61405687828801613fb1565b91505092959194509250565b600080fd5b600080fd5b60008083601f84011261408257614081613b3a565b5b8235905067ffffffffffffffff81111561409f5761409e614062565b5b6020830191508360208202830111156140bb576140ba614067565b5b9250929050565b6000806000604084860312156140db576140da61386e565b5b60006140e986828701613a06565b935050602084013567ffffffffffffffff81111561410a57614109613873565b5b6141168682870161406c565b92509250509250925092565b600080604083850312156141395761413861386e565b5b600061414785828601613abb565b925050602061415885828601613abb565b9150509250929050565b600080604083850312156141795761417861386e565b5b600061418785828601613a06565b925050602061419885828601613abb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141e957607f821691505b6020821081036141fc576141fb6141a2565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061423860208361393e565b915061424382614202565b602082019050919050565b600060208201905081810360008301526142678161422b565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026142d07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614293565b6142da8683614293565b95508019841693508086168417925050509392505050565b6000819050919050565b600061431761431261430d846139e5565b6142f2565b6139e5565b9050919050565b6000819050919050565b614331836142fc565b61434561433d8261431e565b8484546142a0565b825550505050565b600090565b61435a61434d565b614365818484614328565b505050565b5b818110156143895761437e600082614352565b60018101905061436b565b5050565b601f8211156143ce5761439f8161426e565b6143a884614283565b810160208510156143b7578190505b6143cb6143c385614283565b83018261436a565b50505b505050565b600082821c905092915050565b60006143f1600019846008026143d3565b1980831691505092915050565b600061440a83836143e0565b9150826002028217905092915050565b61442382613933565b67ffffffffffffffff81111561443c5761443b613b44565b5b61444682546141d1565b61445182828561438d565b600060209050601f8311600181146144845760008415614472578287015190505b61447c85826143fe565b8655506144e4565b601f1984166144928661426e565b60005b828110156144ba57848901518255600182019150602085019450602081019050614495565b868310156144d757848901516144d3601f8916826143e0565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614522601f8361393e565b915061452d826144ec565b602082019050919050565b6000602082019050818103600083015261455181614515565b9050919050565b600081905092915050565b50565b6000614573600083614558565b915061457e82614563565b600082019050919050565b600061459482614566565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614607826139e5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614639576146386145cd565b5b600182019050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b600061467a60178361393e565b915061468582614644565b602082019050919050565b600060208201905081810360008301526146a98161466d565b9050919050565b7f45786365656473204e465420706572207472616e73616374696f6e206c696d6960008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b600061470c60218361393e565b9150614717826146b0565b604082019050919050565b6000602082019050818103600083015261473b816146ff565b9050919050565b600061474d826139e5565b9150614758836139e5565b92508282019050808211156147705761476f6145cd565b5b92915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b60006147ac60128361393e565b91506147b782614776565b602082019050919050565b600060208201905081810360008301526147db8161479f565b9050919050565b7f546f6f206d616e7920666f722061646472657373000000000000000000000000600082015250565b600061481860148361393e565b9150614823826147e2565b602082019050919050565b600060208201905081810360008301526148478161480b565b9050919050565b6000614859826139e5565b9150614864836139e5565b925082820390508181111561487c5761487b6145cd565b5b92915050565b600061488d826139e5565b9150614898836139e5565b92508282026148a6816139e5565b915082820484148315176148bd576148bc6145cd565b5b5092915050565b7f45746865722076616c75652073656e74206973206e6f7420737566666963696560008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b600061492060228361393e565b915061492b826148c4565b604082019050919050565b6000602082019050818103600083015261494f81614913565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006149b2602f8361393e565b91506149bd82614956565b604082019050919050565b600060208201905081810360008301526149e1816149a5565b9050919050565b600081905092915050565b60006149fe82613933565b614a0881856149e8565b9350614a1881856020860161394f565b80840191505092915050565b60008154614a31816141d1565b614a3b81866149e8565b94506001821660008114614a565760018114614a6b57614a9e565b60ff1983168652811515820286019350614a9e565b614a748561426e565b60005b83811015614a9657815481890152600182019150602081019050614a77565b838801955050505b50505092915050565b6000614ab382866149f3565b9150614abf82856149f3565b9150614acb8284614a24565b9150819050949350505050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000614b0e60148361393e565b9150614b1982614ad8565b602082019050919050565b60006020820190508181036000830152614b3d81614b01565b9050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000614b7a60148361393e565b9150614b8582614b44565b602082019050919050565b60006020820190508181036000830152614ba981614b6d565b9050919050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614be660138361393e565b9150614bf182614bb0565b602082019050919050565b60006020820190508181036000830152614c1581614bd9565b9050919050565b7f5468652077686974656c6973742073616c65206973206e6f7420656e61626c6560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c7860228361393e565b9150614c8382614c1c565b604082019050919050565b60006020820190508181036000830152614ca781614c6b565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b6000614ce460188361393e565b9150614cef82614cae565b602082019050919050565b60006020820190508181036000830152614d1381614cd7565b9050919050565b60008160601b9050919050565b6000614d3282614d1a565b9050919050565b6000614d4482614d27565b9050919050565b614d5c614d5782613a68565b614d39565b82525050565b6000614d6e8284614d4b565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000614db3600e8361393e565b9150614dbe82614d7d565b602082019050919050565b60006020820190508181036000830152614de281614da6565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e4560268361393e565b9150614e5082614de9565b604082019050919050565b60006020820190508181036000830152614e7481614e38565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614ea282614e7b565b614eac8185614e86565b9350614ebc81856020860161394f565b614ec581613979565b840191505092915050565b6000608082019050614ee56000830187613a7a565b614ef26020830186613a7a565b614eff6040830185613b10565b8181036060830152614f118184614e97565b905095945050505050565b600081519050614f2b816138a4565b92915050565b600060208284031215614f4757614f4661386e565b5b6000614f5584828501614f1c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f98826139e5565b9150614fa3836139e5565b925082614fb357614fb2614f5e565b5b828204905092915050565b6000614fc9826139e5565b9150614fd4836139e5565b925082614fe457614fe3614f5e565b5b82820690509291505056fea2646970667358221220325fa48717681a5c8247ff9a5d54382a93bcfc0be041a4dd1d9f94a86fc2591864736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000071afd498d00000000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000b426561724676636b657273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a426561724676636b65720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026e6e000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102725760003560e01c806370a082311161014f578063b767a098116100c1578063e0a808531161007a578063e0a8085314610922578063e985e9c51461094b578063ed6661c214610988578063efbd73f4146109b3578063f2fde38b146109dc578063fddcb5ea14610a0557610272565b8063b767a0981461080f578063b88d4fde14610838578063c87b56dd14610861578063d2cab0561461089e578063d5abeb01146108ba578063db4bec44146108e557610272565b806394354fd01161011357806394354fd01461072057806395d89b411461074b578063a0712d6814610776578063a22cb46514610792578063a45ba8e7146107bb578063b071401b146107e657610272565b806370a082311461064f578063715018a61461068c5780637cb64759146106a35780637ec4a659146106cc5780638da5cb5b146106f557610272565b80633ccfd60b116101e857806351830227116101ac578063518302271461053b5780635503a0e8146105665780635c975abb1461059157806362b99ad4146105bc5780636352211e146105e75780636caede3d1461062457610272565b80633ccfd60b1461046c57806342842e0e14610483578063438b6300146104ac57806344a0d68a146104e95780634fdd43cb1461051257610272565b806313faede61161023a57806313faede61461037057806316ba10e01461039b57806316c38b3c146103c457806318160ddd146103ed57806323b872dd146104185780632eb4a7ab1461044157610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780630f2cdd6c14610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906138d0565b610a42565b6040516102ab9190613918565b60405180910390f35b3480156102c057600080fd5b506102c9610b24565b6040516102d691906139c3565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613a1b565b610bb6565b6040516103139190613a89565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613ad0565b610c32565b005b34801561035157600080fd5b5061035a610d3c565b6040516103679190613b1f565b60405180910390f35b34801561037c57600080fd5b50610385610d42565b6040516103929190613b1f565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd9190613c6f565b610d48565b005b3480156103d057600080fd5b506103eb60048036038101906103e69190613ce4565b610dd7565b005b3480156103f957600080fd5b50610402610e70565b60405161040f9190613b1f565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190613d11565b610e87565b005b34801561044d57600080fd5b50610456610e97565b6040516104639190613d7d565b60405180910390f35b34801561047857600080fd5b50610481610e9d565b005b34801561048f57600080fd5b506104aa60048036038101906104a59190613d11565b610fee565b005b3480156104b857600080fd5b506104d360048036038101906104ce9190613d98565b61100e565b6040516104e09190613e83565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b9190613a1b565b611221565b005b34801561051e57600080fd5b5061053960048036038101906105349190613c6f565b6112a7565b005b34801561054757600080fd5b50610550611336565b60405161055d9190613918565b60405180910390f35b34801561057257600080fd5b5061057b611349565b60405161058891906139c3565b60405180910390f35b34801561059d57600080fd5b506105a66113d7565b6040516105b39190613918565b60405180910390f35b3480156105c857600080fd5b506105d16113ea565b6040516105de91906139c3565b60405180910390f35b3480156105f357600080fd5b5061060e60048036038101906106099190613a1b565b611478565b60405161061b9190613a89565b60405180910390f35b34801561063057600080fd5b5061063961148e565b6040516106469190613918565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190613d98565b6114a1565b6040516106839190613b1f565b60405180910390f35b34801561069857600080fd5b506106a1611570565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190613ed1565b6115f8565b005b3480156106d857600080fd5b506106f360048036038101906106ee9190613c6f565b61167e565b005b34801561070157600080fd5b5061070a61170d565b6040516107179190613a89565b60405180910390f35b34801561072c57600080fd5b50610735611737565b6040516107429190613b1f565b60405180910390f35b34801561075757600080fd5b5061076061173d565b60405161076d91906139c3565b60405180910390f35b610790600480360381019061078b9190613a1b565b6117cf565b005b34801561079e57600080fd5b506107b960048036038101906107b49190613efe565b611a4d565b005b3480156107c757600080fd5b506107d0611bc4565b6040516107dd91906139c3565b60405180910390f35b3480156107f257600080fd5b5061080d60048036038101906108089190613a1b565b611c52565b005b34801561081b57600080fd5b5061083660048036038101906108319190613ce4565b611cd8565b005b34801561084457600080fd5b5061085f600480360381019061085a9190613fdf565b611d71565b005b34801561086d57600080fd5b5061088860048036038101906108839190613a1b565b611ded565b60405161089591906139c3565b60405180910390f35b6108b860048036038101906108b391906140c2565b611f45565b005b3480156108c657600080fd5b506108cf612259565b6040516108dc9190613b1f565b60405180910390f35b3480156108f157600080fd5b5061090c60048036038101906109079190613d98565b61225f565b6040516109199190613918565b60405180910390f35b34801561092e57600080fd5b5061094960048036038101906109449190613ce4565b61227f565b005b34801561095757600080fd5b50610972600480360381019061096d9190614122565b612318565b60405161097f9190613918565b60405180910390f35b34801561099457600080fd5b5061099d6123ac565b6040516109aa9190613b1f565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d59190614162565b6123b1565b005b3480156109e857600080fd5b50610a0360048036038101906109fe9190613d98565b6124e5565b005b348015610a1157600080fd5b50610a2c6004803603810190610a279190613d98565b6125dc565b604051610a399190613b1f565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b0d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b1d5750610b1c82612625565b5b9050919050565b606060028054610b33906141d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5f906141d1565b8015610bac5780601f10610b8157610100808354040283529160200191610bac565b820191906000526020600020905b815481529060010190602001808311610b8f57829003601f168201915b5050505050905090565b6000610bc18261268f565b610bf7576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c3d82611478565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ca4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc36126dd565b73ffffffffffffffffffffffffffffffffffffffff1614158015610cf55750610cf381610cee6126dd565b612318565b155b15610d2c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d378383836126e5565b505050565b60125481565b600f5481565b610d506126dd565b73ffffffffffffffffffffffffffffffffffffffff16610d6e61170d565b73ffffffffffffffffffffffffffffffffffffffff1614610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb9061424e565b60405180910390fd5b80600d9081610dd3919061441a565b5050565b610ddf6126dd565b73ffffffffffffffffffffffffffffffffffffffff16610dfd61170d565b73ffffffffffffffffffffffffffffffffffffffff1614610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a9061424e565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b6000610e7a612797565b6001546000540303905090565b610e928383836127a0565b505050565b600a5481565b610ea56126dd565b73ffffffffffffffffffffffffffffffffffffffff16610ec361170d565b73ffffffffffffffffffffffffffffffffffffffff1614610f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f109061424e565b60405180910390fd5b600260095403610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5590614538565b60405180910390fd5b60026009819055506000610f7061170d565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f9390614589565b60006040518083038185875af1925050503d8060008114610fd0576040519150601f19603f3d011682016040523d82523d6000602084013e610fd5565b606091505b5050905080610fe357600080fd5b506001600981905550565b61100983838360405180602001604052806000815250611d71565b505050565b6060600061101b836114a1565b905060008167ffffffffffffffff81111561103957611038613b44565b5b6040519080825280602002602001820160405280156110675781602001602082028036833780820191505090505b5090506000611074612797565b90506000805b848210801561108a575060005483105b15611214576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161120057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461119d57806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111ff57838584815181106111e4576111e361459e565b5b60200260200101818152505082806111fb906145fc565b9350505b5b838061120b906145fc565b9450505061107a565b8395505050505050919050565b6112296126dd565b73ffffffffffffffffffffffffffffffffffffffff1661124761170d565b73ffffffffffffffffffffffffffffffffffffffff161461129d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112949061424e565b60405180910390fd5b80600f8190555050565b6112af6126dd565b73ffffffffffffffffffffffffffffffffffffffff166112cd61170d565b73ffffffffffffffffffffffffffffffffffffffff1614611323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131a9061424e565b60405180910390fd5b80600e9081611332919061441a565b5050565b601360029054906101000a900460ff1681565b600d8054611356906141d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611382906141d1565b80156113cf5780601f106113a4576101008083540402835291602001916113cf565b820191906000526020600020905b8154815290600101906020018083116113b257829003601f168201915b505050505081565b601360009054906101000a900460ff1681565b600c80546113f7906141d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611423906141d1565b80156114705780601f1061144557610100808354040283529160200191611470565b820191906000526020600020905b81548152906001019060200180831161145357829003601f168201915b505050505081565b600061148382612c54565b600001519050919050565b601360019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611508576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6115786126dd565b73ffffffffffffffffffffffffffffffffffffffff1661159661170d565b73ffffffffffffffffffffffffffffffffffffffff16146115ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e39061424e565b60405180910390fd5b6115f66000612ee3565b565b6116006126dd565b73ffffffffffffffffffffffffffffffffffffffff1661161e61170d565b73ffffffffffffffffffffffffffffffffffffffff1614611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b9061424e565b60405180910390fd5b80600a8190555050565b6116866126dd565b73ffffffffffffffffffffffffffffffffffffffff166116a461170d565b73ffffffffffffffffffffffffffffffffffffffff16146116fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f19061424e565b60405180910390fd5b80600c9081611709919061441a565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b60606003805461174c906141d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611778906141d1565b80156117c55780601f1061179a576101008083540402835291602001916117c5565b820191906000526020600020905b8154815290600101906020018083116117a857829003601f168201915b5050505050905090565b601360009054906101000a900460ff161561181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690614690565b60405180910390fd5b601154811115611864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185b90614722565b60405180910390fd5b60105481611870610e70565b61187a9190614742565b11156118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b2906147c2565b60405180910390fd5b601254816118c833612fa9565b6118d29190614742565b1115611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a9061482e565b60405180910390fd5b60008190506000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506001811015611998576000816001611974919061484e565b90508084111561199157808461198a919061484e565b9250611996565b600092505b505b600f54826119a69190614882565b3410156119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df90614936565b60405180910390fd5b82601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a379190614742565b92505081905550611a483384613013565b505050565b611a556126dd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ab9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611ac66126dd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b736126dd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bb89190613918565b60405180910390a35050565b600e8054611bd1906141d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611bfd906141d1565b8015611c4a5780601f10611c1f57610100808354040283529160200191611c4a565b820191906000526020600020905b815481529060010190602001808311611c2d57829003601f168201915b505050505081565b611c5a6126dd565b73ffffffffffffffffffffffffffffffffffffffff16611c7861170d565b73ffffffffffffffffffffffffffffffffffffffff1614611cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc59061424e565b60405180910390fd5b8060118190555050565b611ce06126dd565b73ffffffffffffffffffffffffffffffffffffffff16611cfe61170d565b73ffffffffffffffffffffffffffffffffffffffff1614611d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4b9061424e565b60405180910390fd5b80601360016101000a81548160ff02191690831515021790555050565b611d7c8484846127a0565b611d9b8373ffffffffffffffffffffffffffffffffffffffff16613031565b8015611db05750611dae84848484613054565b155b15611de7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611df88261268f565b611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e906149c8565b60405180910390fd5b60001515601360029054906101000a900460ff16151503611ee457600e8054611e5f906141d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611e8b906141d1565b8015611ed85780601f10611ead57610100808354040283529160200191611ed8565b820191906000526020600020905b815481529060010190602001808311611ebb57829003601f168201915b50505050509050611f40565b6000611eee6131a4565b90506000815111611f0e5760405180602001604052806000815250611f3c565b80611f1884613236565b600d604051602001611f2c93929190614aa7565b6040516020818303038152906040525b9150505b919050565b82600081118015611f5857506011548111155b611f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8e90614b24565b60405180910390fd5b60105481611fa3610e70565b611fad9190614742565b1115611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe590614b90565b60405180910390fd5b8380600f54611ffd9190614882565b34101561203f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203690614bfc565b60405180910390fd5b601360019054906101000a900460ff1661208e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208590614c8e565b60405180910390fd5b600b600061209a6126dd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211990614cfa565b60405180910390fd5b600061212c6126dd565b60405160200161213c9190614d62565b6040516020818303038152906040528051906020012090506121a2858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483613396565b6121e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d890614dc9565b60405180910390fd5b6001600b60006121ef6126dd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061225161224b6126dd565b87613013565b505050505050565b60105481565b600b6020528060005260406000206000915054906101000a900460ff1681565b6122876126dd565b73ffffffffffffffffffffffffffffffffffffffff166122a561170d565b73ffffffffffffffffffffffffffffffffffffffff16146122fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f29061424e565b60405180910390fd5b80601360026101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600181565b816000811180156123c457506011548111155b612403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fa90614b24565b60405180910390fd5b6010548161240f610e70565b6124199190614742565b111561245a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245190614b90565b60405180910390fd5b6124626126dd565b73ffffffffffffffffffffffffffffffffffffffff1661248061170d565b73ffffffffffffffffffffffffffffffffffffffff16146124d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cd9061424e565b60405180910390fd5b6124e08284613013565b505050565b6124ed6126dd565b73ffffffffffffffffffffffffffffffffffffffff1661250b61170d565b73ffffffffffffffffffffffffffffffffffffffff1614612561576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125589061424e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c790614e5b565b60405180910390fd5b6125d981612ee3565b50565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161269a612797565b111580156126a9575060005482105b80156126d6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006127ab82612c54565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612816576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166128376126dd565b73ffffffffffffffffffffffffffffffffffffffff1614806128665750612865856128606126dd565b612318565b5b806128ab57506128746126dd565b73ffffffffffffffffffffffffffffffffffffffff1661289384610bb6565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806128e4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361294a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61295785858560016133ad565b612963600084876126e5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612be2576000548214612be157878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c4d85858560016133b3565b5050505050565b612c5c613821565b600082905080612c6a612797565b11158015612c79575060005481105b15612eac576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612eaa57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d8e578092505050612ede565b5b600115612ea957818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ea4578092505050612ede565b612d8f565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61302d8282604051806020016040528060008152506133b9565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261307a6126dd565b8786866040518563ffffffff1660e01b815260040161309c9493929190614ed0565b6020604051808303816000875af19250505080156130d857506040513d601f19601f820116820180604052508101906130d59190614f31565b60015b613151573d8060008114613108576040519150601f19603f3d011682016040523d82523d6000602084013e61310d565b606091505b506000815103613149576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c80546131b3906141d1565b80601f01602080910402602001604051908101604052809291908181526020018280546131df906141d1565b801561322c5780601f106132015761010080835404028352916020019161322c565b820191906000526020600020905b81548152906001019060200180831161320f57829003601f168201915b5050505050905090565b60606000820361327d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613391565b600082905060005b600082146132af578080613298906145fc565b915050600a826132a89190614f8d565b9150613285565b60008167ffffffffffffffff8111156132cb576132ca613b44565b5b6040519080825280601f01601f1916602001820160405280156132fd5781602001600182028036833780820191505090505b5090505b6000851461338a57600182613316919061484e565b9150600a856133259190614fbe565b60306133319190614742565b60f81b8183815181106133475761334661459e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133839190614f8d565b9450613301565b8093505050505b919050565b6000826133a385846133cb565b1490509392505050565b50505050565b50505050565b6133c68383836001613440565b505050565b60008082905060005b84518110156134355760008582815181106133f2576133f161459e565b5b602002602001015190508083116134145761340d838261380a565b9250613421565b61341e818461380a565b92505b50808061342d906145fc565b9150506133d4565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036134ac576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036134e6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134f360008683876133ad565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156136bd57506136bc8773ffffffffffffffffffffffffffffffffffffffff16613031565b5b15613782575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137326000888480600101955088613054565b613768576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036136c357826000541461377d57600080fd5b6137ed565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613783575b81600081905550505061380360008683876133b3565b5050505050565b600082600052816020526040600020905092915050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138ad81613878565b81146138b857600080fd5b50565b6000813590506138ca816138a4565b92915050565b6000602082840312156138e6576138e561386e565b5b60006138f4848285016138bb565b91505092915050565b60008115159050919050565b613912816138fd565b82525050565b600060208201905061392d6000830184613909565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561396d578082015181840152602081019050613952565b60008484015250505050565b6000601f19601f8301169050919050565b600061399582613933565b61399f818561393e565b93506139af81856020860161394f565b6139b881613979565b840191505092915050565b600060208201905081810360008301526139dd818461398a565b905092915050565b6000819050919050565b6139f8816139e5565b8114613a0357600080fd5b50565b600081359050613a15816139ef565b92915050565b600060208284031215613a3157613a3061386e565b5b6000613a3f84828501613a06565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a7382613a48565b9050919050565b613a8381613a68565b82525050565b6000602082019050613a9e6000830184613a7a565b92915050565b613aad81613a68565b8114613ab857600080fd5b50565b600081359050613aca81613aa4565b92915050565b60008060408385031215613ae757613ae661386e565b5b6000613af585828601613abb565b9250506020613b0685828601613a06565b9150509250929050565b613b19816139e5565b82525050565b6000602082019050613b346000830184613b10565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b7c82613979565b810181811067ffffffffffffffff82111715613b9b57613b9a613b44565b5b80604052505050565b6000613bae613864565b9050613bba8282613b73565b919050565b600067ffffffffffffffff821115613bda57613bd9613b44565b5b613be382613979565b9050602081019050919050565b82818337600083830152505050565b6000613c12613c0d84613bbf565b613ba4565b905082815260208101848484011115613c2e57613c2d613b3f565b5b613c39848285613bf0565b509392505050565b600082601f830112613c5657613c55613b3a565b5b8135613c66848260208601613bff565b91505092915050565b600060208284031215613c8557613c8461386e565b5b600082013567ffffffffffffffff811115613ca357613ca2613873565b5b613caf84828501613c41565b91505092915050565b613cc1816138fd565b8114613ccc57600080fd5b50565b600081359050613cde81613cb8565b92915050565b600060208284031215613cfa57613cf961386e565b5b6000613d0884828501613ccf565b91505092915050565b600080600060608486031215613d2a57613d2961386e565b5b6000613d3886828701613abb565b9350506020613d4986828701613abb565b9250506040613d5a86828701613a06565b9150509250925092565b6000819050919050565b613d7781613d64565b82525050565b6000602082019050613d926000830184613d6e565b92915050565b600060208284031215613dae57613dad61386e565b5b6000613dbc84828501613abb565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613dfa816139e5565b82525050565b6000613e0c8383613df1565b60208301905092915050565b6000602082019050919050565b6000613e3082613dc5565b613e3a8185613dd0565b9350613e4583613de1565b8060005b83811015613e76578151613e5d8882613e00565b9750613e6883613e18565b925050600181019050613e49565b5085935050505092915050565b60006020820190508181036000830152613e9d8184613e25565b905092915050565b613eae81613d64565b8114613eb957600080fd5b50565b600081359050613ecb81613ea5565b92915050565b600060208284031215613ee757613ee661386e565b5b6000613ef584828501613ebc565b91505092915050565b60008060408385031215613f1557613f1461386e565b5b6000613f2385828601613abb565b9250506020613f3485828601613ccf565b9150509250929050565b600067ffffffffffffffff821115613f5957613f58613b44565b5b613f6282613979565b9050602081019050919050565b6000613f82613f7d84613f3e565b613ba4565b905082815260208101848484011115613f9e57613f9d613b3f565b5b613fa9848285613bf0565b509392505050565b600082601f830112613fc657613fc5613b3a565b5b8135613fd6848260208601613f6f565b91505092915050565b60008060008060808587031215613ff957613ff861386e565b5b600061400787828801613abb565b945050602061401887828801613abb565b935050604061402987828801613a06565b925050606085013567ffffffffffffffff81111561404a57614049613873565b5b61405687828801613fb1565b91505092959194509250565b600080fd5b600080fd5b60008083601f84011261408257614081613b3a565b5b8235905067ffffffffffffffff81111561409f5761409e614062565b5b6020830191508360208202830111156140bb576140ba614067565b5b9250929050565b6000806000604084860312156140db576140da61386e565b5b60006140e986828701613a06565b935050602084013567ffffffffffffffff81111561410a57614109613873565b5b6141168682870161406c565b92509250509250925092565b600080604083850312156141395761413861386e565b5b600061414785828601613abb565b925050602061415885828601613abb565b9150509250929050565b600080604083850312156141795761417861386e565b5b600061418785828601613a06565b925050602061419885828601613abb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141e957607f821691505b6020821081036141fc576141fb6141a2565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061423860208361393e565b915061424382614202565b602082019050919050565b600060208201905081810360008301526142678161422b565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026142d07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614293565b6142da8683614293565b95508019841693508086168417925050509392505050565b6000819050919050565b600061431761431261430d846139e5565b6142f2565b6139e5565b9050919050565b6000819050919050565b614331836142fc565b61434561433d8261431e565b8484546142a0565b825550505050565b600090565b61435a61434d565b614365818484614328565b505050565b5b818110156143895761437e600082614352565b60018101905061436b565b5050565b601f8211156143ce5761439f8161426e565b6143a884614283565b810160208510156143b7578190505b6143cb6143c385614283565b83018261436a565b50505b505050565b600082821c905092915050565b60006143f1600019846008026143d3565b1980831691505092915050565b600061440a83836143e0565b9150826002028217905092915050565b61442382613933565b67ffffffffffffffff81111561443c5761443b613b44565b5b61444682546141d1565b61445182828561438d565b600060209050601f8311600181146144845760008415614472578287015190505b61447c85826143fe565b8655506144e4565b601f1984166144928661426e565b60005b828110156144ba57848901518255600182019150602085019450602081019050614495565b868310156144d757848901516144d3601f8916826143e0565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614522601f8361393e565b915061452d826144ec565b602082019050919050565b6000602082019050818103600083015261455181614515565b9050919050565b600081905092915050565b50565b6000614573600083614558565b915061457e82614563565b600082019050919050565b600061459482614566565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614607826139e5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614639576146386145cd565b5b600182019050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b600061467a60178361393e565b915061468582614644565b602082019050919050565b600060208201905081810360008301526146a98161466d565b9050919050565b7f45786365656473204e465420706572207472616e73616374696f6e206c696d6960008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b600061470c60218361393e565b9150614717826146b0565b604082019050919050565b6000602082019050818103600083015261473b816146ff565b9050919050565b600061474d826139e5565b9150614758836139e5565b92508282019050808211156147705761476f6145cd565b5b92915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b60006147ac60128361393e565b91506147b782614776565b602082019050919050565b600060208201905081810360008301526147db8161479f565b9050919050565b7f546f6f206d616e7920666f722061646472657373000000000000000000000000600082015250565b600061481860148361393e565b9150614823826147e2565b602082019050919050565b600060208201905081810360008301526148478161480b565b9050919050565b6000614859826139e5565b9150614864836139e5565b925082820390508181111561487c5761487b6145cd565b5b92915050565b600061488d826139e5565b9150614898836139e5565b92508282026148a6816139e5565b915082820484148315176148bd576148bc6145cd565b5b5092915050565b7f45746865722076616c75652073656e74206973206e6f7420737566666963696560008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b600061492060228361393e565b915061492b826148c4565b604082019050919050565b6000602082019050818103600083015261494f81614913565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006149b2602f8361393e565b91506149bd82614956565b604082019050919050565b600060208201905081810360008301526149e1816149a5565b9050919050565b600081905092915050565b60006149fe82613933565b614a0881856149e8565b9350614a1881856020860161394f565b80840191505092915050565b60008154614a31816141d1565b614a3b81866149e8565b94506001821660008114614a565760018114614a6b57614a9e565b60ff1983168652811515820286019350614a9e565b614a748561426e565b60005b83811015614a9657815481890152600182019150602081019050614a77565b838801955050505b50505092915050565b6000614ab382866149f3565b9150614abf82856149f3565b9150614acb8284614a24565b9150819050949350505050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000614b0e60148361393e565b9150614b1982614ad8565b602082019050919050565b60006020820190508181036000830152614b3d81614b01565b9050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000614b7a60148361393e565b9150614b8582614b44565b602082019050919050565b60006020820190508181036000830152614ba981614b6d565b9050919050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614be660138361393e565b9150614bf182614bb0565b602082019050919050565b60006020820190508181036000830152614c1581614bd9565b9050919050565b7f5468652077686974656c6973742073616c65206973206e6f7420656e61626c6560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c7860228361393e565b9150614c8382614c1c565b604082019050919050565b60006020820190508181036000830152614ca781614c6b565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b6000614ce460188361393e565b9150614cef82614cae565b602082019050919050565b60006020820190508181036000830152614d1381614cd7565b9050919050565b60008160601b9050919050565b6000614d3282614d1a565b9050919050565b6000614d4482614d27565b9050919050565b614d5c614d5782613a68565b614d39565b82525050565b6000614d6e8284614d4b565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000614db3600e8361393e565b9150614dbe82614d7d565b602082019050919050565b60006020820190508181036000830152614de281614da6565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e4560268361393e565b9150614e5082614de9565b604082019050919050565b60006020820190508181036000830152614e7481614e38565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614ea282614e7b565b614eac8185614e86565b9350614ebc81856020860161394f565b614ec581613979565b840191505092915050565b6000608082019050614ee56000830187613a7a565b614ef26020830186613a7a565b614eff6040830185613b10565b8181036060830152614f118184614e97565b905095945050505050565b600081519050614f2b816138a4565b92915050565b600060208284031215614f4757614f4661386e565b5b6000614f5584828501614f1c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f98826139e5565b9150614fa3836139e5565b925082614fb357614fb2614f5e565b5b828204905092915050565b6000614fc9826139e5565b9150614fd4836139e5565b925082614fe457614fe3614f5e565b5b82820690509291505056fea2646970667358221220325fa48717681a5c8247ff9a5d54382a93bcfc0be041a4dd1d9f94a86fc2591864736f6c63430008110033

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

00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000071afd498d00000000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000b426561724676636b657273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a426561724676636b65720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026e6e000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): BearFvckers
Arg [1] : _tokenSymbol (string): BearFvcker
Arg [2] : _cost (uint256): 2000000000000000
Arg [3] : _maxSupply (uint256): 3000
Arg [4] : _maxMintAmountPerTx (uint256): 10
Arg [5] : _hiddenMetadataUri (string): nn

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 00000000000000000000000000000000000000000000000000071afd498d0000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000bb8
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [7] : 426561724676636b657273000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [9] : 426561724676636b657200000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [11] : 6e6e000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

51339:6127:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33504:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36617:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38120:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37683:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51789:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51632:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56677:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56783:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32753:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38985:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51436:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57203:150;;;;;;;;;;;;;:::i;:::-;;39226:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54739:833;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56217:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56433:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51906:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51554:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51830:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51521:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36425:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51861:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33873:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10174:103;;;;;;;;;;;;;:::i;:::-;;56866:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56571:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9523:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51705:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36786:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53254:1128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38396:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51592:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56297:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56970:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39482:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55679:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52728:520;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51669:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51466:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56130:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38754:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51748:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54596:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10432:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57081:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33504:305;33606:4;33658:25;33643:40;;;:11;:40;;;;:105;;;;33715:33;33700:48;;;:11;:48;;;;33643:105;:158;;;;33765:36;33789:11;33765:23;:36::i;:::-;33643:158;33623:178;;33504:305;;;:::o;36617:100::-;36671:13;36704:5;36697:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36617:100;:::o;38120:204::-;38188:7;38213:16;38221:7;38213;:16::i;:::-;38208:64;;38238:34;;;;;;;;;;;;;;38208:64;38292:15;:24;38308:7;38292:24;;;;;;;;;;;;;;;;;;;;;38285:31;;38120:204;;;:::o;37683:371::-;37756:13;37772:24;37788:7;37772:15;:24::i;:::-;37756:40;;37817:5;37811:11;;:2;:11;;;37807:48;;37831:24;;;;;;;;;;;;;;37807:48;37888:5;37872:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;37898:37;37915:5;37922:12;:10;:12::i;:::-;37898:16;:37::i;:::-;37897:38;37872:63;37868:138;;;37959:35;;;;;;;;;;;;;;37868:138;38018:28;38027:2;38031:7;38040:5;38018:8;:28::i;:::-;37745:309;37683:371;;:::o;51789:34::-;;;;:::o;51632:32::-;;;;:::o;56677:100::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56761:10:::1;56749:9;:22;;;;;;:::i;:::-;;56677:100:::0;:::o;56783:77::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56848:6:::1;56839;;:15;;;;;;;;;;;;;;;;;;56783:77:::0;:::o;32753:303::-;32797:7;33022:15;:13;:15::i;:::-;33007:12;;32991:13;;:28;:46;32984:53;;32753:303;:::o;38985:170::-;39119:28;39129:4;39135:2;39139:7;39119:9;:28::i;:::-;38985:170;;;:::o;51436:25::-;;;;:::o;57203:150::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1:::1;2410:7;;:19:::0;2402:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;57261:7:::2;57282;:5;:7::i;:::-;57274:21;;57303;57274:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57260:69;;;57344:2;57336:11;;;::::0;::::2;;57253:100;1768:1:::1;2722:7;:22;;;;57203:150::o:0;39226:185::-;39364:39;39381:4;39387:2;39391:7;39364:39;;;;;;;;;;;;:16;:39::i;:::-;39226:185;;;:::o;54739:833::-;54799:16;54824:23;54850:17;54860:6;54850:9;:17::i;:::-;54824:43;;54874:30;54921:15;54907:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54874:63;;54944:22;54969:15;:13;:15::i;:::-;54944:40;;54991:23;55025:26;55060:478;55085:15;55067;:33;:67;;;;;55121:13;;55104:14;:30;55067:67;55060:478;;;55145:31;55179:11;:27;55191:14;55179:27;;;;;;;;;;;55145:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55222:9;:16;;;55217:287;;55281:1;55255:28;;:9;:14;;;:28;;;55251:94;;55319:9;:14;;;55298:35;;55251:94;55383:6;55361:28;;:18;:28;;;55357:138;;55437:14;55404:13;55418:15;55404:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;55466:17;;;;;:::i;:::-;;;;55357:138;55217:287;55514:16;;;;;:::i;:::-;;;;55136:402;55060:478;;;55553:13;55546:20;;;;;;;54739:833;;;:::o;56217:74::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56280:5:::1;56273:4;:12;;;;56217:74:::0;:::o;56433:132::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56541:18:::1;56521:17;:38;;;;;;:::i;:::-;;56433:132:::0;:::o;51906:27::-;;;;;;;;;;;;;:::o;51554:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51830:26::-;;;;;;;;;;;;;:::o;51521:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36425:125::-;36489:7;36516:21;36529:7;36516:12;:21::i;:::-;:26;;;36509:33;;36425:125;;;:::o;51861:40::-;;;;;;;;;;;;;:::o;33873:206::-;33937:7;33978:1;33961:19;;:5;:19;;;33957:60;;33989:28;;;;;;;;;;;;;;33957:60;34043:12;:19;34056:5;34043:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;34035:36;;34028:43;;33873:206;;;:::o;10174:103::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10239:30:::1;10266:1;10239:18;:30::i;:::-;10174:103::o:0;56866:98::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56947:11:::1;56934:10;:24;;;;56866:98:::0;:::o;56571:100::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56655:10:::1;56643:9;:22;;;;;;:::i;:::-;;56571:100:::0;:::o;9523:87::-;9569:7;9596:6;;;;;;;;;;;9589:13;;9523:87;:::o;51705:38::-;;;;:::o;36786:104::-;36842:13;36875:7;36868:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36786:104;:::o;53254:1128::-;53317:6;;;;;;;;;;;53316:7;53308:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;53373:18;;53364:5;:27;;53356:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;53466:9;;53457:5;53441:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:34;;53433:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;53563:14;;53554:5;53526:25;53540:10;53526:13;:25::i;:::-;:33;;;;:::i;:::-;:51;;53504:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;53638:16;53657:5;53638:24;;53673:16;53692:18;:30;53711:10;53692:30;;;;;;;;;;;;;;;;53673:49;;51783:1;53736:11;:22;53733:291;;;53775:23;53812:11;51783:1;53801:22;;;;:::i;:::-;53775:48;;53849:18;53841:5;:26;53838:175;;;53910:18;53902:5;:26;;;;:::i;:::-;53888:40;;53838:175;;;53996:1;53982:15;;53838:175;53760:264;53733:291;54070:4;;54056:11;:18;;;;:::i;:::-;54043:9;:31;;54030:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;54162:5;54128:18;:30;54147:10;54128:30;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;54172:28;54182:10;54194:5;54172:9;:28::i;:::-;53301:1081;;53254:1128;:::o;38396:287::-;38507:12;:10;:12::i;:::-;38495:24;;:8;:24;;;38491:54;;38528:17;;;;;;;;;;;;;;38491:54;38603:8;38558:18;:32;38577:12;:10;:12::i;:::-;38558:32;;;;;;;;;;;;;;;:42;38591:8;38558:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;38656:8;38627:48;;38642:12;:10;:12::i;:::-;38627:48;;;38666:8;38627:48;;;;;;:::i;:::-;;;;;;;;38396:287;;:::o;51592:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56297:130::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56402:19:::1;56381:18;:40;;;;56297:130:::0;:::o;56970:105::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57063:6:::1;57040:20;;:29;;;;;;;;;;;;;;;;;;56970:105:::0;:::o;39482:369::-;39649:28;39659:4;39665:2;39669:7;39649:9;:28::i;:::-;39692:15;:2;:13;;;:15::i;:::-;:76;;;;;39712:56;39743:4;39749:2;39753:7;39762:5;39712:30;:56::i;:::-;39711:57;39692:76;39688:156;;;39792:40;;;;;;;;;;;;;;39688:156;39482:369;;;;:::o;55679:445::-;55753:13;55783:17;55791:8;55783:7;:17::i;:::-;55775:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;55877:5;55865:17;;:8;;;;;;;;;;;:17;;;55861:64;;55900:17;55893:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55861:64;55933:28;55964:10;:8;:10::i;:::-;55933:41;;56019:1;55994:14;55988:28;:32;:130;;;;;;;;;;;;;;;;;56056:14;56072:19;:8;:17;:19::i;:::-;56093:9;56039:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55988:130;55981:137;;;55679:445;;;;:::o;52728:520::-;52829:5;52449:1;52441:5;:9;:40;;;;;52463:18;;52454:5;:27;;52441:40;52433:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52546:9;;52537:5;52521:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:34;;52513:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;52856:5:::1;52679;52672:4;;:12;;;;:::i;:::-;52659:9;:25;;52651:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;52878:20:::2;;;;;;;;;;;52870:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;52953:16;:30;52970:12;:10;:12::i;:::-;52953:30;;;;;;;;;;;;;;;;;;;;;;;;;52952:31;52944:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53019:12;53061;:10;:12::i;:::-;53044:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;53034:41;;;;;;53019:56;;53090:50;53109:12;;53090:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53123:10;;53135:4;53090:18;:50::i;:::-;53082:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;53201:4;53168:16;:30;53185:12;:10;:12::i;:::-;53168:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;53212:30;53222:12;:10;:12::i;:::-;53236:5;53212:9;:30::i;:::-;52863:385;52587:1:::1;52728:520:::0;;;;:::o;51669:31::-;;;;:::o;51466:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;56130:81::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56199:6:::1;56188:8;;:17;;;;;;;;;;;;;;;;;;56130:81:::0;:::o;38754:164::-;38851:4;38875:18;:25;38894:5;38875:25;;;;;;;;;;;;;;;:35;38901:8;38875:35;;;;;;;;;;;;;;;;;;;;;;;;;38868:42;;38754:164;;;;:::o;51748:36::-;51783:1;51748:36;:::o;54596:137::-;54676:5;52449:1;52441:5;:9;:40;;;;;52463:18;;52454:5;:27;;52441:40;52433:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52546:9;;52537:5;52521:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:34;;52513:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;9754:12:::1;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54700:27:::2;54710:9;54721:5;54700:9;:27::i;:::-;54596:137:::0;;;:::o;10432:201::-;9754:12;:10;:12::i;:::-;9743:23;;:7;:5;:7::i;:::-;:23;;;9735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10541:1:::1;10521:22;;:8;:22;;::::0;10513:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;10597:28;10616:8;10597:18;:28::i;:::-;10432:201:::0;:::o;57081:116::-;57140:4;57164:18;:25;57183:5;57164:25;;;;;;;;;;;;;;;;57157:32;;57081:116;;;:::o;22330:157::-;22415:4;22454:25;22439:40;;;:11;:40;;;;22432:47;;22330:157;;;:::o;40106:174::-;40163:4;40206:7;40187:15;:13;:15::i;:::-;:26;;:53;;;;;40227:13;;40217:7;:23;40187:53;:85;;;;;40245:11;:20;40257:7;40245:20;;;;;;;;;;;:27;;;;;;;;;;;;40244:28;40187:85;40180:92;;40106:174;;;:::o;8247:98::-;8300:7;8327:10;8320:17;;8247:98;:::o;48263:196::-;48405:2;48378:15;:24;48394:7;48378:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;48443:7;48439:2;48423:28;;48432:5;48423:28;;;;;;;;;;;;48263:196;;;:::o;55578:95::-;55643:7;55666:1;55659:8;;55578:95;:::o;43206:2130::-;43321:35;43359:21;43372:7;43359:12;:21::i;:::-;43321:59;;43419:4;43397:26;;:13;:18;;;:26;;;43393:67;;43432:28;;;;;;;;;;;;;;43393:67;43473:22;43515:4;43499:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;43536:36;43553:4;43559:12;:10;:12::i;:::-;43536:16;:36::i;:::-;43499:73;:126;;;;43613:12;:10;:12::i;:::-;43589:36;;:20;43601:7;43589:11;:20::i;:::-;:36;;;43499:126;43473:153;;43644:17;43639:66;;43670:35;;;;;;;;;;;;;;43639:66;43734:1;43720:16;;:2;:16;;;43716:52;;43745:23;;;;;;;;;;;;;;43716:52;43781:43;43803:4;43809:2;43813:7;43822:1;43781:21;:43::i;:::-;43889:35;43906:1;43910:7;43919:4;43889:8;:35::i;:::-;44250:1;44220:12;:18;44233:4;44220:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44294:1;44266:12;:16;44279:2;44266:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44312:31;44346:11;:20;44358:7;44346:20;;;;;;;;;;;44312:54;;44397:2;44381:8;:13;;;:18;;;;;;;;;;;;;;;;;;44447:15;44414:8;:23;;;:49;;;;;;;;;;;;;;;;;;44715:19;44747:1;44737:7;:11;44715:33;;44763:31;44797:11;:24;44809:11;44797:24;;;;;;;;;;;44763:58;;44865:1;44840:27;;:8;:13;;;;;;;;;;;;:27;;;44836:384;;45050:13;;45035:11;:28;45031:174;;45104:4;45088:8;:13;;;:20;;;;;;;;;;;;;;;;;;45157:13;:28;;;45131:8;:23;;;:54;;;;;;;;;;;;;;;;;;45031:174;44836:384;44195:1036;;;45267:7;45263:2;45248:27;;45257:4;45248:27;;;;;;;;;;;;45286:42;45307:4;45313:2;45317:7;45326:1;45286:20;:42::i;:::-;43310:2026;;43206:2130;;;:::o;35254:1109::-;35316:21;;:::i;:::-;35350:12;35365:7;35350:22;;35433:4;35414:15;:13;:15::i;:::-;:23;;:47;;;;;35448:13;;35441:4;:20;35414:47;35410:886;;;35482:31;35516:11;:17;35528:4;35516:17;;;;;;;;;;;35482:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35557:9;:16;;;35552:729;;35628:1;35602:28;;:9;:14;;;:28;;;35598:101;;35666:9;35659:16;;;;;;35598:101;36001:261;36008:4;36001:261;;;36041:6;;;;;;;;36086:11;:17;36098:4;36086:17;;;;;;;;;;;36074:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36160:1;36134:28;;:9;:14;;;:28;;;36130:109;;36202:9;36195:16;;;;;;36130:109;36001:261;;;35552:729;35463:833;35410:886;36324:31;;;;;;;;;;;;;;35254:1109;;;;:::o;10793:191::-;10867:16;10886:6;;;;;;;;;;;10867:25;;10912:8;10903:6;;:17;;;;;;;;;;;;;;;;;;10967:8;10936:40;;10957:8;10936:40;;;;;;;;;;;;10856:128;10793:191;:::o;34161:137::-;34222:7;34257:12;:19;34270:5;34257:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;34249:41;;34242:48;;34161:137;;;:::o;40288:104::-;40357:27;40367:2;40371:8;40357:27;;;;;;;;;;;;:9;:27::i;:::-;40288:104;;:::o;12224:326::-;12284:4;12541:1;12519:7;:19;;;:23;12512:30;;12224:326;;;:::o;48951:667::-;49114:4;49151:2;49135:36;;;49172:12;:10;:12::i;:::-;49186:4;49192:7;49201:5;49135:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;49131:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49386:1;49369:6;:13;:18;49365:235;;49415:40;;;;;;;;;;;;;;49365:235;49558:6;49552:13;49543:6;49539:2;49535:15;49528:38;49131:480;49264:45;;;49254:55;;;:6;:55;;;;49247:62;;;48951:667;;;;;;:::o;57359:104::-;57419:13;57448:9;57441:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57359:104;:::o;5809:723::-;5865:13;6095:1;6086:5;:10;6082:53;;6113:10;;;;;;;;;;;;;;;;;;;;;6082:53;6145:12;6160:5;6145:20;;6176:14;6201:78;6216:1;6208:4;:9;6201:78;;6234:8;;;;;:::i;:::-;;;;6265:2;6257:10;;;;;:::i;:::-;;;6201:78;;;6289:19;6321:6;6311:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6289:39;;6339:154;6355:1;6346:5;:10;6339:154;;6383:1;6373:11;;;;;:::i;:::-;;;6450:2;6442:5;:10;;;;:::i;:::-;6429:2;:24;;;;:::i;:::-;6416:39;;6399:6;6406;6399:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6479:2;6470:11;;;;;:::i;:::-;;;6339:154;;;6517:6;6503:21;;;;;5809:723;;;;:::o;3979:190::-;4104:4;4157;4128:25;4141:5;4148:4;4128:12;:25::i;:::-;:33;4121:40;;3979:190;;;;;:::o;50266:159::-;;;;;:::o;51084:158::-;;;;;:::o;40755:163::-;40878:32;40884:2;40888:8;40898:5;40905:4;40878:5;:32::i;:::-;40755:163;;;:::o;4530:675::-;4613:7;4633:20;4656:4;4633:27;;4676:9;4671:497;4695:5;:12;4691:1;:16;4671:497;;;4729:20;4752:5;4758:1;4752:8;;;;;;;;:::i;:::-;;;;;;;;4729:31;;4795:12;4779;:28;4775:382;;4922:42;4937:12;4951;4922:14;:42::i;:::-;4907:57;;4775:382;;;5099:42;5114:12;5128;5099:14;:42::i;:::-;5084:57;;4775:382;4714:454;4709:3;;;;;:::i;:::-;;;;4671:497;;;;5185:12;5178:19;;;4530:675;;;;:::o;41177:1775::-;41316:20;41339:13;;41316:36;;41381:1;41367:16;;:2;:16;;;41363:48;;41392:19;;;;;;;;;;;;;;41363:48;41438:1;41426:8;:13;41422:44;;41448:18;;;;;;;;;;;;;;41422:44;41479:61;41509:1;41513:2;41517:12;41531:8;41479:21;:61::i;:::-;41852:8;41817:12;:16;41830:2;41817:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41916:8;41876:12;:16;41889:2;41876:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41975:2;41942:11;:25;41954:12;41942:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;42042:15;41992:11;:25;42004:12;41992:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;42075:20;42098:12;42075:35;;42125:11;42154:8;42139:12;:23;42125:37;;42183:4;:23;;;;;42191:15;:2;:13;;;:15::i;:::-;42183:23;42179:641;;;42227:314;42283:12;42279:2;42258:38;;42275:1;42258:38;;;;;;;;;;;;42324:69;42363:1;42367:2;42371:14;;;;;;42387:5;42324:30;:69::i;:::-;42319:174;;42429:40;;;;;;;;;;;;;;42319:174;42536:3;42520:12;:19;42227:314;;42622:12;42605:13;;:29;42601:43;;42636:8;;;42601:43;42179:641;;;42685:120;42741:14;;;;;;42737:2;42716:40;;42733:1;42716:40;;;;;;;;;;;;42800:3;42784:12;:19;42685:120;;42179:641;42850:12;42834:13;:28;;;;41792:1082;;42884:60;42913:1;42917:2;42921:12;42935:8;42884:20;:60::i;:::-;41305:1647;41177:1775;;;;:::o;5213:224::-;5281:13;5344:1;5338:4;5331:15;5373:1;5367:4;5360:15;5414:4;5408;5398:21;5389:30;;5213:224;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:117::-;5351:1;5348;5341:12;5365:117;5474:1;5471;5464:12;5488:180;5536:77;5533:1;5526:88;5633:4;5630:1;5623:15;5657:4;5654:1;5647:15;5674:281;5757:27;5779:4;5757:27;:::i;:::-;5749:6;5745:40;5887:6;5875:10;5872:22;5851:18;5839:10;5836:34;5833:62;5830:88;;;5898:18;;:::i;:::-;5830:88;5938:10;5934:2;5927:22;5717:238;5674:281;;:::o;5961:129::-;5995:6;6022:20;;:::i;:::-;6012:30;;6051:33;6079:4;6071:6;6051:33;:::i;:::-;5961:129;;;:::o;6096:308::-;6158:4;6248:18;6240:6;6237:30;6234:56;;;6270:18;;:::i;:::-;6234:56;6308:29;6330:6;6308:29;:::i;:::-;6300:37;;6392:4;6386;6382:15;6374:23;;6096:308;;;:::o;6410:146::-;6507:6;6502:3;6497;6484:30;6548:1;6539:6;6534:3;6530:16;6523:27;6410:146;;;:::o;6562:425::-;6640:5;6665:66;6681:49;6723:6;6681:49;:::i;:::-;6665:66;:::i;:::-;6656:75;;6754:6;6747:5;6740:21;6792:4;6785:5;6781:16;6830:3;6821:6;6816:3;6812:16;6809:25;6806:112;;;6837:79;;:::i;:::-;6806:112;6927:54;6974:6;6969:3;6964;6927:54;:::i;:::-;6646:341;6562:425;;;;;:::o;7007:340::-;7063:5;7112:3;7105:4;7097:6;7093:17;7089:27;7079:122;;7120:79;;:::i;:::-;7079:122;7237:6;7224:20;7262:79;7337:3;7329:6;7322:4;7314:6;7310:17;7262:79;:::i;:::-;7253:88;;7069:278;7007:340;;;;:::o;7353:509::-;7422:6;7471:2;7459:9;7450:7;7446:23;7442:32;7439:119;;;7477:79;;:::i;:::-;7439:119;7625:1;7614:9;7610:17;7597:31;7655:18;7647:6;7644:30;7641:117;;;7677:79;;:::i;:::-;7641:117;7782:63;7837:7;7828:6;7817:9;7813:22;7782:63;:::i;:::-;7772:73;;7568:287;7353:509;;;;:::o;7868:116::-;7938:21;7953:5;7938:21;:::i;:::-;7931:5;7928:32;7918:60;;7974:1;7971;7964:12;7918:60;7868:116;:::o;7990:133::-;8033:5;8071:6;8058:20;8049:29;;8087:30;8111:5;8087:30;:::i;:::-;7990:133;;;;:::o;8129:323::-;8185:6;8234:2;8222:9;8213:7;8209:23;8205:32;8202:119;;;8240:79;;:::i;:::-;8202:119;8360:1;8385:50;8427:7;8418:6;8407:9;8403:22;8385:50;:::i;:::-;8375:60;;8331:114;8129:323;;;;:::o;8458:619::-;8535:6;8543;8551;8600:2;8588:9;8579:7;8575:23;8571:32;8568:119;;;8606:79;;:::i;:::-;8568:119;8726:1;8751:53;8796:7;8787:6;8776:9;8772:22;8751:53;:::i;:::-;8741:63;;8697:117;8853:2;8879:53;8924:7;8915:6;8904:9;8900:22;8879:53;:::i;:::-;8869:63;;8824:118;8981:2;9007:53;9052:7;9043:6;9032:9;9028:22;9007:53;:::i;:::-;8997:63;;8952:118;8458:619;;;;;:::o;9083:77::-;9120:7;9149:5;9138:16;;9083:77;;;:::o;9166:118::-;9253:24;9271:5;9253:24;:::i;:::-;9248:3;9241:37;9166:118;;:::o;9290:222::-;9383:4;9421:2;9410:9;9406:18;9398:26;;9434:71;9502:1;9491:9;9487:17;9478:6;9434:71;:::i;:::-;9290:222;;;;:::o;9518:329::-;9577:6;9626:2;9614:9;9605:7;9601:23;9597:32;9594:119;;;9632:79;;:::i;:::-;9594:119;9752:1;9777:53;9822:7;9813:6;9802:9;9798:22;9777:53;:::i;:::-;9767:63;;9723:117;9518:329;;;;:::o;9853:114::-;9920:6;9954:5;9948:12;9938:22;;9853:114;;;:::o;9973:184::-;10072:11;10106:6;10101:3;10094:19;10146:4;10141:3;10137:14;10122:29;;9973:184;;;;:::o;10163:132::-;10230:4;10253:3;10245:11;;10283:4;10278:3;10274:14;10266:22;;10163:132;;;:::o;10301:108::-;10378:24;10396:5;10378:24;:::i;:::-;10373:3;10366:37;10301:108;;:::o;10415:179::-;10484:10;10505:46;10547:3;10539:6;10505:46;:::i;:::-;10583:4;10578:3;10574:14;10560:28;;10415:179;;;;:::o;10600:113::-;10670:4;10702;10697:3;10693:14;10685:22;;10600:113;;;:::o;10749:732::-;10868:3;10897:54;10945:5;10897:54;:::i;:::-;10967:86;11046:6;11041:3;10967:86;:::i;:::-;10960:93;;11077:56;11127:5;11077:56;:::i;:::-;11156:7;11187:1;11172:284;11197:6;11194:1;11191:13;11172:284;;;11273:6;11267:13;11300:63;11359:3;11344:13;11300:63;:::i;:::-;11293:70;;11386:60;11439:6;11386:60;:::i;:::-;11376:70;;11232:224;11219:1;11216;11212:9;11207:14;;11172:284;;;11176:14;11472:3;11465:10;;10873:608;;;10749:732;;;;:::o;11487:373::-;11630:4;11668:2;11657:9;11653:18;11645:26;;11717:9;11711:4;11707:20;11703:1;11692:9;11688:17;11681:47;11745:108;11848:4;11839:6;11745:108;:::i;:::-;11737:116;;11487:373;;;;:::o;11866:122::-;11939:24;11957:5;11939:24;:::i;:::-;11932:5;11929:35;11919:63;;11978:1;11975;11968:12;11919:63;11866:122;:::o;11994:139::-;12040:5;12078:6;12065:20;12056:29;;12094:33;12121:5;12094:33;:::i;:::-;11994:139;;;;:::o;12139:329::-;12198:6;12247:2;12235:9;12226:7;12222:23;12218:32;12215:119;;;12253:79;;:::i;:::-;12215:119;12373:1;12398:53;12443:7;12434:6;12423:9;12419:22;12398:53;:::i;:::-;12388:63;;12344:117;12139:329;;;;:::o;12474:468::-;12539:6;12547;12596:2;12584:9;12575:7;12571:23;12567:32;12564:119;;;12602:79;;:::i;:::-;12564:119;12722:1;12747:53;12792:7;12783:6;12772:9;12768:22;12747:53;:::i;:::-;12737:63;;12693:117;12849:2;12875:50;12917:7;12908:6;12897:9;12893:22;12875:50;:::i;:::-;12865:60;;12820:115;12474:468;;;;;:::o;12948:307::-;13009:4;13099:18;13091:6;13088:30;13085:56;;;13121:18;;:::i;:::-;13085:56;13159:29;13181:6;13159:29;:::i;:::-;13151:37;;13243:4;13237;13233:15;13225:23;;12948:307;;;:::o;13261:423::-;13338:5;13363:65;13379:48;13420:6;13379:48;:::i;:::-;13363:65;:::i;:::-;13354:74;;13451:6;13444:5;13437:21;13489:4;13482:5;13478:16;13527:3;13518:6;13513:3;13509:16;13506:25;13503:112;;;13534:79;;:::i;:::-;13503:112;13624:54;13671:6;13666:3;13661;13624:54;:::i;:::-;13344:340;13261:423;;;;;:::o;13703:338::-;13758:5;13807:3;13800:4;13792:6;13788:17;13784:27;13774:122;;13815:79;;:::i;:::-;13774:122;13932:6;13919:20;13957:78;14031:3;14023:6;14016:4;14008:6;14004:17;13957:78;:::i;:::-;13948:87;;13764:277;13703:338;;;;:::o;14047:943::-;14142:6;14150;14158;14166;14215:3;14203:9;14194:7;14190:23;14186:33;14183:120;;;14222:79;;:::i;:::-;14183:120;14342:1;14367:53;14412:7;14403:6;14392:9;14388:22;14367:53;:::i;:::-;14357:63;;14313:117;14469:2;14495:53;14540:7;14531:6;14520:9;14516:22;14495:53;:::i;:::-;14485:63;;14440:118;14597:2;14623:53;14668:7;14659:6;14648:9;14644:22;14623:53;:::i;:::-;14613:63;;14568:118;14753:2;14742:9;14738:18;14725:32;14784:18;14776:6;14773:30;14770:117;;;14806:79;;:::i;:::-;14770:117;14911:62;14965:7;14956:6;14945:9;14941:22;14911:62;:::i;:::-;14901:72;;14696:287;14047:943;;;;;;;:::o;14996:117::-;15105:1;15102;15095:12;15119:117;15228:1;15225;15218:12;15259:568;15332:8;15342:6;15392:3;15385:4;15377:6;15373:17;15369:27;15359:122;;15400:79;;:::i;:::-;15359:122;15513:6;15500:20;15490:30;;15543:18;15535:6;15532:30;15529:117;;;15565:79;;:::i;:::-;15529:117;15679:4;15671:6;15667:17;15655:29;;15733:3;15725:4;15717:6;15713:17;15703:8;15699:32;15696:41;15693:128;;;15740:79;;:::i;:::-;15693:128;15259:568;;;;;:::o;15833:704::-;15928:6;15936;15944;15993:2;15981:9;15972:7;15968:23;15964:32;15961:119;;;15999:79;;:::i;:::-;15961:119;16119:1;16144:53;16189:7;16180:6;16169:9;16165:22;16144:53;:::i;:::-;16134:63;;16090:117;16274:2;16263:9;16259:18;16246:32;16305:18;16297:6;16294:30;16291:117;;;16327:79;;:::i;:::-;16291:117;16440:80;16512:7;16503:6;16492:9;16488:22;16440:80;:::i;:::-;16422:98;;;;16217:313;15833:704;;;;;:::o;16543:474::-;16611:6;16619;16668:2;16656:9;16647:7;16643:23;16639:32;16636:119;;;16674:79;;:::i;:::-;16636:119;16794:1;16819:53;16864:7;16855:6;16844:9;16840:22;16819:53;:::i;:::-;16809:63;;16765:117;16921:2;16947:53;16992:7;16983:6;16972:9;16968:22;16947:53;:::i;:::-;16937:63;;16892:118;16543:474;;;;;:::o;17023:::-;17091:6;17099;17148:2;17136:9;17127:7;17123:23;17119:32;17116:119;;;17154:79;;:::i;:::-;17116:119;17274:1;17299:53;17344:7;17335:6;17324:9;17320:22;17299:53;:::i;:::-;17289:63;;17245:117;17401:2;17427:53;17472:7;17463:6;17452:9;17448:22;17427:53;:::i;:::-;17417:63;;17372:118;17023:474;;;;;:::o;17503:180::-;17551:77;17548:1;17541:88;17648:4;17645:1;17638:15;17672:4;17669:1;17662:15;17689:320;17733:6;17770:1;17764:4;17760:12;17750:22;;17817:1;17811:4;17807:12;17838:18;17828:81;;17894:4;17886:6;17882:17;17872:27;;17828:81;17956:2;17948:6;17945:14;17925:18;17922:38;17919:84;;17975:18;;:::i;:::-;17919:84;17740:269;17689:320;;;:::o;18015:182::-;18155:34;18151:1;18143:6;18139:14;18132:58;18015:182;:::o;18203:366::-;18345:3;18366:67;18430:2;18425:3;18366:67;:::i;:::-;18359:74;;18442:93;18531:3;18442:93;:::i;:::-;18560:2;18555:3;18551:12;18544:19;;18203:366;;;:::o;18575:419::-;18741:4;18779:2;18768:9;18764:18;18756:26;;18828:9;18822:4;18818:20;18814:1;18803:9;18799:17;18792:47;18856:131;18982:4;18856:131;:::i;:::-;18848:139;;18575:419;;;:::o;19000:141::-;19049:4;19072:3;19064:11;;19095:3;19092:1;19085:14;19129:4;19126:1;19116:18;19108:26;;19000:141;;;:::o;19147:93::-;19184:6;19231:2;19226;19219:5;19215:14;19211:23;19201:33;;19147:93;;;:::o;19246:107::-;19290:8;19340:5;19334:4;19330:16;19309:37;;19246:107;;;;:::o;19359:393::-;19428:6;19478:1;19466:10;19462:18;19501:97;19531:66;19520:9;19501:97;:::i;:::-;19619:39;19649:8;19638:9;19619:39;:::i;:::-;19607:51;;19691:4;19687:9;19680:5;19676:21;19667:30;;19740:4;19730:8;19726:19;19719:5;19716:30;19706:40;;19435:317;;19359:393;;;;;:::o;19758:60::-;19786:3;19807:5;19800:12;;19758:60;;;:::o;19824:142::-;19874:9;19907:53;19925:34;19934:24;19952:5;19934:24;:::i;:::-;19925:34;:::i;:::-;19907:53;:::i;:::-;19894:66;;19824:142;;;:::o;19972:75::-;20015:3;20036:5;20029:12;;19972:75;;;:::o;20053:269::-;20163:39;20194:7;20163:39;:::i;:::-;20224:91;20273:41;20297:16;20273:41;:::i;:::-;20265:6;20258:4;20252:11;20224:91;:::i;:::-;20218:4;20211:105;20129:193;20053:269;;;:::o;20328:73::-;20373:3;20328:73;:::o;20407:189::-;20484:32;;:::i;:::-;20525:65;20583:6;20575;20569:4;20525:65;:::i;:::-;20460:136;20407:189;;:::o;20602:186::-;20662:120;20679:3;20672:5;20669:14;20662:120;;;20733:39;20770:1;20763:5;20733:39;:::i;:::-;20706:1;20699:5;20695:13;20686:22;;20662:120;;;20602:186;;:::o;20794:543::-;20895:2;20890:3;20887:11;20884:446;;;20929:38;20961:5;20929:38;:::i;:::-;21013:29;21031:10;21013:29;:::i;:::-;21003:8;20999:44;21196:2;21184:10;21181:18;21178:49;;;21217:8;21202:23;;21178:49;21240:80;21296:22;21314:3;21296:22;:::i;:::-;21286:8;21282:37;21269:11;21240:80;:::i;:::-;20899:431;;20884:446;20794:543;;;:::o;21343:117::-;21397:8;21447:5;21441:4;21437:16;21416:37;;21343:117;;;;:::o;21466:169::-;21510:6;21543:51;21591:1;21587:6;21579:5;21576:1;21572:13;21543:51;:::i;:::-;21539:56;21624:4;21618;21614:15;21604:25;;21517:118;21466:169;;;;:::o;21640:295::-;21716:4;21862:29;21887:3;21881:4;21862:29;:::i;:::-;21854:37;;21924:3;21921:1;21917:11;21911:4;21908:21;21900:29;;21640:295;;;;:::o;21940:1395::-;22057:37;22090:3;22057:37;:::i;:::-;22159:18;22151:6;22148:30;22145:56;;;22181:18;;:::i;:::-;22145:56;22225:38;22257:4;22251:11;22225:38;:::i;:::-;22310:67;22370:6;22362;22356:4;22310:67;:::i;:::-;22404:1;22428:4;22415:17;;22460:2;22452:6;22449:14;22477:1;22472:618;;;;23134:1;23151:6;23148:77;;;23200:9;23195:3;23191:19;23185:26;23176:35;;23148:77;23251:67;23311:6;23304:5;23251:67;:::i;:::-;23245:4;23238:81;23107:222;22442:887;;22472:618;22524:4;22520:9;22512:6;22508:22;22558:37;22590:4;22558:37;:::i;:::-;22617:1;22631:208;22645:7;22642:1;22639:14;22631:208;;;22724:9;22719:3;22715:19;22709:26;22701:6;22694:42;22775:1;22767:6;22763:14;22753:24;;22822:2;22811:9;22807:18;22794:31;;22668:4;22665:1;22661:12;22656:17;;22631:208;;;22867:6;22858:7;22855:19;22852:179;;;22925:9;22920:3;22916:19;22910:26;22968:48;23010:4;23002:6;22998:17;22987:9;22968:48;:::i;:::-;22960:6;22953:64;22875:156;22852:179;23077:1;23073;23065:6;23061:14;23057:22;23051:4;23044:36;22479:611;;;22442:887;;22032:1303;;;21940:1395;;:::o;23341:181::-;23481:33;23477:1;23469:6;23465:14;23458:57;23341:181;:::o;23528:366::-;23670:3;23691:67;23755:2;23750:3;23691:67;:::i;:::-;23684:74;;23767:93;23856:3;23767:93;:::i;:::-;23885:2;23880:3;23876:12;23869:19;;23528:366;;;:::o;23900:419::-;24066:4;24104:2;24093:9;24089:18;24081:26;;24153:9;24147:4;24143:20;24139:1;24128:9;24124:17;24117:47;24181:131;24307:4;24181:131;:::i;:::-;24173:139;;23900:419;;;:::o;24325:147::-;24426:11;24463:3;24448:18;;24325:147;;;;:::o;24478:114::-;;:::o;24598:398::-;24757:3;24778:83;24859:1;24854:3;24778:83;:::i;:::-;24771:90;;24870:93;24959:3;24870:93;:::i;:::-;24988:1;24983:3;24979:11;24972:18;;24598:398;;;:::o;25002:379::-;25186:3;25208:147;25351:3;25208:147;:::i;:::-;25201:154;;25372:3;25365:10;;25002:379;;;:::o;25387:180::-;25435:77;25432:1;25425:88;25532:4;25529:1;25522:15;25556:4;25553:1;25546:15;25573:180;25621:77;25618:1;25611:88;25718:4;25715:1;25708:15;25742:4;25739:1;25732:15;25759:233;25798:3;25821:24;25839:5;25821:24;:::i;:::-;25812:33;;25867:66;25860:5;25857:77;25854:103;;25937:18;;:::i;:::-;25854:103;25984:1;25977:5;25973:13;25966:20;;25759:233;;;:::o;25998:173::-;26138:25;26134:1;26126:6;26122:14;26115:49;25998:173;:::o;26177:366::-;26319:3;26340:67;26404:2;26399:3;26340:67;:::i;:::-;26333:74;;26416:93;26505:3;26416:93;:::i;:::-;26534:2;26529:3;26525:12;26518:19;;26177:366;;;:::o;26549:419::-;26715:4;26753:2;26742:9;26738:18;26730:26;;26802:9;26796:4;26792:20;26788:1;26777:9;26773:17;26766:47;26830:131;26956:4;26830:131;:::i;:::-;26822:139;;26549:419;;;:::o;26974:220::-;27114:34;27110:1;27102:6;27098:14;27091:58;27183:3;27178:2;27170:6;27166:15;27159:28;26974:220;:::o;27200:366::-;27342:3;27363:67;27427:2;27422:3;27363:67;:::i;:::-;27356:74;;27439:93;27528:3;27439:93;:::i;:::-;27557:2;27552:3;27548:12;27541:19;;27200:366;;;:::o;27572:419::-;27738:4;27776:2;27765:9;27761:18;27753:26;;27825:9;27819:4;27815:20;27811:1;27800:9;27796:17;27789:47;27853:131;27979:4;27853:131;:::i;:::-;27845:139;;27572:419;;;:::o;27997:191::-;28037:3;28056:20;28074:1;28056:20;:::i;:::-;28051:25;;28090:20;28108:1;28090:20;:::i;:::-;28085:25;;28133:1;28130;28126:9;28119:16;;28154:3;28151:1;28148:10;28145:36;;;28161:18;;:::i;:::-;28145:36;27997:191;;;;:::o;28194:168::-;28334:20;28330:1;28322:6;28318:14;28311:44;28194:168;:::o;28368:366::-;28510:3;28531:67;28595:2;28590:3;28531:67;:::i;:::-;28524:74;;28607:93;28696:3;28607:93;:::i;:::-;28725:2;28720:3;28716:12;28709:19;;28368:366;;;:::o;28740:419::-;28906:4;28944:2;28933:9;28929:18;28921:26;;28993:9;28987:4;28983:20;28979:1;28968:9;28964:17;28957:47;29021:131;29147:4;29021:131;:::i;:::-;29013:139;;28740:419;;;:::o;29165:170::-;29305:22;29301:1;29293:6;29289:14;29282:46;29165:170;:::o;29341:366::-;29483:3;29504:67;29568:2;29563:3;29504:67;:::i;:::-;29497:74;;29580:93;29669:3;29580:93;:::i;:::-;29698:2;29693:3;29689:12;29682:19;;29341:366;;;:::o;29713:419::-;29879:4;29917:2;29906:9;29902:18;29894:26;;29966:9;29960:4;29956:20;29952:1;29941:9;29937:17;29930:47;29994:131;30120:4;29994:131;:::i;:::-;29986:139;;29713:419;;;:::o;30138:194::-;30178:4;30198:20;30216:1;30198:20;:::i;:::-;30193:25;;30232:20;30250:1;30232:20;:::i;:::-;30227:25;;30276:1;30273;30269:9;30261:17;;30300:1;30294:4;30291:11;30288:37;;;30305:18;;:::i;:::-;30288:37;30138:194;;;;:::o;30338:410::-;30378:7;30401:20;30419:1;30401:20;:::i;:::-;30396:25;;30435:20;30453:1;30435:20;:::i;:::-;30430:25;;30490:1;30487;30483:9;30512:30;30530:11;30512:30;:::i;:::-;30501:41;;30691:1;30682:7;30678:15;30675:1;30672:22;30652:1;30645:9;30625:83;30602:139;;30721:18;;:::i;:::-;30602:139;30386:362;30338:410;;;;:::o;30754:221::-;30894:34;30890:1;30882:6;30878:14;30871:58;30963:4;30958:2;30950:6;30946:15;30939:29;30754:221;:::o;30981:366::-;31123:3;31144:67;31208:2;31203:3;31144:67;:::i;:::-;31137:74;;31220:93;31309:3;31220:93;:::i;:::-;31338:2;31333:3;31329:12;31322:19;;30981:366;;;:::o;31353:419::-;31519:4;31557:2;31546:9;31542:18;31534:26;;31606:9;31600:4;31596:20;31592:1;31581:9;31577:17;31570:47;31634:131;31760:4;31634:131;:::i;:::-;31626:139;;31353:419;;;:::o;31778:234::-;31918:34;31914:1;31906:6;31902:14;31895:58;31987:17;31982:2;31974:6;31970:15;31963:42;31778:234;:::o;32018:366::-;32160:3;32181:67;32245:2;32240:3;32181:67;:::i;:::-;32174:74;;32257:93;32346:3;32257:93;:::i;:::-;32375:2;32370:3;32366:12;32359:19;;32018:366;;;:::o;32390:419::-;32556:4;32594:2;32583:9;32579:18;32571:26;;32643:9;32637:4;32633:20;32629:1;32618:9;32614:17;32607:47;32671:131;32797:4;32671:131;:::i;:::-;32663:139;;32390:419;;;:::o;32815:148::-;32917:11;32954:3;32939:18;;32815:148;;;;:::o;32969:390::-;33075:3;33103:39;33136:5;33103:39;:::i;:::-;33158:89;33240:6;33235:3;33158:89;:::i;:::-;33151:96;;33256:65;33314:6;33309:3;33302:4;33295:5;33291:16;33256:65;:::i;:::-;33346:6;33341:3;33337:16;33330:23;;33079:280;32969:390;;;;:::o;33389:874::-;33492:3;33529:5;33523:12;33558:36;33584:9;33558:36;:::i;:::-;33610:89;33692:6;33687:3;33610:89;:::i;:::-;33603:96;;33730:1;33719:9;33715:17;33746:1;33741:166;;;;33921:1;33916:341;;;;33708:549;;33741:166;33825:4;33821:9;33810;33806:25;33801:3;33794:38;33887:6;33880:14;33873:22;33865:6;33861:35;33856:3;33852:45;33845:52;;33741:166;;33916:341;33983:38;34015:5;33983:38;:::i;:::-;34043:1;34057:154;34071:6;34068:1;34065:13;34057:154;;;34145:7;34139:14;34135:1;34130:3;34126:11;34119:35;34195:1;34186:7;34182:15;34171:26;;34093:4;34090:1;34086:12;34081:17;;34057:154;;;34240:6;34235:3;34231:16;34224:23;;33923:334;;33708:549;;33496:767;;33389:874;;;;:::o;34269:589::-;34494:3;34516:95;34607:3;34598:6;34516:95;:::i;:::-;34509:102;;34628:95;34719:3;34710:6;34628:95;:::i;:::-;34621:102;;34740:92;34828:3;34819:6;34740:92;:::i;:::-;34733:99;;34849:3;34842:10;;34269:589;;;;;;:::o;34864:170::-;35004:22;35000:1;34992:6;34988:14;34981:46;34864:170;:::o;35040:366::-;35182:3;35203:67;35267:2;35262:3;35203:67;:::i;:::-;35196:74;;35279:93;35368:3;35279:93;:::i;:::-;35397:2;35392:3;35388:12;35381:19;;35040:366;;;:::o;35412:419::-;35578:4;35616:2;35605:9;35601:18;35593:26;;35665:9;35659:4;35655:20;35651:1;35640:9;35636:17;35629:47;35693:131;35819:4;35693:131;:::i;:::-;35685:139;;35412:419;;;:::o;35837:170::-;35977:22;35973:1;35965:6;35961:14;35954:46;35837:170;:::o;36013:366::-;36155:3;36176:67;36240:2;36235:3;36176:67;:::i;:::-;36169:74;;36252:93;36341:3;36252:93;:::i;:::-;36370:2;36365:3;36361:12;36354:19;;36013:366;;;:::o;36385:419::-;36551:4;36589:2;36578:9;36574:18;36566:26;;36638:9;36632:4;36628:20;36624:1;36613:9;36609:17;36602:47;36666:131;36792:4;36666:131;:::i;:::-;36658:139;;36385:419;;;:::o;36810:169::-;36950:21;36946:1;36938:6;36934:14;36927:45;36810:169;:::o;36985:366::-;37127:3;37148:67;37212:2;37207:3;37148:67;:::i;:::-;37141:74;;37224:93;37313:3;37224:93;:::i;:::-;37342:2;37337:3;37333:12;37326:19;;36985:366;;;:::o;37357:419::-;37523:4;37561:2;37550:9;37546:18;37538:26;;37610:9;37604:4;37600:20;37596:1;37585:9;37581:17;37574:47;37638:131;37764:4;37638:131;:::i;:::-;37630:139;;37357:419;;;:::o;37782:221::-;37922:34;37918:1;37910:6;37906:14;37899:58;37991:4;37986:2;37978:6;37974:15;37967:29;37782:221;:::o;38009:366::-;38151:3;38172:67;38236:2;38231:3;38172:67;:::i;:::-;38165:74;;38248:93;38337:3;38248:93;:::i;:::-;38366:2;38361:3;38357:12;38350:19;;38009:366;;;:::o;38381:419::-;38547:4;38585:2;38574:9;38570:18;38562:26;;38634:9;38628:4;38624:20;38620:1;38609:9;38605:17;38598:47;38662:131;38788:4;38662:131;:::i;:::-;38654:139;;38381:419;;;:::o;38806:174::-;38946:26;38942:1;38934:6;38930:14;38923:50;38806:174;:::o;38986:366::-;39128:3;39149:67;39213:2;39208:3;39149:67;:::i;:::-;39142:74;;39225:93;39314:3;39225:93;:::i;:::-;39343:2;39338:3;39334:12;39327:19;;38986:366;;;:::o;39358:419::-;39524:4;39562:2;39551:9;39547:18;39539:26;;39611:9;39605:4;39601:20;39597:1;39586:9;39582:17;39575:47;39639:131;39765:4;39639:131;:::i;:::-;39631:139;;39358:419;;;:::o;39783:94::-;39816:8;39864:5;39860:2;39856:14;39835:35;;39783:94;;;:::o;39883:::-;39922:7;39951:20;39965:5;39951:20;:::i;:::-;39940:31;;39883:94;;;:::o;39983:100::-;40022:7;40051:26;40071:5;40051:26;:::i;:::-;40040:37;;39983:100;;;:::o;40089:157::-;40194:45;40214:24;40232:5;40214:24;:::i;:::-;40194:45;:::i;:::-;40189:3;40182:58;40089:157;;:::o;40252:256::-;40364:3;40379:75;40450:3;40441:6;40379:75;:::i;:::-;40479:2;40474:3;40470:12;40463:19;;40499:3;40492:10;;40252:256;;;;:::o;40514:164::-;40654:16;40650:1;40642:6;40638:14;40631:40;40514:164;:::o;40684:366::-;40826:3;40847:67;40911:2;40906:3;40847:67;:::i;:::-;40840:74;;40923:93;41012:3;40923:93;:::i;:::-;41041:2;41036:3;41032:12;41025:19;;40684:366;;;:::o;41056:419::-;41222:4;41260:2;41249:9;41245:18;41237:26;;41309:9;41303:4;41299:20;41295:1;41284:9;41280:17;41273:47;41337:131;41463:4;41337:131;:::i;:::-;41329:139;;41056:419;;;:::o;41481:225::-;41621:34;41617:1;41609:6;41605:14;41598:58;41690:8;41685:2;41677:6;41673:15;41666:33;41481:225;:::o;41712:366::-;41854:3;41875:67;41939:2;41934:3;41875:67;:::i;:::-;41868:74;;41951:93;42040:3;41951:93;:::i;:::-;42069:2;42064:3;42060:12;42053:19;;41712:366;;;:::o;42084:419::-;42250:4;42288:2;42277:9;42273:18;42265:26;;42337:9;42331:4;42327:20;42323:1;42312:9;42308:17;42301:47;42365:131;42491:4;42365:131;:::i;:::-;42357:139;;42084:419;;;:::o;42509:98::-;42560:6;42594:5;42588:12;42578:22;;42509:98;;;:::o;42613:168::-;42696:11;42730:6;42725:3;42718:19;42770:4;42765:3;42761:14;42746:29;;42613:168;;;;:::o;42787:373::-;42873:3;42901:38;42933:5;42901:38;:::i;:::-;42955:70;43018:6;43013:3;42955:70;:::i;:::-;42948:77;;43034:65;43092:6;43087:3;43080:4;43073:5;43069:16;43034:65;:::i;:::-;43124:29;43146:6;43124:29;:::i;:::-;43119:3;43115:39;43108:46;;42877:283;42787:373;;;;:::o;43166:640::-;43361:4;43399:3;43388:9;43384:19;43376:27;;43413:71;43481:1;43470:9;43466:17;43457:6;43413:71;:::i;:::-;43494:72;43562:2;43551:9;43547:18;43538:6;43494:72;:::i;:::-;43576;43644:2;43633:9;43629:18;43620:6;43576:72;:::i;:::-;43695:9;43689:4;43685:20;43680:2;43669:9;43665:18;43658:48;43723:76;43794:4;43785:6;43723:76;:::i;:::-;43715:84;;43166:640;;;;;;;:::o;43812:141::-;43868:5;43899:6;43893:13;43884:22;;43915:32;43941:5;43915:32;:::i;:::-;43812:141;;;;:::o;43959:349::-;44028:6;44077:2;44065:9;44056:7;44052:23;44048:32;44045:119;;;44083:79;;:::i;:::-;44045:119;44203:1;44228:63;44283:7;44274:6;44263:9;44259:22;44228:63;:::i;:::-;44218:73;;44174:127;43959:349;;;;:::o;44314:180::-;44362:77;44359:1;44352:88;44459:4;44456:1;44449:15;44483:4;44480:1;44473:15;44500:185;44540:1;44557:20;44575:1;44557:20;:::i;:::-;44552:25;;44591:20;44609:1;44591:20;:::i;:::-;44586:25;;44630:1;44620:35;;44635:18;;:::i;:::-;44620:35;44677:1;44674;44670:9;44665:14;;44500:185;;;;:::o;44691:176::-;44723:1;44740:20;44758:1;44740:20;:::i;:::-;44735:25;;44774:20;44792:1;44774:20;:::i;:::-;44769:25;;44813:1;44803:35;;44818:18;;:::i;:::-;44803:35;44859:1;44856;44852:9;44847:14;;44691:176;;;;:::o

Swarm Source

ipfs://325fa48717681a5c8247ff9a5d54382a93bcfc0be041a4dd1d9f94a86fc25918
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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