ETH Price: $3,365.50 (-3.48%)

Token

LouxBears (LouxBears)
 

Overview

Max Total Supply

3,333 LouxBears

Holders

1,493

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 LouxBears
0x995052e756d2ca19c9a9750db3520a485cf80c8a
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:
LouxBears

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT


// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// 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/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/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: contracts/TwistedToonz.sol


// Creator: Chiru Labs

pragma solidity ^0.8.0;









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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

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

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

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert("ERC721A: unable to get token of owner by index");
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), "ERC721A: number minted query for the zero address");
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * 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) {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }

    /**
     * @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) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), "ERC721A: approve to caller");

        _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 override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: transfer to non ERC721Receiver implementer"
        );
    }

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

    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;
        require(to != address(0), "ERC721A: mint to the zero address");
        require(quantity != 0, "ERC721A: quantity must be greater than 0");

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        "ERC721A: transfer to non ERC721Receiver implementer"
                    );
                }

                updatedIndex++;
            }

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

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved");

        require(prevOwnership.addr == from, "ERC721A: transfer from incorrect owner");
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

contract LouxBears is ERC721A, Ownable, ReentrancyGuard {

  string public        baseURI           = "ipfs://QmR8EXNuagtThTFTMurqkb2LttDY7mZFpurBgMPkJc6J1w/";
  uint public          price             = 0.01 ether;
  uint public          maxPerTx          = 25;
  uint public          maxSupply         = 3333;
  

  constructor() ERC721A("LouxBears", "LouxBears"){_safeMint(msg.sender,333);}

  function mint(uint256 amount) external payable
  {
    require(amount>0,"amount has to be greater than 0");
    require(msg.sender == tx.origin,"Smart Contracts cant mint.");
    require(totalSupply() + amount <= maxSupply,"No more bears");
    require(amount <= maxPerTx, "Max per TX reached.");
    uint256 numberMintedSum = numberMinted(msg.sender);
    uint256 discount = 0;
    for(uint256 i = numberMintedSum; i < 2; i++) discount++;

    uint256 cost = (amount * price) - (discount == 0 ? 0 ether : (discount*price));
    if(cost<0) cost = 0;
    require(msg.value >= cost,"Not enough funds");

    _safeMint(msg.sender, amount);
  }
  
  //Team will mint 333 for collabs, giveaways.
  function ownerBatchMint(uint256 amount) external onlyOwner
  {
    require(totalSupply() + amount <= maxSupply,"too many!");

    _safeMint(msg.sender, amount);
  }

  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }

  function setBaseURI(string calldata baseURI_) external onlyOwner {
    baseURI = baseURI_;
  }

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

  function withdraw() external onlyOwner nonReentrant {
    uint share = address(this).balance * 25 / 100;


    (bool Xmre, ) = payable(0x7023AaCa1eF198927de04aa757Cfc48E9273b13D).call{value: share*2}("");
    require(Xmre, "Failed");

    (bool Syken, ) = payable(0x4149967A52fED4c4E1Ea51239a449cBf7D256D67).call{value: share}("");
    require(Syken, "Failed");

    (bool Hasselmann, ) = payable(0x5a2664Fe94227d01FC5581208618633d9fDf3eDF).call{value: share}("");
    require(Hasselmann, "Failed");

  }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180606001604052806036815260200162005287603691396009908051906020019062000035929190620007d5565b50662386f26fc10000600a556019600b55610d05600c553480156200005957600080fd5b506040518060400160405280600981526020017f4c6f7578426561727300000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f4c6f7578426561727300000000000000000000000000000000000000000000008152508160019080519060200190620000de929190620007d5565b508060029080519060200190620000f7929190620007d5565b5050506200011a6200010e6200013c60201b60201c565b6200014460201b60201c565b6001600881905550620001363361014d6200020a60201b60201c565b62000caf565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200022c8282604051806020016040528060008152506200023060201b60201c565b5050565b6200024583838360016200024a60201b60201c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415620002c3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002ba9062000a1c565b60405180910390fd5b60008414156200030a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003019062000a3e565b60405180910390fd5b6200031f6000868387620005ec60201b60201c565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015620005c757818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315620005b1576200056e6000888488620005f260201b60201c565b620005b0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005a790620009fa565b60405180910390fd5b5b81806001019250508080600101915050620004ed565b508060008190555050620005e56000868387620007ac60201b60201c565b5050505050565b50505050565b6000620006208473ffffffffffffffffffffffffffffffffffffffff16620007b260201b62001aa21760201c565b156200079f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006526200013c60201b60201c565b8786866040518563ffffffff1660e01b8152600401620006769493929190620009a6565b602060405180830381600087803b1580156200069157600080fd5b505af1925050508015620006c557506040513d601f19601f82011682018060405250810190620006c291906200089c565b60015b6200074e573d8060008114620006f8576040519150601f19603f3d011682016040523d82523d6000602084013e620006fd565b606091505b5060008151141562000746576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200073d90620009fa565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620007a4565b600190505b949350505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054620007e39062000b2d565b90600052602060002090601f01602090048101928262000807576000855562000853565b82601f106200082257805160ff191683800117855562000853565b8280016001018555821562000853579182015b828111156200085257825182559160200191906001019062000835565b5b50905062000862919062000866565b5090565b5b808211156200088157600081600090555060010162000867565b5090565b600081519050620008968162000c95565b92915050565b600060208284031215620008b557620008b462000b92565b5b6000620008c58482850162000885565b91505092915050565b620008d98162000a8d565b82525050565b6000620008ec8262000a60565b620008f8818562000a6b565b93506200090a81856020860162000af7565b620009158162000b97565b840191505092915050565b60006200092f60338362000a7c565b91506200093c8262000ba8565b604082019050919050565b60006200095660218362000a7c565b9150620009638262000bf7565b604082019050919050565b60006200097d60288362000a7c565b91506200098a8262000c46565b604082019050919050565b620009a08162000aed565b82525050565b6000608082019050620009bd6000830187620008ce565b620009cc6020830186620008ce565b620009db604083018562000995565b8181036060830152620009ef8184620008df565b905095945050505050565b6000602082019050818103600083015262000a158162000920565b9050919050565b6000602082019050818103600083015262000a378162000947565b9050919050565b6000602082019050818103600083015262000a59816200096e565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000a9a8262000acd565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000b1757808201518184015260208101905062000afa565b8381111562000b27576000848401525b50505050565b6000600282049050600182168062000b4657607f821691505b6020821081141562000b5d5762000b5c62000b63565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b62000ca08162000aa1565b811462000cac57600080fd5b50565b6145c88062000cbf6000396000f3fe6080604052600436106101b75760003560e01c8063715018a6116100ec578063b88d4fde1161008a578063dc33e68111610064578063dc33e681146105fd578063e985e9c51461063a578063f2fde38b14610677578063f968adbe146106a0576101b7565b8063b88d4fde1461056c578063c87b56dd14610595578063d5abeb01146105d2576101b7565b806395d89b41116100c657806395d89b41146104d1578063a035b1fe146104fc578063a0712d6814610527578063a22cb46514610543576101b7565b8063715018a6146104665780638da5cb5b1461047d5780638db89f07146104a8576101b7565b80633ccfd60b1161015957806355f804b31161013357806355f804b3146103985780636352211e146103c15780636c0360eb146103fe57806370a0823114610429576101b7565b80633ccfd60b1461031b57806342842e0e146103325780634f6ccce71461035b576101b7565b8063095ea7b311610195578063095ea7b31461026157806318160ddd1461028a57806323b872dd146102b55780632f745c59146102de576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612f92565b6106cb565b6040516101f091906135cd565b60405180910390f35b34801561020557600080fd5b5061020e610815565b60405161021b91906135e8565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190613039565b6108a7565b6040516102589190613566565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612f52565b61092c565b005b34801561029657600080fd5b5061029f610a45565b6040516102ac919061398a565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190612e3c565b610a4e565b005b3480156102ea57600080fd5b5061030560048036038101906103009190612f52565b610a5e565b604051610312919061398a565b60405180910390f35b34801561032757600080fd5b50610330610c50565b005b34801561033e57600080fd5b5061035960048036038101906103549190612e3c565b610f91565b005b34801561036757600080fd5b50610382600480360381019061037d9190613039565b610fb1565b60405161038f919061398a565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190612fec565b611004565b005b3480156103cd57600080fd5b506103e860048036038101906103e39190613039565b611096565b6040516103f59190613566565b60405180910390f35b34801561040a57600080fd5b506104136110ac565b60405161042091906135e8565b60405180910390f35b34801561043557600080fd5b50610450600480360381019061044b9190612dcf565b61113a565b60405161045d919061398a565b60405180910390f35b34801561047257600080fd5b5061047b611223565b005b34801561048957600080fd5b506104926112ab565b60405161049f9190613566565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca9190613039565b6112d5565b005b3480156104dd57600080fd5b506104e66113b5565b6040516104f391906135e8565b60405180910390f35b34801561050857600080fd5b50610511611447565b60405161051e919061398a565b60405180910390f35b610541600480360381019061053c9190613039565b61144d565b005b34801561054f57600080fd5b5061056a60048036038101906105659190612f12565b611673565b005b34801561057857600080fd5b50610593600480360381019061058e9190612e8f565b6117f4565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190613039565b611850565b6040516105c991906135e8565b60405180910390f35b3480156105de57600080fd5b506105e76118f8565b6040516105f4919061398a565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190612dcf565b6118fe565b604051610631919061398a565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c9190612dfc565b611910565b60405161066e91906135cd565b60405180910390f35b34801561068357600080fd5b5061069e60048036038101906106999190612dcf565b6119a4565b005b3480156106ac57600080fd5b506106b5611a9c565b6040516106c2919061398a565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061079657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107fe57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061080e575061080d82611ac5565b5b9050919050565b60606001805461082490613c14565b80601f016020809104026020016040519081016040528092919081815260200182805461085090613c14565b801561089d5780601f106108725761010080835404028352916020019161089d565b820191906000526020600020905b81548152906001019060200180831161088057829003601f168201915b5050505050905090565b60006108b282611b2f565b6108f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e89061396a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093782611096565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099f9061384a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109c7611b3c565b73ffffffffffffffffffffffffffffffffffffffff1614806109f657506109f5816109f0611b3c565b611910565b5b610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c9061374a565b60405180910390fd5b610a40838383611b44565b505050565b60008054905090565b610a59838383611bf6565b505050565b6000610a698361113a565b8210610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa19061360a565b60405180910390fd5b6000610ab4610a45565b905060008060005b83811015610c0e576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610bae57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c005786841415610bf7578195505050505050610c4a565b83806001019450505b508080600101915050610abc565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c41906138ea565b60405180910390fd5b92915050565b610c58611b3c565b73ffffffffffffffffffffffffffffffffffffffff16610c766112ab565b73ffffffffffffffffffffffffffffffffffffffff1614610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc3906137ca565b60405180910390fd5b60026008541415610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d099061390a565b60405180910390fd5b600260088190555060006064601947610d2b9190613ad0565b610d359190613a9f565b90506000737023aaca1ef198927de04aa757cfc48e9273b13d73ffffffffffffffffffffffffffffffffffffffff16600283610d719190613ad0565b604051610d7d90613551565b60006040518083038185875af1925050503d8060008114610dba576040519150601f19603f3d011682016040523d82523d6000602084013e610dbf565b606091505b5050905080610e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfa9061366a565b60405180910390fd5b6000734149967a52fed4c4e1ea51239a449cbf7d256d6773ffffffffffffffffffffffffffffffffffffffff1683604051610e3d90613551565b60006040518083038185875af1925050503d8060008114610e7a576040519150601f19603f3d011682016040523d82523d6000602084013e610e7f565b606091505b5050905080610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba9061366a565b60405180910390fd5b6000735a2664fe94227d01fc5581208618633d9fdf3edf73ffffffffffffffffffffffffffffffffffffffff1684604051610efd90613551565b60006040518083038185875af1925050503d8060008114610f3a576040519150601f19603f3d011682016040523d82523d6000602084013e610f3f565b606091505b5050905080610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a9061366a565b60405180910390fd5b505050506001600881905550565b610fac838383604051806020016040528060008152506117f4565b505050565b6000610fbb610a45565b8210610ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff3906136aa565b60405180910390fd5b819050919050565b61100c611b3c565b73ffffffffffffffffffffffffffffffffffffffff1661102a6112ab565b73ffffffffffffffffffffffffffffffffffffffff1614611080576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611077906137ca565b60405180910390fd5b818160099190611091929190612bc3565b505050565b60006110a182612136565b600001519050919050565b600980546110b990613c14565b80601f01602080910402602001604051908101604052809291908181526020018280546110e590613c14565b80156111325780601f1061110757610100808354040283529160200191611132565b820191906000526020600020905b81548152906001019060200180831161111557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a29061376a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61122b611b3c565b73ffffffffffffffffffffffffffffffffffffffff166112496112ab565b73ffffffffffffffffffffffffffffffffffffffff161461129f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611296906137ca565b60405180910390fd5b6112a960006122d0565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112dd611b3c565b73ffffffffffffffffffffffffffffffffffffffff166112fb6112ab565b73ffffffffffffffffffffffffffffffffffffffff1614611351576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611348906137ca565b60405180910390fd5b600c548161135d610a45565b6113679190613a49565b11156113a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139f9061372a565b60405180910390fd5b6113b23382612396565b50565b6060600280546113c490613c14565b80601f01602080910402602001604051908101604052809291908181526020018280546113f090613c14565b801561143d5780601f106114125761010080835404028352916020019161143d565b820191906000526020600020905b81548152906001019060200180831161142057829003601f168201915b5050505050905090565b600a5481565b60008111611490576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611487906137aa565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f59061394a565b60405180910390fd5b600c548161150a610a45565b6115149190613a49565b1115611555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154c9061370a565b60405180910390fd5b600b5481111561159a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611591906138ca565b60405180910390fd5b60006115a5336118fe565b90506000808290505b60028110156115d85781806115c290613c77565b92505080806115d090613c77565b9150506115ae565b5060008082146115f557600a54826115f09190613ad0565b6115f8565b60005b600a54856116069190613ad0565b6116109190613b2a565b9050600081101561162057600090505b80341015611663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165a9061368a565b60405180910390fd5b61166d3385612396565b50505050565b61167b611b3c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e09061380a565b60405180910390fd5b80600660006116f6611b3c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117a3611b3c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117e891906135cd565b60405180910390a35050565b6117ff848484611bf6565b61180b848484846123b4565b61184a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118419061386a565b60405180910390fd5b50505050565b606061185b82611b2f565b61189a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611891906137ea565b60405180910390fd5b60006118a461254b565b90506000815114156118c557604051806020016040528060008152506118f0565b806118cf846125dd565b6040516020016118e092919061352d565b6040516020818303038152906040525b915050919050565b600c5481565b60006119098261273e565b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119ac611b3c565b73ffffffffffffffffffffffffffffffffffffffff166119ca6112ab565b73ffffffffffffffffffffffffffffffffffffffff1614611a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a17906137ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a879061362a565b60405180910390fd5b611a99816122d0565b50565b600b5481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611c0182612136565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611c28611b3c565b73ffffffffffffffffffffffffffffffffffffffff161480611c845750611c4d611b3c565b73ffffffffffffffffffffffffffffffffffffffff16611c6c846108a7565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ca05750611c9f8260000151611c9a611b3c565b611910565b5b905080611ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd99061382a565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4b9061378a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbb906136ca565b60405180910390fd5b611dd18585856001612827565b611de16000848460000151611b44565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156120c65761202581611b2f565b156120c55782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461212f858585600161282d565b5050505050565b61213e612c49565b61214782611b2f565b612186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217d9061364a565b60405180910390fd5b60008290505b6000811061228f576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122805780925050506122cb565b5080806001900391505061218c565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c29061392a565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123b0828260405180602001604052806000815250612833565b5050565b60006123d58473ffffffffffffffffffffffffffffffffffffffff16611aa2565b1561253e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123fe611b3c565b8786866040518563ffffffff1660e01b81526004016124209493929190613581565b602060405180830381600087803b15801561243a57600080fd5b505af192505050801561246b57506040513d601f19601f820116820180604052508101906124689190612fbf565b60015b6124ee573d806000811461249b576040519150601f19603f3d011682016040523d82523d6000602084013e6124a0565b606091505b506000815114156124e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dd9061386a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612543565b600190505b949350505050565b60606009805461255a90613c14565b80601f016020809104026020016040519081016040528092919081815260200182805461258690613c14565b80156125d35780601f106125a8576101008083540402835291602001916125d3565b820191906000526020600020905b8154815290600101906020018083116125b657829003601f168201915b5050505050905090565b60606000821415612625576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612739565b600082905060005b6000821461265757808061264090613c77565b915050600a826126509190613a9f565b915061262d565b60008167ffffffffffffffff81111561267357612672613dad565b5b6040519080825280601f01601f1916602001820160405280156126a55781602001600182028036833780820191505090505b5090505b60008514612732576001826126be9190613b2a565b9150600a856126cd9190613cc0565b60306126d99190613a49565b60f81b8183815181106126ef576126ee613d7e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561272b9190613a9f565b94506126a9565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a6906136ea565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b6128408383836001612845565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156128bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b29061388a565b60405180910390fd5b60008414156128ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f6906138aa565b60405180910390fd5b61290c6000868387612827565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612ba657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612b9157612b5160008884886123b4565b612b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b879061386a565b60405180910390fd5b5b81806001019250508080600101915050612ada565b508060008190555050612bbc600086838761282d565b5050505050565b828054612bcf90613c14565b90600052602060002090601f016020900481019282612bf15760008555612c38565b82601f10612c0a57803560ff1916838001178555612c38565b82800160010185558215612c38579182015b82811115612c37578235825591602001919060010190612c1c565b5b509050612c459190612c83565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612c9c576000816000905550600101612c84565b5090565b6000612cb3612cae846139ca565b6139a5565b905082815260208101848484011115612ccf57612cce613deb565b5b612cda848285613bd2565b509392505050565b600081359050612cf181614536565b92915050565b600081359050612d068161454d565b92915050565b600081359050612d1b81614564565b92915050565b600081519050612d3081614564565b92915050565b600082601f830112612d4b57612d4a613de1565b5b8135612d5b848260208601612ca0565b91505092915050565b60008083601f840112612d7a57612d79613de1565b5b8235905067ffffffffffffffff811115612d9757612d96613ddc565b5b602083019150836001820283011115612db357612db2613de6565b5b9250929050565b600081359050612dc98161457b565b92915050565b600060208284031215612de557612de4613df5565b5b6000612df384828501612ce2565b91505092915050565b60008060408385031215612e1357612e12613df5565b5b6000612e2185828601612ce2565b9250506020612e3285828601612ce2565b9150509250929050565b600080600060608486031215612e5557612e54613df5565b5b6000612e6386828701612ce2565b9350506020612e7486828701612ce2565b9250506040612e8586828701612dba565b9150509250925092565b60008060008060808587031215612ea957612ea8613df5565b5b6000612eb787828801612ce2565b9450506020612ec887828801612ce2565b9350506040612ed987828801612dba565b925050606085013567ffffffffffffffff811115612efa57612ef9613df0565b5b612f0687828801612d36565b91505092959194509250565b60008060408385031215612f2957612f28613df5565b5b6000612f3785828601612ce2565b9250506020612f4885828601612cf7565b9150509250929050565b60008060408385031215612f6957612f68613df5565b5b6000612f7785828601612ce2565b9250506020612f8885828601612dba565b9150509250929050565b600060208284031215612fa857612fa7613df5565b5b6000612fb684828501612d0c565b91505092915050565b600060208284031215612fd557612fd4613df5565b5b6000612fe384828501612d21565b91505092915050565b6000806020838503121561300357613002613df5565b5b600083013567ffffffffffffffff81111561302157613020613df0565b5b61302d85828601612d64565b92509250509250929050565b60006020828403121561304f5761304e613df5565b5b600061305d84828501612dba565b91505092915050565b61306f81613b5e565b82525050565b61307e81613b70565b82525050565b600061308f826139fb565b6130998185613a11565b93506130a9818560208601613be1565b6130b281613dfa565b840191505092915050565b60006130c882613a06565b6130d28185613a2d565b93506130e2818560208601613be1565b6130eb81613dfa565b840191505092915050565b600061310182613a06565b61310b8185613a3e565b935061311b818560208601613be1565b80840191505092915050565b6000613134602283613a2d565b915061313f82613e0b565b604082019050919050565b6000613157602683613a2d565b915061316282613e5a565b604082019050919050565b600061317a602a83613a2d565b915061318582613ea9565b604082019050919050565b600061319d600683613a2d565b91506131a882613ef8565b602082019050919050565b60006131c0601083613a2d565b91506131cb82613f21565b602082019050919050565b60006131e3602383613a2d565b91506131ee82613f4a565b604082019050919050565b6000613206602583613a2d565b915061321182613f99565b604082019050919050565b6000613229603183613a2d565b915061323482613fe8565b604082019050919050565b600061324c600d83613a2d565b915061325782614037565b602082019050919050565b600061326f600983613a2d565b915061327a82614060565b602082019050919050565b6000613292603983613a2d565b915061329d82614089565b604082019050919050565b60006132b5602b83613a2d565b91506132c0826140d8565b604082019050919050565b60006132d8602683613a2d565b91506132e382614127565b604082019050919050565b60006132fb601f83613a2d565b915061330682614176565b602082019050919050565b600061331e602083613a2d565b91506133298261419f565b602082019050919050565b6000613341602f83613a2d565b915061334c826141c8565b604082019050919050565b6000613364601a83613a2d565b915061336f82614217565b602082019050919050565b6000613387603283613a2d565b915061339282614240565b604082019050919050565b60006133aa602283613a2d565b91506133b58261428f565b604082019050919050565b60006133cd600083613a22565b91506133d8826142de565b600082019050919050565b60006133f0603383613a2d565b91506133fb826142e1565b604082019050919050565b6000613413602183613a2d565b915061341e82614330565b604082019050919050565b6000613436602883613a2d565b91506134418261437f565b604082019050919050565b6000613459601383613a2d565b9150613464826143ce565b602082019050919050565b600061347c602e83613a2d565b9150613487826143f7565b604082019050919050565b600061349f601f83613a2d565b91506134aa82614446565b602082019050919050565b60006134c2602f83613a2d565b91506134cd8261446f565b604082019050919050565b60006134e5601a83613a2d565b91506134f0826144be565b602082019050919050565b6000613508602d83613a2d565b9150613513826144e7565b604082019050919050565b61352781613bc8565b82525050565b600061353982856130f6565b915061354582846130f6565b91508190509392505050565b600061355c826133c0565b9150819050919050565b600060208201905061357b6000830184613066565b92915050565b60006080820190506135966000830187613066565b6135a36020830186613066565b6135b0604083018561351e565b81810360608301526135c28184613084565b905095945050505050565b60006020820190506135e26000830184613075565b92915050565b6000602082019050818103600083015261360281846130bd565b905092915050565b6000602082019050818103600083015261362381613127565b9050919050565b600060208201905081810360008301526136438161314a565b9050919050565b600060208201905081810360008301526136638161316d565b9050919050565b6000602082019050818103600083015261368381613190565b9050919050565b600060208201905081810360008301526136a3816131b3565b9050919050565b600060208201905081810360008301526136c3816131d6565b9050919050565b600060208201905081810360008301526136e3816131f9565b9050919050565b600060208201905081810360008301526137038161321c565b9050919050565b600060208201905081810360008301526137238161323f565b9050919050565b6000602082019050818103600083015261374381613262565b9050919050565b6000602082019050818103600083015261376381613285565b9050919050565b60006020820190508181036000830152613783816132a8565b9050919050565b600060208201905081810360008301526137a3816132cb565b9050919050565b600060208201905081810360008301526137c3816132ee565b9050919050565b600060208201905081810360008301526137e381613311565b9050919050565b6000602082019050818103600083015261380381613334565b9050919050565b6000602082019050818103600083015261382381613357565b9050919050565b600060208201905081810360008301526138438161337a565b9050919050565b600060208201905081810360008301526138638161339d565b9050919050565b60006020820190508181036000830152613883816133e3565b9050919050565b600060208201905081810360008301526138a381613406565b9050919050565b600060208201905081810360008301526138c381613429565b9050919050565b600060208201905081810360008301526138e38161344c565b9050919050565b600060208201905081810360008301526139038161346f565b9050919050565b6000602082019050818103600083015261392381613492565b9050919050565b60006020820190508181036000830152613943816134b5565b9050919050565b60006020820190508181036000830152613963816134d8565b9050919050565b60006020820190508181036000830152613983816134fb565b9050919050565b600060208201905061399f600083018461351e565b92915050565b60006139af6139c0565b90506139bb8282613c46565b919050565b6000604051905090565b600067ffffffffffffffff8211156139e5576139e4613dad565b5b6139ee82613dfa565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a5482613bc8565b9150613a5f83613bc8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a9457613a93613cf1565b5b828201905092915050565b6000613aaa82613bc8565b9150613ab583613bc8565b925082613ac557613ac4613d20565b5b828204905092915050565b6000613adb82613bc8565b9150613ae683613bc8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b1f57613b1e613cf1565b5b828202905092915050565b6000613b3582613bc8565b9150613b4083613bc8565b925082821015613b5357613b52613cf1565b5b828203905092915050565b6000613b6982613ba8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613bff578082015181840152602081019050613be4565b83811115613c0e576000848401525b50505050565b60006002820490506001821680613c2c57607f821691505b60208210811415613c4057613c3f613d4f565b5b50919050565b613c4f82613dfa565b810181811067ffffffffffffffff82111715613c6e57613c6d613dad565b5b80604052505050565b6000613c8282613bc8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cb557613cb4613cf1565b5b600182019050919050565b6000613ccb82613bc8565b9150613cd683613bc8565b925082613ce657613ce5613d20565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4661696c65640000000000000000000000000000000000000000000000000000600082015250565b7f4e6f7420656e6f7567682066756e647300000000000000000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f4e6f206d6f726520626561727300000000000000000000000000000000000000600082015250565b7f746f6f206d616e79210000000000000000000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f616d6f756e742068617320746f2062652067726561746572207468616e203000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f536d61727420436f6e7472616374732063616e74206d696e742e000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b61453f81613b5e565b811461454a57600080fd5b50565b61455681613b70565b811461456157600080fd5b50565b61456d81613b7c565b811461457857600080fd5b50565b61458481613bc8565b811461458f57600080fd5b5056fea2646970667358221220bee4665af11b87482a87e45253cef585027847c7ba5f0a20fc21e9dba99c91f564736f6c63430008070033697066733a2f2f516d523845584e7561677454685446544d7572716b62324c74744459376d5a4670757242674d506b4a63364a31772f

Deployed Bytecode

0x6080604052600436106101b75760003560e01c8063715018a6116100ec578063b88d4fde1161008a578063dc33e68111610064578063dc33e681146105fd578063e985e9c51461063a578063f2fde38b14610677578063f968adbe146106a0576101b7565b8063b88d4fde1461056c578063c87b56dd14610595578063d5abeb01146105d2576101b7565b806395d89b41116100c657806395d89b41146104d1578063a035b1fe146104fc578063a0712d6814610527578063a22cb46514610543576101b7565b8063715018a6146104665780638da5cb5b1461047d5780638db89f07146104a8576101b7565b80633ccfd60b1161015957806355f804b31161013357806355f804b3146103985780636352211e146103c15780636c0360eb146103fe57806370a0823114610429576101b7565b80633ccfd60b1461031b57806342842e0e146103325780634f6ccce71461035b576101b7565b8063095ea7b311610195578063095ea7b31461026157806318160ddd1461028a57806323b872dd146102b55780632f745c59146102de576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612f92565b6106cb565b6040516101f091906135cd565b60405180910390f35b34801561020557600080fd5b5061020e610815565b60405161021b91906135e8565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190613039565b6108a7565b6040516102589190613566565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612f52565b61092c565b005b34801561029657600080fd5b5061029f610a45565b6040516102ac919061398a565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190612e3c565b610a4e565b005b3480156102ea57600080fd5b5061030560048036038101906103009190612f52565b610a5e565b604051610312919061398a565b60405180910390f35b34801561032757600080fd5b50610330610c50565b005b34801561033e57600080fd5b5061035960048036038101906103549190612e3c565b610f91565b005b34801561036757600080fd5b50610382600480360381019061037d9190613039565b610fb1565b60405161038f919061398a565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190612fec565b611004565b005b3480156103cd57600080fd5b506103e860048036038101906103e39190613039565b611096565b6040516103f59190613566565b60405180910390f35b34801561040a57600080fd5b506104136110ac565b60405161042091906135e8565b60405180910390f35b34801561043557600080fd5b50610450600480360381019061044b9190612dcf565b61113a565b60405161045d919061398a565b60405180910390f35b34801561047257600080fd5b5061047b611223565b005b34801561048957600080fd5b506104926112ab565b60405161049f9190613566565b60405180910390f35b3480156104b457600080fd5b506104cf60048036038101906104ca9190613039565b6112d5565b005b3480156104dd57600080fd5b506104e66113b5565b6040516104f391906135e8565b60405180910390f35b34801561050857600080fd5b50610511611447565b60405161051e919061398a565b60405180910390f35b610541600480360381019061053c9190613039565b61144d565b005b34801561054f57600080fd5b5061056a60048036038101906105659190612f12565b611673565b005b34801561057857600080fd5b50610593600480360381019061058e9190612e8f565b6117f4565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190613039565b611850565b6040516105c991906135e8565b60405180910390f35b3480156105de57600080fd5b506105e76118f8565b6040516105f4919061398a565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190612dcf565b6118fe565b604051610631919061398a565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c9190612dfc565b611910565b60405161066e91906135cd565b60405180910390f35b34801561068357600080fd5b5061069e60048036038101906106999190612dcf565b6119a4565b005b3480156106ac57600080fd5b506106b5611a9c565b6040516106c2919061398a565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061079657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107fe57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061080e575061080d82611ac5565b5b9050919050565b60606001805461082490613c14565b80601f016020809104026020016040519081016040528092919081815260200182805461085090613c14565b801561089d5780601f106108725761010080835404028352916020019161089d565b820191906000526020600020905b81548152906001019060200180831161088057829003601f168201915b5050505050905090565b60006108b282611b2f565b6108f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e89061396a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093782611096565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099f9061384a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109c7611b3c565b73ffffffffffffffffffffffffffffffffffffffff1614806109f657506109f5816109f0611b3c565b611910565b5b610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c9061374a565b60405180910390fd5b610a40838383611b44565b505050565b60008054905090565b610a59838383611bf6565b505050565b6000610a698361113a565b8210610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa19061360a565b60405180910390fd5b6000610ab4610a45565b905060008060005b83811015610c0e576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610bae57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c005786841415610bf7578195505050505050610c4a565b83806001019450505b508080600101915050610abc565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c41906138ea565b60405180910390fd5b92915050565b610c58611b3c565b73ffffffffffffffffffffffffffffffffffffffff16610c766112ab565b73ffffffffffffffffffffffffffffffffffffffff1614610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc3906137ca565b60405180910390fd5b60026008541415610d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d099061390a565b60405180910390fd5b600260088190555060006064601947610d2b9190613ad0565b610d359190613a9f565b90506000737023aaca1ef198927de04aa757cfc48e9273b13d73ffffffffffffffffffffffffffffffffffffffff16600283610d719190613ad0565b604051610d7d90613551565b60006040518083038185875af1925050503d8060008114610dba576040519150601f19603f3d011682016040523d82523d6000602084013e610dbf565b606091505b5050905080610e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfa9061366a565b60405180910390fd5b6000734149967a52fed4c4e1ea51239a449cbf7d256d6773ffffffffffffffffffffffffffffffffffffffff1683604051610e3d90613551565b60006040518083038185875af1925050503d8060008114610e7a576040519150601f19603f3d011682016040523d82523d6000602084013e610e7f565b606091505b5050905080610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba9061366a565b60405180910390fd5b6000735a2664fe94227d01fc5581208618633d9fdf3edf73ffffffffffffffffffffffffffffffffffffffff1684604051610efd90613551565b60006040518083038185875af1925050503d8060008114610f3a576040519150601f19603f3d011682016040523d82523d6000602084013e610f3f565b606091505b5050905080610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a9061366a565b60405180910390fd5b505050506001600881905550565b610fac838383604051806020016040528060008152506117f4565b505050565b6000610fbb610a45565b8210610ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff3906136aa565b60405180910390fd5b819050919050565b61100c611b3c565b73ffffffffffffffffffffffffffffffffffffffff1661102a6112ab565b73ffffffffffffffffffffffffffffffffffffffff1614611080576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611077906137ca565b60405180910390fd5b818160099190611091929190612bc3565b505050565b60006110a182612136565b600001519050919050565b600980546110b990613c14565b80601f01602080910402602001604051908101604052809291908181526020018280546110e590613c14565b80156111325780601f1061110757610100808354040283529160200191611132565b820191906000526020600020905b81548152906001019060200180831161111557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a29061376a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61122b611b3c565b73ffffffffffffffffffffffffffffffffffffffff166112496112ab565b73ffffffffffffffffffffffffffffffffffffffff161461129f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611296906137ca565b60405180910390fd5b6112a960006122d0565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112dd611b3c565b73ffffffffffffffffffffffffffffffffffffffff166112fb6112ab565b73ffffffffffffffffffffffffffffffffffffffff1614611351576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611348906137ca565b60405180910390fd5b600c548161135d610a45565b6113679190613a49565b11156113a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139f9061372a565b60405180910390fd5b6113b23382612396565b50565b6060600280546113c490613c14565b80601f01602080910402602001604051908101604052809291908181526020018280546113f090613c14565b801561143d5780601f106114125761010080835404028352916020019161143d565b820191906000526020600020905b81548152906001019060200180831161142057829003601f168201915b5050505050905090565b600a5481565b60008111611490576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611487906137aa565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f59061394a565b60405180910390fd5b600c548161150a610a45565b6115149190613a49565b1115611555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154c9061370a565b60405180910390fd5b600b5481111561159a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611591906138ca565b60405180910390fd5b60006115a5336118fe565b90506000808290505b60028110156115d85781806115c290613c77565b92505080806115d090613c77565b9150506115ae565b5060008082146115f557600a54826115f09190613ad0565b6115f8565b60005b600a54856116069190613ad0565b6116109190613b2a565b9050600081101561162057600090505b80341015611663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165a9061368a565b60405180910390fd5b61166d3385612396565b50505050565b61167b611b3c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e09061380a565b60405180910390fd5b80600660006116f6611b3c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117a3611b3c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117e891906135cd565b60405180910390a35050565b6117ff848484611bf6565b61180b848484846123b4565b61184a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118419061386a565b60405180910390fd5b50505050565b606061185b82611b2f565b61189a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611891906137ea565b60405180910390fd5b60006118a461254b565b90506000815114156118c557604051806020016040528060008152506118f0565b806118cf846125dd565b6040516020016118e092919061352d565b6040516020818303038152906040525b915050919050565b600c5481565b60006119098261273e565b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119ac611b3c565b73ffffffffffffffffffffffffffffffffffffffff166119ca6112ab565b73ffffffffffffffffffffffffffffffffffffffff1614611a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a17906137ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a879061362a565b60405180910390fd5b611a99816122d0565b50565b600b5481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611c0182612136565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611c28611b3c565b73ffffffffffffffffffffffffffffffffffffffff161480611c845750611c4d611b3c565b73ffffffffffffffffffffffffffffffffffffffff16611c6c846108a7565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ca05750611c9f8260000151611c9a611b3c565b611910565b5b905080611ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd99061382a565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4b9061378a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbb906136ca565b60405180910390fd5b611dd18585856001612827565b611de16000848460000151611b44565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156120c65761202581611b2f565b156120c55782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461212f858585600161282d565b5050505050565b61213e612c49565b61214782611b2f565b612186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217d9061364a565b60405180910390fd5b60008290505b6000811061228f576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122805780925050506122cb565b5080806001900391505061218c565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c29061392a565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123b0828260405180602001604052806000815250612833565b5050565b60006123d58473ffffffffffffffffffffffffffffffffffffffff16611aa2565b1561253e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123fe611b3c565b8786866040518563ffffffff1660e01b81526004016124209493929190613581565b602060405180830381600087803b15801561243a57600080fd5b505af192505050801561246b57506040513d601f19601f820116820180604052508101906124689190612fbf565b60015b6124ee573d806000811461249b576040519150601f19603f3d011682016040523d82523d6000602084013e6124a0565b606091505b506000815114156124e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dd9061386a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612543565b600190505b949350505050565b60606009805461255a90613c14565b80601f016020809104026020016040519081016040528092919081815260200182805461258690613c14565b80156125d35780601f106125a8576101008083540402835291602001916125d3565b820191906000526020600020905b8154815290600101906020018083116125b657829003601f168201915b5050505050905090565b60606000821415612625576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612739565b600082905060005b6000821461265757808061264090613c77565b915050600a826126509190613a9f565b915061262d565b60008167ffffffffffffffff81111561267357612672613dad565b5b6040519080825280601f01601f1916602001820160405280156126a55781602001600182028036833780820191505090505b5090505b60008514612732576001826126be9190613b2a565b9150600a856126cd9190613cc0565b60306126d99190613a49565b60f81b8183815181106126ef576126ee613d7e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561272b9190613a9f565b94506126a9565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a6906136ea565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b6128408383836001612845565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156128bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b29061388a565b60405180910390fd5b60008414156128ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f6906138aa565b60405180910390fd5b61290c6000868387612827565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612ba657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612b9157612b5160008884886123b4565b612b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b879061386a565b60405180910390fd5b5b81806001019250508080600101915050612ada565b508060008190555050612bbc600086838761282d565b5050505050565b828054612bcf90613c14565b90600052602060002090601f016020900481019282612bf15760008555612c38565b82601f10612c0a57803560ff1916838001178555612c38565b82800160010185558215612c38579182015b82811115612c37578235825591602001919060010190612c1c565b5b509050612c459190612c83565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612c9c576000816000905550600101612c84565b5090565b6000612cb3612cae846139ca565b6139a5565b905082815260208101848484011115612ccf57612cce613deb565b5b612cda848285613bd2565b509392505050565b600081359050612cf181614536565b92915050565b600081359050612d068161454d565b92915050565b600081359050612d1b81614564565b92915050565b600081519050612d3081614564565b92915050565b600082601f830112612d4b57612d4a613de1565b5b8135612d5b848260208601612ca0565b91505092915050565b60008083601f840112612d7a57612d79613de1565b5b8235905067ffffffffffffffff811115612d9757612d96613ddc565b5b602083019150836001820283011115612db357612db2613de6565b5b9250929050565b600081359050612dc98161457b565b92915050565b600060208284031215612de557612de4613df5565b5b6000612df384828501612ce2565b91505092915050565b60008060408385031215612e1357612e12613df5565b5b6000612e2185828601612ce2565b9250506020612e3285828601612ce2565b9150509250929050565b600080600060608486031215612e5557612e54613df5565b5b6000612e6386828701612ce2565b9350506020612e7486828701612ce2565b9250506040612e8586828701612dba565b9150509250925092565b60008060008060808587031215612ea957612ea8613df5565b5b6000612eb787828801612ce2565b9450506020612ec887828801612ce2565b9350506040612ed987828801612dba565b925050606085013567ffffffffffffffff811115612efa57612ef9613df0565b5b612f0687828801612d36565b91505092959194509250565b60008060408385031215612f2957612f28613df5565b5b6000612f3785828601612ce2565b9250506020612f4885828601612cf7565b9150509250929050565b60008060408385031215612f6957612f68613df5565b5b6000612f7785828601612ce2565b9250506020612f8885828601612dba565b9150509250929050565b600060208284031215612fa857612fa7613df5565b5b6000612fb684828501612d0c565b91505092915050565b600060208284031215612fd557612fd4613df5565b5b6000612fe384828501612d21565b91505092915050565b6000806020838503121561300357613002613df5565b5b600083013567ffffffffffffffff81111561302157613020613df0565b5b61302d85828601612d64565b92509250509250929050565b60006020828403121561304f5761304e613df5565b5b600061305d84828501612dba565b91505092915050565b61306f81613b5e565b82525050565b61307e81613b70565b82525050565b600061308f826139fb565b6130998185613a11565b93506130a9818560208601613be1565b6130b281613dfa565b840191505092915050565b60006130c882613a06565b6130d28185613a2d565b93506130e2818560208601613be1565b6130eb81613dfa565b840191505092915050565b600061310182613a06565b61310b8185613a3e565b935061311b818560208601613be1565b80840191505092915050565b6000613134602283613a2d565b915061313f82613e0b565b604082019050919050565b6000613157602683613a2d565b915061316282613e5a565b604082019050919050565b600061317a602a83613a2d565b915061318582613ea9565b604082019050919050565b600061319d600683613a2d565b91506131a882613ef8565b602082019050919050565b60006131c0601083613a2d565b91506131cb82613f21565b602082019050919050565b60006131e3602383613a2d565b91506131ee82613f4a565b604082019050919050565b6000613206602583613a2d565b915061321182613f99565b604082019050919050565b6000613229603183613a2d565b915061323482613fe8565b604082019050919050565b600061324c600d83613a2d565b915061325782614037565b602082019050919050565b600061326f600983613a2d565b915061327a82614060565b602082019050919050565b6000613292603983613a2d565b915061329d82614089565b604082019050919050565b60006132b5602b83613a2d565b91506132c0826140d8565b604082019050919050565b60006132d8602683613a2d565b91506132e382614127565b604082019050919050565b60006132fb601f83613a2d565b915061330682614176565b602082019050919050565b600061331e602083613a2d565b91506133298261419f565b602082019050919050565b6000613341602f83613a2d565b915061334c826141c8565b604082019050919050565b6000613364601a83613a2d565b915061336f82614217565b602082019050919050565b6000613387603283613a2d565b915061339282614240565b604082019050919050565b60006133aa602283613a2d565b91506133b58261428f565b604082019050919050565b60006133cd600083613a22565b91506133d8826142de565b600082019050919050565b60006133f0603383613a2d565b91506133fb826142e1565b604082019050919050565b6000613413602183613a2d565b915061341e82614330565b604082019050919050565b6000613436602883613a2d565b91506134418261437f565b604082019050919050565b6000613459601383613a2d565b9150613464826143ce565b602082019050919050565b600061347c602e83613a2d565b9150613487826143f7565b604082019050919050565b600061349f601f83613a2d565b91506134aa82614446565b602082019050919050565b60006134c2602f83613a2d565b91506134cd8261446f565b604082019050919050565b60006134e5601a83613a2d565b91506134f0826144be565b602082019050919050565b6000613508602d83613a2d565b9150613513826144e7565b604082019050919050565b61352781613bc8565b82525050565b600061353982856130f6565b915061354582846130f6565b91508190509392505050565b600061355c826133c0565b9150819050919050565b600060208201905061357b6000830184613066565b92915050565b60006080820190506135966000830187613066565b6135a36020830186613066565b6135b0604083018561351e565b81810360608301526135c28184613084565b905095945050505050565b60006020820190506135e26000830184613075565b92915050565b6000602082019050818103600083015261360281846130bd565b905092915050565b6000602082019050818103600083015261362381613127565b9050919050565b600060208201905081810360008301526136438161314a565b9050919050565b600060208201905081810360008301526136638161316d565b9050919050565b6000602082019050818103600083015261368381613190565b9050919050565b600060208201905081810360008301526136a3816131b3565b9050919050565b600060208201905081810360008301526136c3816131d6565b9050919050565b600060208201905081810360008301526136e3816131f9565b9050919050565b600060208201905081810360008301526137038161321c565b9050919050565b600060208201905081810360008301526137238161323f565b9050919050565b6000602082019050818103600083015261374381613262565b9050919050565b6000602082019050818103600083015261376381613285565b9050919050565b60006020820190508181036000830152613783816132a8565b9050919050565b600060208201905081810360008301526137a3816132cb565b9050919050565b600060208201905081810360008301526137c3816132ee565b9050919050565b600060208201905081810360008301526137e381613311565b9050919050565b6000602082019050818103600083015261380381613334565b9050919050565b6000602082019050818103600083015261382381613357565b9050919050565b600060208201905081810360008301526138438161337a565b9050919050565b600060208201905081810360008301526138638161339d565b9050919050565b60006020820190508181036000830152613883816133e3565b9050919050565b600060208201905081810360008301526138a381613406565b9050919050565b600060208201905081810360008301526138c381613429565b9050919050565b600060208201905081810360008301526138e38161344c565b9050919050565b600060208201905081810360008301526139038161346f565b9050919050565b6000602082019050818103600083015261392381613492565b9050919050565b60006020820190508181036000830152613943816134b5565b9050919050565b60006020820190508181036000830152613963816134d8565b9050919050565b60006020820190508181036000830152613983816134fb565b9050919050565b600060208201905061399f600083018461351e565b92915050565b60006139af6139c0565b90506139bb8282613c46565b919050565b6000604051905090565b600067ffffffffffffffff8211156139e5576139e4613dad565b5b6139ee82613dfa565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a5482613bc8565b9150613a5f83613bc8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a9457613a93613cf1565b5b828201905092915050565b6000613aaa82613bc8565b9150613ab583613bc8565b925082613ac557613ac4613d20565b5b828204905092915050565b6000613adb82613bc8565b9150613ae683613bc8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b1f57613b1e613cf1565b5b828202905092915050565b6000613b3582613bc8565b9150613b4083613bc8565b925082821015613b5357613b52613cf1565b5b828203905092915050565b6000613b6982613ba8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613bff578082015181840152602081019050613be4565b83811115613c0e576000848401525b50505050565b60006002820490506001821680613c2c57607f821691505b60208210811415613c4057613c3f613d4f565b5b50919050565b613c4f82613dfa565b810181811067ffffffffffffffff82111715613c6e57613c6d613dad565b5b80604052505050565b6000613c8282613bc8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cb557613cb4613cf1565b5b600182019050919050565b6000613ccb82613bc8565b9150613cd683613bc8565b925082613ce657613ce5613d20565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4661696c65640000000000000000000000000000000000000000000000000000600082015250565b7f4e6f7420656e6f7567682066756e647300000000000000000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f4e6f206d6f726520626561727300000000000000000000000000000000000000600082015250565b7f746f6f206d616e79210000000000000000000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f616d6f756e742068617320746f2062652067726561746572207468616e203000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f536d61727420436f6e7472616374732063616e74206d696e742e000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b61453f81613b5e565b811461454a57600080fd5b50565b61455681613b70565b811461456157600080fd5b50565b61456d81613b7c565b811461457857600080fd5b50565b61458481613bc8565b811461458f57600080fd5b5056fea2646970667358221220bee4665af11b87482a87e45253cef585027847c7ba5f0a20fc21e9dba99c91f564736f6c63430008070033

Deployed Bytecode Sourcemap

50153:2137:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37013:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38899:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40461:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39982:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35270:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41337:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35934:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51768:517;;;;;;;;;;;;;:::i;:::-;;41578:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35447:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51558:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38708:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50216:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37449:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10405:103;;;;;;;;;;;;;:::i;:::-;;9754:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51270:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39068:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50318:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50559:655;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40747:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41834:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39243:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50422:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51445:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41106:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10663:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50374:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37013:372;37115:4;37167:25;37152:40;;;:11;:40;;;;:105;;;;37224:33;37209:48;;;:11;:48;;;;37152:105;:172;;;;37289:35;37274:50;;;:11;:50;;;;37152:172;:225;;;;37341:36;37365:11;37341:23;:36::i;:::-;37152:225;37132:245;;37013:372;;;:::o;38899:100::-;38953:13;38986:5;38979:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38899:100;:::o;40461:214::-;40529:7;40557:16;40565:7;40557;:16::i;:::-;40549:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;40643:15;:24;40659:7;40643:24;;;;;;;;;;;;;;;;;;;;;40636:31;;40461:214;;;:::o;39982:413::-;40055:13;40071:24;40087:7;40071:15;:24::i;:::-;40055:40;;40120:5;40114:11;;:2;:11;;;;40106:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40215:5;40199:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;40224:37;40241:5;40248:12;:10;:12::i;:::-;40224:16;:37::i;:::-;40199:62;40177:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;40359:28;40368:2;40372:7;40381:5;40359:8;:28::i;:::-;40044:351;39982:413;;:::o;35270:100::-;35323:7;35350:12;;35343:19;;35270:100;:::o;41337:170::-;41471:28;41481:4;41487:2;41491:7;41471:9;:28::i;:::-;41337:170;;;:::o;35934:1007::-;36023:7;36059:16;36069:5;36059:9;:16::i;:::-;36051:5;:24;36043:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;36125:22;36150:13;:11;:13::i;:::-;36125:38;;36174:19;36204:25;36393:9;36388:466;36408:14;36404:1;:18;36388:466;;;36448:31;36482:11;:14;36494:1;36482:14;;;;;;;;;;;36448:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36545:1;36519:28;;:9;:14;;;:28;;;36515:111;;36592:9;:14;;;36572:34;;36515:111;36669:5;36648:26;;:17;:26;;;36644:195;;;36718:5;36703:11;:20;36699:85;;;36759:1;36752:8;;;;;;;;;36699:85;36806:13;;;;;;;36644:195;36429:425;36424:3;;;;;;;36388:466;;;;36877:56;;;;;;;;;;:::i;:::-;;;;;;;;35934:1007;;;;;:::o;51768:517::-;9985:12;:10;:12::i;:::-;9974:23;;:7;:5;:7::i;:::-;:23;;;9966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4728:1:::1;5326:7;;:19;;5318:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4728:1;5459:7;:18;;;;51827:10:::2;51869:3;51864:2;51840:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;51827:45;;51884:9;51907:42;51899:56;;51969:1;51963:5;:7;;;;:::i;:::-;51899:76;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51883:92;;;51990:4;51982:23;;;;;;;;;;;;:::i;:::-;;;;;;;;;52015:10;52039:42;52031:56;;52095:5;52031:74;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52014:91;;;52120:5;52112:24;;;;;;;;;;;;:::i;:::-;;;;;;;;;52146:15;52175:42;52167:56;;52231:5;52167:74;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52145:96;;;52256:10;52248:29;;;;;;;;;;;;:::i;:::-;;;;;;;;;51820:465;;;;4684:1:::1;5638:7;:22;;;;51768:517::o:0;41578:185::-;41716:39;41733:4;41739:2;41743:7;41716:39;;;;;;;;;;;;:16;:39::i;:::-;41578:185;;;:::o;35447:187::-;35514:7;35550:13;:11;:13::i;:::-;35542:5;:21;35534:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;35621:5;35614:12;;35447:187;;;:::o;51558:96::-;9985:12;:10;:12::i;:::-;9974:23;;:7;:5;:7::i;:::-;:23;;;9966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51640:8:::1;;51630:7;:18;;;;;;;:::i;:::-;;51558:96:::0;;:::o;38708:124::-;38772:7;38799:20;38811:7;38799:11;:20::i;:::-;:25;;;38792:32;;38708:124;;;:::o;50216:97::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37449:221::-;37513:7;37558:1;37541:19;;:5;:19;;;;37533:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;37634:12;:19;37647:5;37634:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;37626:36;;37619:43;;37449:221;;;:::o;10405:103::-;9985:12;:10;:12::i;:::-;9974:23;;:7;:5;:7::i;:::-;:23;;;9966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10470:30:::1;10497:1;10470:18;:30::i;:::-;10405:103::o:0;9754:87::-;9800:7;9827:6;;;;;;;;;;;9820:13;;9754:87;:::o;51270:169::-;9985:12;:10;:12::i;:::-;9974:23;;:7;:5;:7::i;:::-;:23;;;9966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51373:9:::1;;51363:6;51347:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;51339:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;51404:29;51414:10;51426:6;51404:9;:29::i;:::-;51270:169:::0;:::o;39068:104::-;39124:13;39157:7;39150:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39068:104;:::o;50318:51::-;;;;:::o;50559:655::-;50631:1;50624:6;:8;50616:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;50696:9;50682:23;;:10;:23;;;50674:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;50776:9;;50766:6;50750:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;50742:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;50827:8;;50817:6;:18;;50809:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;50866:23;50892:24;50905:10;50892:12;:24::i;:::-;50866:50;;50923:16;50954:9;50966:15;50954:27;;50950:55;50987:1;50983;:5;50950:55;;;50995:10;;;;;:::i;:::-;;;;50990:3;;;;;:::i;:::-;;;;50950:55;;;;51014:12;51061:1;51049:8;:13;:42;;51085:5;;51076:8;:14;;;;:::i;:::-;51049:42;;;51065:7;51049:42;51039:5;;51030:6;:14;;;;:::i;:::-;51029:63;;;;:::i;:::-;51014:78;;51107:1;51102:4;:6;51099:19;;;51117:1;51110:8;;51099:19;51146:4;51133:9;:17;;51125:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;51179:29;51189:10;51201:6;51179:9;:29::i;:::-;50609:605;;;50559:655;:::o;40747:288::-;40854:12;:10;:12::i;:::-;40842:24;;:8;:24;;;;40834:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;40955:8;40910:18;:32;40929:12;:10;:12::i;:::-;40910:32;;;;;;;;;;;;;;;:42;40943:8;40910:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;41008:8;40979:48;;40994:12;:10;:12::i;:::-;40979:48;;;41018:8;40979:48;;;;;;:::i;:::-;;;;;;;;40747:288;;:::o;41834:355::-;41993:28;42003:4;42009:2;42013:7;41993:9;:28::i;:::-;42054:48;42077:4;42083:2;42087:7;42096:5;42054:22;:48::i;:::-;42032:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;41834:355;;;;:::o;39243:335::-;39316:13;39350:16;39358:7;39350;:16::i;:::-;39342:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39431:21;39455:10;:8;:10::i;:::-;39431:34;;39508:1;39489:7;39483:21;:26;;:87;;;;;;;;;;;;;;;;;39536:7;39545:18;:7;:16;:18::i;:::-;39519:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39483:87;39476:94;;;39243:335;;;:::o;50422:45::-;;;;:::o;51445:107::-;51503:7;51526:20;51540:5;51526:13;:20::i;:::-;51519:27;;51445:107;;;:::o;41106:164::-;41203:4;41227:18;:25;41246:5;41227:25;;;;;;;;;;;;;;;:35;41253:8;41227:35;;;;;;;;;;;;;;;;;;;;;;;;;41220:42;;41106:164;;;;:::o;10663:201::-;9985:12;:10;:12::i;:::-;9974:23;;:7;:5;:7::i;:::-;:23;;;9966:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10772:1:::1;10752:22;;:8;:22;;;;10744:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10828:28;10847:8;10828:18;:28::i;:::-;10663:201:::0;:::o;50374:43::-;;;;:::o;12455:326::-;12515:4;12772:1;12750:7;:19;;;:23;12743:30;;12455:326;;;:::o;26533:157::-;26618:4;26657:25;26642:40;;;:11;:40;;;;26635:47;;26533:157;;;:::o;42444:111::-;42501:4;42535:12;;42525:7;:22;42518:29;;42444:111;;;:::o;8478:98::-;8531:7;8558:10;8551:17;;8478:98;:::o;47364:196::-;47506:2;47479:15;:24;47495:7;47479:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47544:7;47540:2;47524:28;;47533:5;47524:28;;;;;;;;;;;;47364:196;;;:::o;45244:2002::-;45359:35;45397:20;45409:7;45397:11;:20::i;:::-;45359:58;;45430:22;45472:13;:18;;;45456:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;45531:12;:10;:12::i;:::-;45507:36;;:20;45519:7;45507:11;:20::i;:::-;:36;;;45456:87;:154;;;;45560:50;45577:13;:18;;;45597:12;:10;:12::i;:::-;45560:16;:50::i;:::-;45456:154;45430:181;;45632:17;45624:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;45747:4;45725:26;;:13;:18;;;:26;;;45717:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;45827:1;45813:16;;:2;:16;;;;45805:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45884:43;45906:4;45912:2;45916:7;45925:1;45884:21;:43::i;:::-;45992:49;46009:1;46013:7;46022:13;:18;;;45992:8;:49::i;:::-;46367:1;46337:12;:18;46350:4;46337:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46411:1;46383:12;:16;46396:2;46383:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46457:2;46429:11;:20;46441:7;46429:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;46519:15;46474:11;:20;46486:7;46474:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;46787:19;46819:1;46809:7;:11;46787:33;;46880:1;46839:43;;:11;:24;46851:11;46839:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;46835:295;;;46907:20;46915:11;46907:7;:20::i;:::-;46903:212;;;46984:13;:18;;;46952:11;:24;46964:11;46952:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;47067:13;:28;;;47025:11;:24;47037:11;47025:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;46903:212;46835:295;46312:829;47177:7;47173:2;47158:27;;47167:4;47158:27;;;;;;;;;;;;47196:42;47217:4;47223:2;47227:7;47236:1;47196:20;:42::i;:::-;45348:1898;;45244:2002;;;:::o;38109:537::-;38170:21;;:::i;:::-;38212:16;38220:7;38212;:16::i;:::-;38204:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;38318:12;38333:7;38318:22;;38313:245;38350:1;38342:4;:9;38313:245;;38380:31;38414:11;:17;38426:4;38414:17;;;;;;;;;;;38380:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38480:1;38454:28;;:9;:14;;;:28;;;38450:93;;38514:9;38507:16;;;;;;38450:93;38361:197;38353:6;;;;;;;;38313:245;;;;38581:57;;;;;;;;;;:::i;:::-;;;;;;;;38109:537;;;;:::o;11024:191::-;11098:16;11117:6;;;;;;;;;;;11098:25;;11143:8;11134:6;;:17;;;;;;;;;;;;;;;;;;11198:8;11167:40;;11188:8;11167:40;;;;;;;;;;;;11087:128;11024:191;:::o;42563:104::-;42632:27;42642:2;42646:8;42632:27;;;;;;;;;;;;:9;:27::i;:::-;42563:104;;:::o;48125:804::-;48280:4;48301:15;:2;:13;;;:15::i;:::-;48297:625;;;48353:2;48337:36;;;48374:12;:10;:12::i;:::-;48388:4;48394:7;48403:5;48337:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48333:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48600:1;48583:6;:13;:18;48579:273;;;48626:61;;;;;;;;;;:::i;:::-;;;;;;;;48579:273;48802:6;48796:13;48787:6;48783:2;48779:15;48772:38;48333:534;48470:45;;;48460:55;;;:6;:55;;;;48453:62;;;;;48297:625;48906:4;48899:11;;48125:804;;;;;;;:::o;51660:102::-;51720:13;51749:7;51742:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51660:102;:::o;6040:723::-;6096:13;6326:1;6317:5;:10;6313:53;;;6344:10;;;;;;;;;;;;;;;;;;;;;6313:53;6376:12;6391:5;6376:20;;6407:14;6432:78;6447:1;6439:4;:9;6432:78;;6465:8;;;;;:::i;:::-;;;;6496:2;6488:10;;;;;:::i;:::-;;;6432:78;;;6520:19;6552:6;6542:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6520:39;;6570:154;6586:1;6577:5;:10;6570:154;;6614:1;6604:11;;;;;:::i;:::-;;;6681:2;6673:5;:10;;;;:::i;:::-;6660:2;:24;;;;:::i;:::-;6647:39;;6630:6;6637;6630:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6710:2;6701:11;;;;;:::i;:::-;;;6570:154;;;6748:6;6734:21;;;;;6040:723;;;;:::o;37678:229::-;37739:7;37784:1;37767:19;;:5;:19;;;;37759:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37866:12;:19;37879:5;37866:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;37858:41;;37851:48;;37678:229;;;:::o;49417:159::-;;;;;:::o;49988:158::-;;;;;:::o;43030:163::-;43153:32;43159:2;43163:8;43173:5;43180:4;43153:5;:32::i;:::-;43030:163;;;:::o;43452:1538::-;43591:20;43614:12;;43591:35;;43659:1;43645:16;;:2;:16;;;;43637:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;43730:1;43718:8;:13;;43710:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43789:61;43819:1;43823:2;43827:12;43841:8;43789:21;:61::i;:::-;44164:8;44128:12;:16;44141:2;44128:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44229:8;44188:12;:16;44201:2;44188:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44288:2;44255:11;:25;44267:12;44255:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;44355:15;44305:11;:25;44317:12;44305:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;44388:20;44411:12;44388:35;;44445:9;44440:415;44460:8;44456:1;:12;44440:415;;;44524:12;44520:2;44499:38;;44516:1;44499:38;;;;;;;;;;;;44560:4;44556:249;;;44623:59;44654:1;44658:2;44662:12;44676:5;44623:22;:59::i;:::-;44589:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;44556:249;44825:14;;;;;;;44470:3;;;;;;;44440:415;;;;44886:12;44871;:27;;;;44103:807;44922:60;44951:1;44955:2;44959:12;44973:8;44922:20;:60::i;:::-;43580:1410;43452:1538;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:327::-;5473:6;5522:2;5510:9;5501:7;5497:23;5493:32;5490:119;;;5528:79;;:::i;:::-;5490:119;5648:1;5673:52;5717:7;5708:6;5697:9;5693:22;5673:52;:::i;:::-;5663:62;;5619:116;5415:327;;;;:::o;5748:349::-;5817:6;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:63;6072:7;6063:6;6052:9;6048:22;6017:63;:::i;:::-;6007:73;;5963:127;5748:349;;;;:::o;6103:529::-;6174:6;6182;6231:2;6219:9;6210:7;6206:23;6202:32;6199:119;;;6237:79;;:::i;:::-;6199:119;6385:1;6374:9;6370:17;6357:31;6415:18;6407:6;6404:30;6401:117;;;6437:79;;:::i;:::-;6401:117;6550:65;6607:7;6598:6;6587:9;6583:22;6550:65;:::i;:::-;6532:83;;;;6328:297;6103:529;;;;;:::o;6638:329::-;6697:6;6746:2;6734:9;6725:7;6721:23;6717:32;6714:119;;;6752:79;;:::i;:::-;6714:119;6872:1;6897:53;6942:7;6933:6;6922:9;6918:22;6897:53;:::i;:::-;6887:63;;6843:117;6638:329;;;;:::o;6973:118::-;7060:24;7078:5;7060:24;:::i;:::-;7055:3;7048:37;6973:118;;:::o;7097:109::-;7178:21;7193:5;7178:21;:::i;:::-;7173:3;7166:34;7097:109;;:::o;7212:360::-;7298:3;7326:38;7358:5;7326:38;:::i;:::-;7380:70;7443:6;7438:3;7380:70;:::i;:::-;7373:77;;7459:52;7504:6;7499:3;7492:4;7485:5;7481:16;7459:52;:::i;:::-;7536:29;7558:6;7536:29;:::i;:::-;7531:3;7527:39;7520:46;;7302:270;7212:360;;;;:::o;7578:364::-;7666:3;7694:39;7727:5;7694:39;:::i;:::-;7749:71;7813:6;7808:3;7749:71;:::i;:::-;7742:78;;7829:52;7874:6;7869:3;7862:4;7855:5;7851:16;7829:52;:::i;:::-;7906:29;7928:6;7906:29;:::i;:::-;7901:3;7897:39;7890:46;;7670:272;7578:364;;;;:::o;7948:377::-;8054:3;8082:39;8115:5;8082:39;:::i;:::-;8137:89;8219:6;8214:3;8137:89;:::i;:::-;8130:96;;8235:52;8280:6;8275:3;8268:4;8261:5;8257:16;8235:52;:::i;:::-;8312:6;8307:3;8303:16;8296:23;;8058:267;7948:377;;;;:::o;8331:366::-;8473:3;8494:67;8558:2;8553:3;8494:67;:::i;:::-;8487:74;;8570:93;8659:3;8570:93;:::i;:::-;8688:2;8683:3;8679:12;8672:19;;8331:366;;;:::o;8703:::-;8845:3;8866:67;8930:2;8925:3;8866:67;:::i;:::-;8859:74;;8942:93;9031:3;8942:93;:::i;:::-;9060:2;9055:3;9051:12;9044:19;;8703:366;;;:::o;9075:::-;9217:3;9238:67;9302:2;9297:3;9238:67;:::i;:::-;9231:74;;9314:93;9403:3;9314:93;:::i;:::-;9432:2;9427:3;9423:12;9416:19;;9075:366;;;:::o;9447:365::-;9589:3;9610:66;9674:1;9669:3;9610:66;:::i;:::-;9603:73;;9685:93;9774:3;9685:93;:::i;:::-;9803:2;9798:3;9794:12;9787:19;;9447:365;;;:::o;9818:366::-;9960:3;9981:67;10045:2;10040:3;9981:67;:::i;:::-;9974:74;;10057:93;10146:3;10057:93;:::i;:::-;10175:2;10170:3;10166:12;10159:19;;9818:366;;;:::o;10190:::-;10332:3;10353:67;10417:2;10412:3;10353:67;:::i;:::-;10346:74;;10429:93;10518:3;10429:93;:::i;:::-;10547:2;10542:3;10538:12;10531:19;;10190:366;;;:::o;10562:::-;10704:3;10725:67;10789:2;10784:3;10725:67;:::i;:::-;10718:74;;10801:93;10890:3;10801:93;:::i;:::-;10919:2;10914:3;10910:12;10903:19;;10562:366;;;:::o;10934:::-;11076:3;11097:67;11161:2;11156:3;11097:67;:::i;:::-;11090:74;;11173:93;11262:3;11173:93;:::i;:::-;11291:2;11286:3;11282:12;11275:19;;10934:366;;;:::o;11306:::-;11448:3;11469:67;11533:2;11528:3;11469:67;:::i;:::-;11462:74;;11545:93;11634:3;11545:93;:::i;:::-;11663:2;11658:3;11654:12;11647:19;;11306:366;;;:::o;11678:365::-;11820:3;11841:66;11905:1;11900:3;11841:66;:::i;:::-;11834:73;;11916:93;12005:3;11916:93;:::i;:::-;12034:2;12029:3;12025:12;12018:19;;11678:365;;;:::o;12049:366::-;12191:3;12212:67;12276:2;12271:3;12212:67;:::i;:::-;12205:74;;12288:93;12377:3;12288:93;:::i;:::-;12406:2;12401:3;12397:12;12390:19;;12049:366;;;:::o;12421:::-;12563:3;12584:67;12648:2;12643:3;12584:67;:::i;:::-;12577:74;;12660:93;12749:3;12660:93;:::i;:::-;12778:2;12773:3;12769:12;12762:19;;12421:366;;;:::o;12793:::-;12935:3;12956:67;13020:2;13015:3;12956:67;:::i;:::-;12949:74;;13032:93;13121:3;13032:93;:::i;:::-;13150:2;13145:3;13141:12;13134:19;;12793:366;;;:::o;13165:::-;13307:3;13328:67;13392:2;13387:3;13328:67;:::i;:::-;13321:74;;13404:93;13493:3;13404:93;:::i;:::-;13522:2;13517:3;13513:12;13506:19;;13165:366;;;:::o;13537:::-;13679:3;13700:67;13764:2;13759:3;13700:67;:::i;:::-;13693:74;;13776:93;13865:3;13776:93;:::i;:::-;13894:2;13889:3;13885:12;13878:19;;13537:366;;;:::o;13909:::-;14051:3;14072:67;14136:2;14131:3;14072:67;:::i;:::-;14065:74;;14148:93;14237:3;14148:93;:::i;:::-;14266:2;14261:3;14257:12;14250:19;;13909:366;;;:::o;14281:::-;14423:3;14444:67;14508:2;14503:3;14444:67;:::i;:::-;14437:74;;14520:93;14609:3;14520:93;:::i;:::-;14638:2;14633:3;14629:12;14622:19;;14281:366;;;:::o;14653:::-;14795:3;14816:67;14880:2;14875:3;14816:67;:::i;:::-;14809:74;;14892:93;14981:3;14892:93;:::i;:::-;15010:2;15005:3;15001:12;14994:19;;14653:366;;;:::o;15025:::-;15167:3;15188:67;15252:2;15247:3;15188:67;:::i;:::-;15181:74;;15264:93;15353:3;15264:93;:::i;:::-;15382:2;15377:3;15373:12;15366:19;;15025:366;;;:::o;15397:398::-;15556:3;15577:83;15658:1;15653:3;15577:83;:::i;:::-;15570:90;;15669:93;15758:3;15669:93;:::i;:::-;15787:1;15782:3;15778:11;15771:18;;15397:398;;;:::o;15801:366::-;15943:3;15964:67;16028:2;16023:3;15964:67;:::i;:::-;15957:74;;16040:93;16129:3;16040:93;:::i;:::-;16158:2;16153:3;16149:12;16142:19;;15801:366;;;:::o;16173:::-;16315:3;16336:67;16400:2;16395:3;16336:67;:::i;:::-;16329:74;;16412:93;16501:3;16412:93;:::i;:::-;16530:2;16525:3;16521:12;16514:19;;16173:366;;;:::o;16545:::-;16687:3;16708:67;16772:2;16767:3;16708:67;:::i;:::-;16701:74;;16784:93;16873:3;16784:93;:::i;:::-;16902:2;16897:3;16893:12;16886:19;;16545:366;;;:::o;16917:::-;17059:3;17080:67;17144:2;17139:3;17080:67;:::i;:::-;17073:74;;17156:93;17245:3;17156:93;:::i;:::-;17274:2;17269:3;17265:12;17258:19;;16917:366;;;:::o;17289:::-;17431:3;17452:67;17516:2;17511:3;17452:67;:::i;:::-;17445:74;;17528:93;17617:3;17528:93;:::i;:::-;17646:2;17641:3;17637:12;17630:19;;17289:366;;;:::o;17661:::-;17803:3;17824:67;17888:2;17883:3;17824:67;:::i;:::-;17817:74;;17900:93;17989:3;17900:93;:::i;:::-;18018:2;18013:3;18009:12;18002:19;;17661:366;;;:::o;18033:::-;18175:3;18196:67;18260:2;18255:3;18196:67;:::i;:::-;18189:74;;18272:93;18361:3;18272:93;:::i;:::-;18390:2;18385:3;18381:12;18374:19;;18033:366;;;:::o;18405:::-;18547:3;18568:67;18632:2;18627:3;18568:67;:::i;:::-;18561:74;;18644:93;18733:3;18644:93;:::i;:::-;18762:2;18757:3;18753:12;18746:19;;18405:366;;;:::o;18777:::-;18919:3;18940:67;19004:2;18999:3;18940:67;:::i;:::-;18933:74;;19016:93;19105:3;19016:93;:::i;:::-;19134:2;19129:3;19125:12;19118:19;;18777:366;;;:::o;19149:118::-;19236:24;19254:5;19236:24;:::i;:::-;19231:3;19224:37;19149:118;;:::o;19273:435::-;19453:3;19475:95;19566:3;19557:6;19475:95;:::i;:::-;19468:102;;19587:95;19678:3;19669:6;19587:95;:::i;:::-;19580:102;;19699:3;19692:10;;19273:435;;;;;:::o;19714:379::-;19898:3;19920:147;20063:3;19920:147;:::i;:::-;19913:154;;20084:3;20077:10;;19714:379;;;:::o;20099:222::-;20192:4;20230:2;20219:9;20215:18;20207:26;;20243:71;20311:1;20300:9;20296:17;20287:6;20243:71;:::i;:::-;20099:222;;;;:::o;20327:640::-;20522:4;20560:3;20549:9;20545:19;20537:27;;20574:71;20642:1;20631:9;20627:17;20618:6;20574:71;:::i;:::-;20655:72;20723:2;20712:9;20708:18;20699:6;20655:72;:::i;:::-;20737;20805:2;20794:9;20790:18;20781:6;20737:72;:::i;:::-;20856:9;20850:4;20846:20;20841:2;20830:9;20826:18;20819:48;20884:76;20955:4;20946:6;20884:76;:::i;:::-;20876:84;;20327:640;;;;;;;:::o;20973:210::-;21060:4;21098:2;21087:9;21083:18;21075:26;;21111:65;21173:1;21162:9;21158:17;21149:6;21111:65;:::i;:::-;20973:210;;;;:::o;21189:313::-;21302:4;21340:2;21329:9;21325:18;21317:26;;21389:9;21383:4;21379:20;21375:1;21364:9;21360:17;21353:47;21417:78;21490:4;21481:6;21417:78;:::i;:::-;21409:86;;21189:313;;;;:::o;21508:419::-;21674:4;21712:2;21701:9;21697:18;21689:26;;21761:9;21755:4;21751:20;21747:1;21736:9;21732:17;21725:47;21789:131;21915:4;21789:131;:::i;:::-;21781:139;;21508:419;;;:::o;21933:::-;22099:4;22137:2;22126:9;22122:18;22114:26;;22186:9;22180:4;22176:20;22172:1;22161:9;22157:17;22150:47;22214:131;22340:4;22214:131;:::i;:::-;22206:139;;21933:419;;;:::o;22358:::-;22524:4;22562:2;22551:9;22547:18;22539:26;;22611:9;22605:4;22601:20;22597:1;22586:9;22582:17;22575:47;22639:131;22765:4;22639:131;:::i;:::-;22631:139;;22358:419;;;:::o;22783:::-;22949:4;22987:2;22976:9;22972:18;22964:26;;23036:9;23030:4;23026:20;23022:1;23011:9;23007:17;23000:47;23064:131;23190:4;23064:131;:::i;:::-;23056:139;;22783:419;;;:::o;23208:::-;23374:4;23412:2;23401:9;23397:18;23389:26;;23461:9;23455:4;23451:20;23447:1;23436:9;23432:17;23425:47;23489:131;23615:4;23489:131;:::i;:::-;23481:139;;23208:419;;;:::o;23633:::-;23799:4;23837:2;23826:9;23822:18;23814:26;;23886:9;23880:4;23876:20;23872:1;23861:9;23857:17;23850:47;23914:131;24040:4;23914:131;:::i;:::-;23906:139;;23633:419;;;:::o;24058:::-;24224:4;24262:2;24251:9;24247:18;24239:26;;24311:9;24305:4;24301:20;24297:1;24286:9;24282:17;24275:47;24339:131;24465:4;24339:131;:::i;:::-;24331:139;;24058:419;;;:::o;24483:::-;24649:4;24687:2;24676:9;24672:18;24664:26;;24736:9;24730:4;24726:20;24722:1;24711:9;24707:17;24700:47;24764:131;24890:4;24764:131;:::i;:::-;24756:139;;24483:419;;;:::o;24908:::-;25074:4;25112:2;25101:9;25097:18;25089:26;;25161:9;25155:4;25151:20;25147:1;25136:9;25132:17;25125:47;25189:131;25315:4;25189:131;:::i;:::-;25181:139;;24908:419;;;:::o;25333:::-;25499:4;25537:2;25526:9;25522:18;25514:26;;25586:9;25580:4;25576:20;25572:1;25561:9;25557:17;25550:47;25614:131;25740:4;25614:131;:::i;:::-;25606:139;;25333:419;;;:::o;25758:::-;25924:4;25962:2;25951:9;25947:18;25939:26;;26011:9;26005:4;26001:20;25997:1;25986:9;25982:17;25975:47;26039:131;26165:4;26039:131;:::i;:::-;26031:139;;25758:419;;;:::o;26183:::-;26349:4;26387:2;26376:9;26372:18;26364:26;;26436:9;26430:4;26426:20;26422:1;26411:9;26407:17;26400:47;26464:131;26590:4;26464:131;:::i;:::-;26456:139;;26183:419;;;:::o;26608:::-;26774:4;26812:2;26801:9;26797:18;26789:26;;26861:9;26855:4;26851:20;26847:1;26836:9;26832:17;26825:47;26889:131;27015:4;26889:131;:::i;:::-;26881:139;;26608:419;;;:::o;27033:::-;27199:4;27237:2;27226:9;27222:18;27214:26;;27286:9;27280:4;27276:20;27272:1;27261:9;27257:17;27250:47;27314:131;27440:4;27314:131;:::i;:::-;27306:139;;27033:419;;;:::o;27458:::-;27624:4;27662:2;27651:9;27647:18;27639:26;;27711:9;27705:4;27701:20;27697:1;27686:9;27682:17;27675:47;27739:131;27865:4;27739:131;:::i;:::-;27731:139;;27458:419;;;:::o;27883:::-;28049:4;28087:2;28076:9;28072:18;28064:26;;28136:9;28130:4;28126:20;28122:1;28111:9;28107:17;28100:47;28164:131;28290:4;28164:131;:::i;:::-;28156:139;;27883:419;;;:::o;28308:::-;28474:4;28512:2;28501:9;28497:18;28489:26;;28561:9;28555:4;28551:20;28547:1;28536:9;28532:17;28525:47;28589:131;28715:4;28589:131;:::i;:::-;28581:139;;28308:419;;;:::o;28733:::-;28899:4;28937:2;28926:9;28922:18;28914:26;;28986:9;28980:4;28976:20;28972:1;28961:9;28957:17;28950:47;29014:131;29140:4;29014:131;:::i;:::-;29006:139;;28733:419;;;:::o;29158:::-;29324:4;29362:2;29351:9;29347:18;29339:26;;29411:9;29405:4;29401:20;29397:1;29386:9;29382:17;29375:47;29439:131;29565:4;29439:131;:::i;:::-;29431:139;;29158:419;;;:::o;29583:::-;29749:4;29787:2;29776:9;29772:18;29764:26;;29836:9;29830:4;29826:20;29822:1;29811:9;29807:17;29800:47;29864:131;29990:4;29864:131;:::i;:::-;29856:139;;29583:419;;;:::o;30008:::-;30174:4;30212:2;30201:9;30197:18;30189:26;;30261:9;30255:4;30251:20;30247:1;30236:9;30232:17;30225:47;30289:131;30415:4;30289:131;:::i;:::-;30281:139;;30008:419;;;:::o;30433:::-;30599:4;30637:2;30626:9;30622:18;30614:26;;30686:9;30680:4;30676:20;30672:1;30661:9;30657:17;30650:47;30714:131;30840:4;30714:131;:::i;:::-;30706:139;;30433:419;;;:::o;30858:::-;31024:4;31062:2;31051:9;31047:18;31039:26;;31111:9;31105:4;31101:20;31097:1;31086:9;31082:17;31075:47;31139:131;31265:4;31139:131;:::i;:::-;31131:139;;30858:419;;;:::o;31283:::-;31449:4;31487:2;31476:9;31472:18;31464:26;;31536:9;31530:4;31526:20;31522:1;31511:9;31507:17;31500:47;31564:131;31690:4;31564:131;:::i;:::-;31556:139;;31283:419;;;:::o;31708:::-;31874:4;31912:2;31901:9;31897:18;31889:26;;31961:9;31955:4;31951:20;31947:1;31936:9;31932:17;31925:47;31989:131;32115:4;31989:131;:::i;:::-;31981:139;;31708:419;;;:::o;32133:::-;32299:4;32337:2;32326:9;32322:18;32314:26;;32386:9;32380:4;32376:20;32372:1;32361:9;32357:17;32350:47;32414:131;32540:4;32414:131;:::i;:::-;32406:139;;32133:419;;;:::o;32558:::-;32724:4;32762:2;32751:9;32747:18;32739:26;;32811:9;32805:4;32801:20;32797:1;32786:9;32782:17;32775:47;32839:131;32965:4;32839:131;:::i;:::-;32831:139;;32558:419;;;:::o;32983:::-;33149:4;33187:2;33176:9;33172:18;33164:26;;33236:9;33230:4;33226:20;33222:1;33211:9;33207:17;33200:47;33264:131;33390:4;33264:131;:::i;:::-;33256:139;;32983:419;;;:::o;33408:222::-;33501:4;33539:2;33528:9;33524:18;33516:26;;33552:71;33620:1;33609:9;33605:17;33596:6;33552:71;:::i;:::-;33408:222;;;;:::o;33636:129::-;33670:6;33697:20;;:::i;:::-;33687:30;;33726:33;33754:4;33746:6;33726:33;:::i;:::-;33636:129;;;:::o;33771:75::-;33804:6;33837:2;33831:9;33821:19;;33771:75;:::o;33852:307::-;33913:4;34003:18;33995:6;33992:30;33989:56;;;34025:18;;:::i;:::-;33989:56;34063:29;34085:6;34063:29;:::i;:::-;34055:37;;34147:4;34141;34137:15;34129:23;;33852:307;;;:::o;34165:98::-;34216:6;34250:5;34244:12;34234:22;;34165:98;;;:::o;34269:99::-;34321:6;34355:5;34349:12;34339:22;;34269:99;;;:::o;34374:168::-;34457:11;34491:6;34486:3;34479:19;34531:4;34526:3;34522:14;34507:29;;34374:168;;;;:::o;34548:147::-;34649:11;34686:3;34671:18;;34548:147;;;;:::o;34701:169::-;34785:11;34819:6;34814:3;34807:19;34859:4;34854:3;34850:14;34835:29;;34701:169;;;;:::o;34876:148::-;34978:11;35015:3;35000:18;;34876:148;;;;:::o;35030:305::-;35070:3;35089:20;35107:1;35089:20;:::i;:::-;35084:25;;35123:20;35141:1;35123:20;:::i;:::-;35118:25;;35277:1;35209:66;35205:74;35202:1;35199:81;35196:107;;;35283:18;;:::i;:::-;35196:107;35327:1;35324;35320:9;35313:16;;35030:305;;;;:::o;35341:185::-;35381:1;35398:20;35416:1;35398:20;:::i;:::-;35393:25;;35432:20;35450:1;35432:20;:::i;:::-;35427:25;;35471:1;35461:35;;35476:18;;:::i;:::-;35461:35;35518:1;35515;35511:9;35506:14;;35341:185;;;;:::o;35532:348::-;35572:7;35595:20;35613:1;35595:20;:::i;:::-;35590:25;;35629:20;35647:1;35629:20;:::i;:::-;35624:25;;35817:1;35749:66;35745:74;35742:1;35739:81;35734:1;35727:9;35720:17;35716:105;35713:131;;;35824:18;;:::i;:::-;35713:131;35872:1;35869;35865:9;35854:20;;35532:348;;;;:::o;35886:191::-;35926:4;35946:20;35964:1;35946:20;:::i;:::-;35941:25;;35980:20;35998:1;35980:20;:::i;:::-;35975:25;;36019:1;36016;36013:8;36010:34;;;36024:18;;:::i;:::-;36010:34;36069:1;36066;36062:9;36054:17;;35886:191;;;;:::o;36083:96::-;36120:7;36149:24;36167:5;36149:24;:::i;:::-;36138:35;;36083:96;;;:::o;36185:90::-;36219:7;36262:5;36255:13;36248:21;36237:32;;36185:90;;;:::o;36281:149::-;36317:7;36357:66;36350:5;36346:78;36335:89;;36281:149;;;:::o;36436:126::-;36473:7;36513:42;36506:5;36502:54;36491:65;;36436:126;;;:::o;36568:77::-;36605:7;36634:5;36623:16;;36568:77;;;:::o;36651:154::-;36735:6;36730:3;36725;36712:30;36797:1;36788:6;36783:3;36779:16;36772:27;36651:154;;;:::o;36811:307::-;36879:1;36889:113;36903:6;36900:1;36897:13;36889:113;;;36988:1;36983:3;36979:11;36973:18;36969:1;36964:3;36960:11;36953:39;36925:2;36922:1;36918:10;36913:15;;36889:113;;;37020:6;37017:1;37014:13;37011:101;;;37100:1;37091:6;37086:3;37082:16;37075:27;37011:101;36860:258;36811:307;;;:::o;37124:320::-;37168:6;37205:1;37199:4;37195:12;37185:22;;37252:1;37246:4;37242:12;37273:18;37263:81;;37329:4;37321:6;37317:17;37307:27;;37263:81;37391:2;37383:6;37380:14;37360:18;37357:38;37354:84;;;37410:18;;:::i;:::-;37354:84;37175:269;37124:320;;;:::o;37450:281::-;37533:27;37555:4;37533:27;:::i;:::-;37525:6;37521:40;37663:6;37651:10;37648:22;37627:18;37615:10;37612:34;37609:62;37606:88;;;37674:18;;:::i;:::-;37606:88;37714:10;37710:2;37703:22;37493:238;37450:281;;:::o;37737:233::-;37776:3;37799:24;37817:5;37799:24;:::i;:::-;37790:33;;37845:66;37838:5;37835:77;37832:103;;;37915:18;;:::i;:::-;37832:103;37962:1;37955:5;37951:13;37944:20;;37737:233;;;:::o;37976:176::-;38008:1;38025:20;38043:1;38025:20;:::i;:::-;38020:25;;38059:20;38077:1;38059:20;:::i;:::-;38054:25;;38098:1;38088:35;;38103:18;;:::i;:::-;38088:35;38144:1;38141;38137:9;38132:14;;37976:176;;;;:::o;38158:180::-;38206:77;38203:1;38196:88;38303:4;38300:1;38293:15;38327:4;38324:1;38317:15;38344:180;38392:77;38389:1;38382:88;38489:4;38486:1;38479:15;38513:4;38510:1;38503:15;38530:180;38578:77;38575:1;38568:88;38675:4;38672:1;38665:15;38699:4;38696:1;38689:15;38716:180;38764:77;38761:1;38754:88;38861:4;38858:1;38851:15;38885:4;38882:1;38875:15;38902:180;38950:77;38947:1;38940:88;39047:4;39044:1;39037:15;39071:4;39068:1;39061:15;39088:117;39197:1;39194;39187:12;39211:117;39320:1;39317;39310:12;39334:117;39443:1;39440;39433:12;39457:117;39566:1;39563;39556:12;39580:117;39689:1;39686;39679:12;39703:117;39812:1;39809;39802:12;39826:102;39867:6;39918:2;39914:7;39909:2;39902:5;39898:14;39894:28;39884:38;;39826:102;;;:::o;39934:221::-;40074:34;40070:1;40062:6;40058:14;40051:58;40143:4;40138:2;40130:6;40126:15;40119:29;39934:221;:::o;40161:225::-;40301:34;40297:1;40289:6;40285:14;40278:58;40370:8;40365:2;40357:6;40353:15;40346:33;40161:225;:::o;40392:229::-;40532:34;40528:1;40520:6;40516:14;40509:58;40601:12;40596:2;40588:6;40584:15;40577:37;40392:229;:::o;40627:156::-;40767:8;40763:1;40755:6;40751:14;40744:32;40627:156;:::o;40789:166::-;40929:18;40925:1;40917:6;40913:14;40906:42;40789:166;:::o;40961:222::-;41101:34;41097:1;41089:6;41085:14;41078:58;41170:5;41165:2;41157:6;41153:15;41146:30;40961:222;:::o;41189:224::-;41329:34;41325:1;41317:6;41313:14;41306:58;41398:7;41393:2;41385:6;41381:15;41374:32;41189:224;:::o;41419:236::-;41559:34;41555:1;41547:6;41543:14;41536:58;41628:19;41623:2;41615:6;41611:15;41604:44;41419:236;:::o;41661:163::-;41801:15;41797:1;41789:6;41785:14;41778:39;41661:163;:::o;41830:159::-;41970:11;41966:1;41958:6;41954:14;41947:35;41830:159;:::o;41995:244::-;42135:34;42131:1;42123:6;42119:14;42112:58;42204:27;42199:2;42191:6;42187:15;42180:52;41995:244;:::o;42245:230::-;42385:34;42381:1;42373:6;42369:14;42362:58;42454:13;42449:2;42441:6;42437:15;42430:38;42245:230;:::o;42481:225::-;42621:34;42617:1;42609:6;42605:14;42598:58;42690:8;42685:2;42677:6;42673:15;42666:33;42481:225;:::o;42712:181::-;42852:33;42848:1;42840:6;42836:14;42829:57;42712:181;:::o;42899:182::-;43039:34;43035:1;43027:6;43023:14;43016:58;42899:182;:::o;43087:234::-;43227:34;43223:1;43215:6;43211:14;43204:58;43296:17;43291:2;43283:6;43279:15;43272:42;43087:234;:::o;43327:176::-;43467:28;43463:1;43455:6;43451:14;43444:52;43327:176;:::o;43509:237::-;43649:34;43645:1;43637:6;43633:14;43626:58;43718:20;43713:2;43705:6;43701:15;43694:45;43509:237;:::o;43752:221::-;43892:34;43888:1;43880:6;43876:14;43869:58;43961:4;43956:2;43948:6;43944:15;43937:29;43752:221;:::o;43979:114::-;;:::o;44099:238::-;44239:34;44235:1;44227:6;44223:14;44216:58;44308:21;44303:2;44295:6;44291:15;44284:46;44099:238;:::o;44343:220::-;44483:34;44479:1;44471:6;44467:14;44460:58;44552:3;44547:2;44539:6;44535:15;44528:28;44343:220;:::o;44569:227::-;44709:34;44705:1;44697:6;44693:14;44686:58;44778:10;44773:2;44765:6;44761:15;44754:35;44569:227;:::o;44802:169::-;44942:21;44938:1;44930:6;44926:14;44919:45;44802:169;:::o;44977:233::-;45117:34;45113:1;45105:6;45101:14;45094:58;45186:16;45181:2;45173:6;45169:15;45162:41;44977:233;:::o;45216:181::-;45356:33;45352:1;45344:6;45340:14;45333:57;45216:181;:::o;45403:234::-;45543:34;45539:1;45531:6;45527:14;45520:58;45612:17;45607:2;45599:6;45595:15;45588:42;45403:234;:::o;45643:176::-;45783:28;45779:1;45771:6;45767:14;45760:52;45643:176;:::o;45825:232::-;45965:34;45961:1;45953:6;45949:14;45942:58;46034:15;46029:2;46021:6;46017:15;46010:40;45825:232;:::o;46063:122::-;46136:24;46154:5;46136:24;:::i;:::-;46129:5;46126:35;46116:63;;46175:1;46172;46165:12;46116:63;46063:122;:::o;46191:116::-;46261:21;46276:5;46261:21;:::i;:::-;46254:5;46251:32;46241:60;;46297:1;46294;46287:12;46241:60;46191:116;:::o;46313:120::-;46385:23;46402:5;46385:23;:::i;:::-;46378:5;46375:34;46365:62;;46423:1;46420;46413:12;46365:62;46313:120;:::o;46439:122::-;46512:24;46530:5;46512:24;:::i;:::-;46505:5;46502:35;46492:63;;46551:1;46548;46541:12;46492:63;46439:122;:::o

Swarm Source

ipfs://bee4665af11b87482a87e45253cef585027847c7ba5f0a20fc21e9dba99c91f5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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