ETH Price: $3,415.92 (-0.64%)
Gas: 5 Gwei

World Cup Apes (WCA)
 

Overview

TokenID

1148

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A collection of 1,200 World Cup Apes ready to hit the Ethereum Stadiums. Each NFT will grant users the benefit to stake and earn $WCA tokens.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WorldCupApesNFT

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-31
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/WCANFT.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;






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

    Counters.Counter private _currentTokenId;
    string public baseTokenURI;

    mapping(address => uint256) public freeMint;
    mapping(address => bool) public whitelist;

    uint256 public constant maxSupply = 5000;

    uint256 public privateSalePrice = 0.10 ether;
    uint256 public publicSalePrice = 0.15 ether;
    uint256 public whitelistPrice = 0.10 ether;
    uint256 public maxPerMint;
    
    uint256 public freeMintAmount = 500;
    uint256 public freeMintAmountMinted;

    bool public privateSaleLive = false;
    uint256 public privateSaleAmount = 1000;

    bool public publicSaleLive = false;
    
    constructor(string memory _baseURI, uint256 _maxPerMint) ERC721("World Cup Apes", "WCA") {
        maxPerMint = _maxPerMint;
        baseTokenURI = _baseURI;
    }

    function getMintedCount() external view returns (uint256) {
        return _currentTokenId.current();
    }

    function setBaseTokenURI(string calldata _baseURI) external onlyOwner {
        baseTokenURI = _baseURI;
    }

    function tokenURI(uint256 _tokenId) override public view returns (string memory) {
        require(_tokenId > 0 && _tokenId <= _currentTokenId.current(), "Invalid tokenID");
        return string(abi.encodePacked(baseTokenURI, Strings.toString(_tokenId), ".json"));
    }

    function setPrivateSalePrice(uint256 _price) external onlyOwner {
        privateSalePrice = _price;
    }

    function setPublicSalePrice(uint256 _price) external onlyOwner {
        publicSalePrice = _price;
    }

    function setWhitelistPrice(uint256 _price) external onlyOwner {
        whitelistPrice = _price;
    }

    function setMaxPerMint(uint256 _maxPerMint) external onlyOwner {
        maxPerMint = _maxPerMint;
    }

    function setFreeMintAmount(uint256 _freeMintAmount) external onlyOwner {
        freeMintAmount = _freeMintAmount;
    }

    function setPrivateSaleAmount(uint256 _privateSaleAmount) external onlyOwner {
        privateSaleAmount = _privateSaleAmount;
    }

    function addToWhiteList(address[] calldata entries) external onlyOwner {
        for(uint256 i; i < entries.length; i++){
            address entry = entries[i];
            require(!whitelist[entry], "Address already in the whitelist");

            whitelist[entry] = true;
        }
    }

    function removeFromWhiteList(address[] calldata entries) external onlyOwner {
        for(uint256 i = 0; i < entries.length; i++) {
            address entry = entries[i];
            
            whitelist[entry] = false;
        }
    }

    function addToFreeMint(address[] calldata entries, uint256 quantity) external onlyOwner {
        for(uint256 i; i < entries.length; i++){
            address entry = entries[i];

            freeMint[entry] = quantity;
        }
    }

    function removeFromFreeMint(address[] calldata entries) external onlyOwner {
        for(uint256 i = 0; i < entries.length; i++) {
            address entry = entries[i];
            
            freeMint[entry] = 0;
        }
    }  

    function togglePrivateSaleLive() external onlyOwner {
        privateSaleLive = !privateSaleLive;
    }

    function togglePublicSaleLive() external onlyOwner {
        publicSaleLive = !publicSaleLive;
    }

    function mintTo(address _to, uint256 _quantity) external onlyOwner {
        require(_quantity > 0, "Cannot mint specified number of NFTs.");

        uint256 currentTokenId = _currentTokenId.current();
        require(currentTokenId.add(_quantity) <= maxSupply, "Not enough NFTs left!");

        for (uint256 i = 0; i < _quantity; i++) {
            _mintSingleNFT(_to);
        }
    }

    function mint(uint256 _quantity) external payable {
        require(privateSaleLive || publicSaleLive, "NFT is not on sale");
        require(_quantity > 0 && _quantity <= maxPerMint, "Cannot mint specified number of NFTs");

        uint256 currentTokenId = _currentTokenId.current();
        require(currentTokenId.add(_quantity) <= maxSupply, "Not enough NFTs left");

        if(privateSaleLive){
            if(whitelist[msg.sender]){
                require(msg.value >= whitelistPrice.mul(_quantity), "Not enough ether to purchase NFTs");
            } else {
                require(currentTokenId.add(_quantity) <= privateSaleAmount, "Not enough private sale NFTs left");
                require(msg.value >= privateSalePrice.mul(_quantity), "Not enough ether to purchase NFTs");
            }
        } else if(publicSaleLive) {
            if(whitelist[msg.sender]){
                require(msg.value >= whitelistPrice.mul(_quantity), "Not enough ether to purchase NFTs");
            } else {
                require(msg.value >= publicSalePrice.mul(_quantity), "Not enough ether to purchase NFTs");
            }
        }

        for (uint256 i = 0; i < _quantity; i++) {
            _mintSingleNFT(msg.sender);
        }
    }

    function mintFree(uint256 _quantity) external payable {
        require(_quantity > 0, "Cannot mint specified number of NFTs");

        uint256 currentTokenId = _currentTokenId.current();
        require(freeMint[msg.sender] > 0, "You have no free NFT to mint");
        require(currentTokenId.add(_quantity) <= maxSupply, "Not enough NFTs left");
        require(freeMintAmountMinted.add(_quantity) <= freeMintAmount, "Not enough free mint NFTs left");

        for (uint256 i = 0; i < _quantity; i++) {
            _mintSingleNFT(msg.sender);
            freeMintAmountMinted++;
            freeMint[msg.sender] = freeMint[msg.sender] - 1;
        }
    }
    
    function _mintSingleNFT(address _to) private {
        uint256 newTokenID = _currentTokenId.current() + 1;
        _safeMint(_to, newTokenID);
        _currentTokenId.increment();
    }
    
    function tokensOfOwner(address _owner) external view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);
        uint256[] memory tokensId = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }
    
    function withdraw() external payable onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "No ether left to withdraw");

        (bool success, ) = (owner()).call{value: balance}("");
        require(success, "Transfer failed.");
    }

    function availableToWithdraw() external view onlyOwner returns (uint256) {
        return address(this).balance;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"uint256","name":"_maxPerMint","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"addToFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"addToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableToWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintAmountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"maxPerMint","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":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mintFree","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSaleAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"removeFromFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"removeFromWhiteList","outputs":[],"stateMutability":"nonpayable","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":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_freeMintAmount","type":"uint256"}],"name":"setFreeMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerMint","type":"uint256"}],"name":"setMaxPerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_privateSaleAmount","type":"uint256"}],"name":"setPrivateSaleAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrivateSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPublicSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setWhitelistPrice","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":[],"name":"togglePrivateSaleLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSaleLive","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405267016345785d8a0000600f55670214e8348c4f000060105567016345785d8a00006011556101f46013556000601560006101000a81548160ff0219169083151502179055506103e86016556000601760006101000a81548160ff0219169083151502179055503480156200007757600080fd5b506040516200604b3803806200604b83398181016040528101906200009d9190620004db565b6040518060400160405280600e81526020017f576f726c642043757020417065730000000000000000000000000000000000008152506040518060400160405280600381526020017f574341000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200012192919062000253565b5080600190805190602001906200013a92919062000253565b5050506200015d620001516200018560201b60201c565b6200018d60201b60201c565b8060128190555081600c90805190602001906200017c92919062000253565b505050620005a5565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002619062000570565b90600052602060002090601f016020900481019282620002855760008555620002d1565b82601f10620002a057805160ff1916838001178555620002d1565b82800160010185558215620002d1579182015b82811115620002d0578251825591602001919060010190620002b3565b5b509050620002e09190620002e4565b5090565b5b80821115620002ff576000816000905550600101620002e5565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200036c8262000321565b810181811067ffffffffffffffff821117156200038e576200038d62000332565b5b80604052505050565b6000620003a362000303565b9050620003b1828262000361565b919050565b600067ffffffffffffffff821115620003d457620003d362000332565b5b620003df8262000321565b9050602081019050919050565b60005b838110156200040c578082015181840152602081019050620003ef565b838111156200041c576000848401525b50505050565b6000620004396200043384620003b6565b62000397565b9050828152602081018484840111156200045857620004576200031c565b5b62000465848285620003ec565b509392505050565b600082601f83011262000485576200048462000317565b5b81516200049784826020860162000422565b91505092915050565b6000819050919050565b620004b581620004a0565b8114620004c157600080fd5b50565b600081519050620004d581620004aa565b92915050565b60008060408385031215620004f557620004f46200030d565b5b600083015167ffffffffffffffff81111562000516576200051562000312565b5b62000524858286016200046d565b92505060206200053785828601620004c4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200058957607f821691505b6020821081036200059f576200059e62000541565b5b50919050565b615a9680620005b56000396000f3fe6080604052600436106102ff5760003560e01c80638462151c11610190578063c87b56dd116100dc578063ea9253d411610095578063f560d4151161006f578063f560d41514610b3d578063fa07ce1d14610b68578063fc1a1c3614610ba5578063ffd1a24b14610bd0576102ff565b8063ea9253d414610ac0578063ebc9bd3b14610ae9578063f2fde38b14610b14576102ff565b8063c87b56dd1461099c578063d547cfb7146109d9578063d5abeb0114610a04578063db6242c314610a2f578063e322ad2b14610a58578063e985e9c514610a83576102ff565b80639b6860c811610149578063a22cb46511610123578063a22cb46514610905578063a41467331461092e578063b11560c51461094a578063b88d4fde14610973576102ff565b80639b6860c8146108955780639dc9e9d3146108c0578063a0712d68146108e9576102ff565b80638462151c1461076f5780638668e5ac146107ac5780638b2b423a146107d75780638da5cb5b1461080257806395d89b411461082d5780639b19251a14610858576102ff565b80633ccfd60b1161024f57806370a0823111610208578063740d73f3116101e2578063740d73f3146106cb578063791a2519146106f45780637bc36e041461071d5780637f953a2214610746576102ff565b806370a082311461064e578063715018a61461068b578063717d57d3146106a2576102ff565b80633ccfd60b1461054d57806342842e0e14610557578063449a52f8146105805780634f6ccce7146105a9578063507e094f146105e65780636352211e14610611576102ff565b806323b872dd116102bc5780632f745c59116102965780632f745c591461049357806330176e13146104d0578063397f2eb0146104f95780633a467e3d14610522576102ff565b806323b872dd1461042857806326d938001461045157806327dfb3f01461047c576102ff565b806301ffc9a71461030457806305c9f30c1461034157806306fdde031461036c578063081812fc14610397578063095ea7b3146103d457806318160ddd146103fd575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190613e2d565b610be7565b6040516103389190613e75565b60405180910390f35b34801561034d57600080fd5b50610356610c61565b6040516103639190613e75565b60405180910390f35b34801561037857600080fd5b50610381610c74565b60405161038e9190613f29565b60405180910390f35b3480156103a357600080fd5b506103be60048036038101906103b99190613f81565b610d06565b6040516103cb9190613fef565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f69190614036565b610d8b565b005b34801561040957600080fd5b50610412610ea2565b60405161041f9190614085565b60405180910390f35b34801561043457600080fd5b5061044f600480360381019061044a91906140a0565b610eaf565b005b34801561045d57600080fd5b50610466610f0f565b6040516104739190613e75565b60405180910390f35b34801561048857600080fd5b50610491610f22565b005b34801561049f57600080fd5b506104ba60048036038101906104b59190614036565b610fca565b6040516104c79190614085565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f29190614158565b61106f565b005b34801561050557600080fd5b50610520600480360381019061051b9190613f81565b611101565b005b34801561052e57600080fd5b50610537611187565b6040516105449190614085565b60405180910390f35b61055561118d565b005b34801561056357600080fd5b5061057e600480360381019061057991906140a0565b611308565b005b34801561058c57600080fd5b506105a760048036038101906105a29190614036565b611328565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190613f81565b611479565b6040516105dd9190614085565b60405180910390f35b3480156105f257600080fd5b506105fb6114ea565b6040516106089190614085565b60405180910390f35b34801561061d57600080fd5b5061063860048036038101906106339190613f81565b6114f0565b6040516106459190613fef565b60405180910390f35b34801561065a57600080fd5b50610675600480360381019061067091906141a5565b6115a1565b6040516106829190614085565b60405180910390f35b34801561069757600080fd5b506106a0611658565b005b3480156106ae57600080fd5b506106c960048036038101906106c49190613f81565b6116e0565b005b3480156106d757600080fd5b506106f260048036038101906106ed9190614228565b611766565b005b34801561070057600080fd5b5061071b60048036038101906107169190613f81565b61191a565b005b34801561072957600080fd5b50610744600480360381019061073f9190613f81565b6119a0565b005b34801561075257600080fd5b5061076d60048036038101906107689190613f81565b611a26565b005b34801561077b57600080fd5b50610796600480360381019061079191906141a5565b611aac565b6040516107a39190614333565b60405180910390f35b3480156107b857600080fd5b506107c1611b5a565b6040516107ce9190614085565b60405180910390f35b3480156107e357600080fd5b506107ec611b60565b6040516107f99190614085565b60405180910390f35b34801561080e57600080fd5b50610817611b66565b6040516108249190613fef565b60405180910390f35b34801561083957600080fd5b50610842611b90565b60405161084f9190613f29565b60405180910390f35b34801561086457600080fd5b5061087f600480360381019061087a91906141a5565b611c22565b60405161088c9190613e75565b60405180910390f35b3480156108a157600080fd5b506108aa611c42565b6040516108b79190614085565b60405180910390f35b3480156108cc57600080fd5b506108e760048036038101906108e29190614355565b611c48565b005b61090360048036038101906108fe9190613f81565b611d5c565b005b34801561091157600080fd5b5061092c600480360381019061092791906143e1565b612138565b005b61094860048036038101906109439190613f81565b61214e565b005b34801561095657600080fd5b50610971600480360381019061096c9190614228565b6123a4565b005b34801561097f57600080fd5b5061099a60048036038101906109959190614551565b6124cb565b005b3480156109a857600080fd5b506109c360048036038101906109be9190613f81565b61252d565b6040516109d09190613f29565b60405180910390f35b3480156109e557600080fd5b506109ee6125b9565b6040516109fb9190613f29565b60405180910390f35b348015610a1057600080fd5b50610a19612647565b604051610a269190614085565b60405180910390f35b348015610a3b57600080fd5b50610a566004803603810190610a519190613f81565b61264d565b005b348015610a6457600080fd5b50610a6d6126d3565b604051610a7a9190614085565b60405180910390f35b348015610a8f57600080fd5b50610aaa6004803603810190610aa591906145d4565b612757565b604051610ab79190613e75565b60405180910390f35b348015610acc57600080fd5b50610ae76004803603810190610ae29190614228565b6127eb565b005b348015610af557600080fd5b50610afe6128ff565b604051610b0b9190614085565b60405180910390f35b348015610b2057600080fd5b50610b3b6004803603810190610b3691906141a5565b612910565b005b348015610b4957600080fd5b50610b52612a07565b604051610b5f9190614085565b60405180910390f35b348015610b7457600080fd5b50610b8f6004803603810190610b8a91906141a5565b612a0d565b604051610b9c9190614085565b60405180910390f35b348015610bb157600080fd5b50610bba612a25565b604051610bc79190614085565b60405180910390f35b348015610bdc57600080fd5b50610be5612a2b565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c5a5750610c5982612ad3565b5b9050919050565b601560009054906101000a900460ff1681565b606060008054610c8390614643565b80601f0160208091040260200160405190810160405280929190818152602001828054610caf90614643565b8015610cfc5780601f10610cd157610100808354040283529160200191610cfc565b820191906000526020600020905b815481529060010190602001808311610cdf57829003601f168201915b5050505050905090565b6000610d1182612bb5565b610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d47906146e6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d96826114f0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90614778565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e25612c21565b73ffffffffffffffffffffffffffffffffffffffff161480610e545750610e5381610e4e612c21565b612757565b5b610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a9061480a565b60405180910390fd5b610e9d8383612c29565b505050565b6000600880549050905090565b610ec0610eba612c21565b82612ce2565b610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef69061489c565b60405180910390fd5b610f0a838383612dc0565b505050565b601760009054906101000a900460ff1681565b610f2a612c21565b73ffffffffffffffffffffffffffffffffffffffff16610f48611b66565b73ffffffffffffffffffffffffffffffffffffffff1614610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9590614908565b60405180910390fd5b601760009054906101000a900460ff1615601760006101000a81548160ff021916908315150217905550565b6000610fd5836115a1565b8210611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d9061499a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611077612c21565b73ffffffffffffffffffffffffffffffffffffffff16611095611b66565b73ffffffffffffffffffffffffffffffffffffffff16146110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e290614908565b60405180910390fd5b8181600c91906110fc929190613d1e565b505050565b611109612c21565b73ffffffffffffffffffffffffffffffffffffffff16611127611b66565b73ffffffffffffffffffffffffffffffffffffffff161461117d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117490614908565b60405180910390fd5b8060168190555050565b60135481565b611195612c21565b73ffffffffffffffffffffffffffffffffffffffff166111b3611b66565b73ffffffffffffffffffffffffffffffffffffffff1614611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120090614908565b60405180910390fd5b600047905060008111611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124890614a06565b60405180910390fd5b600061125b611b66565b73ffffffffffffffffffffffffffffffffffffffff168260405161127e90614a57565b60006040518083038185875af1925050503d80600081146112bb576040519150601f19603f3d011682016040523d82523d6000602084013e6112c0565b606091505b5050905080611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb90614ab8565b60405180910390fd5b5050565b611323838383604051806020016040528060008152506124cb565b505050565b611330612c21565b73ffffffffffffffffffffffffffffffffffffffff1661134e611b66565b73ffffffffffffffffffffffffffffffffffffffff16146113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b90614908565b60405180910390fd5b600081116113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de90614b4a565b60405180910390fd5b60006113f3600b613026565b905061138861140b838361303490919063ffffffff16565b111561144c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144390614bb6565b60405180910390fd5b60005b82811015611473576114608461304a565b808061146b90614c05565b91505061144f565b50505050565b6000611483610ea2565b82106114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb90614cbf565b60405180910390fd5b600882815481106114d8576114d7614cdf565b5b90600052602060002001549050919050565b60125481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158f90614d80565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160890614e12565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611660612c21565b73ffffffffffffffffffffffffffffffffffffffff1661167e611b66565b73ffffffffffffffffffffffffffffffffffffffff16146116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb90614908565b60405180910390fd5b6116de600061307c565b565b6116e8612c21565b73ffffffffffffffffffffffffffffffffffffffff16611706611b66565b73ffffffffffffffffffffffffffffffffffffffff161461175c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175390614908565b60405180910390fd5b8060118190555050565b61176e612c21565b73ffffffffffffffffffffffffffffffffffffffff1661178c611b66565b73ffffffffffffffffffffffffffffffffffffffff16146117e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d990614908565b60405180910390fd5b60005b8282905081101561191557600083838381811061180557611804614cdf565b5b905060200201602081019061181a91906141a5565b9050600e60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a090614e7e565b60405180910390fd5b6001600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061190d90614c05565b9150506117e5565b505050565b611922612c21565b73ffffffffffffffffffffffffffffffffffffffff16611940611b66565b73ffffffffffffffffffffffffffffffffffffffff1614611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d90614908565b60405180910390fd5b8060108190555050565b6119a8612c21565b73ffffffffffffffffffffffffffffffffffffffff166119c6611b66565b73ffffffffffffffffffffffffffffffffffffffff1614611a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1390614908565b60405180910390fd5b80600f8190555050565b611a2e612c21565b73ffffffffffffffffffffffffffffffffffffffff16611a4c611b66565b73ffffffffffffffffffffffffffffffffffffffff1614611aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9990614908565b60405180910390fd5b8060138190555050565b60606000611ab9836115a1565b905060008167ffffffffffffffff811115611ad757611ad6614426565b5b604051908082528060200260200182016040528015611b055781602001602082028036833780820191505090505b50905060005b82811015611b4f57611b1d8582610fca565b828281518110611b3057611b2f614cdf565b5b6020026020010181815250508080611b4790614c05565b915050611b0b565b508092505050919050565b60145481565b60165481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611b9f90614643565b80601f0160208091040260200160405190810160405280929190818152602001828054611bcb90614643565b8015611c185780601f10611bed57610100808354040283529160200191611c18565b820191906000526020600020905b815481529060010190602001808311611bfb57829003601f168201915b5050505050905090565b600e6020528060005260406000206000915054906101000a900460ff1681565b60105481565b611c50612c21565b73ffffffffffffffffffffffffffffffffffffffff16611c6e611b66565b73ffffffffffffffffffffffffffffffffffffffff1614611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb90614908565b60405180910390fd5b60005b83839050811015611d56576000848483818110611ce757611ce6614cdf565b5b9050602002016020810190611cfc91906141a5565b905082600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508080611d4e90614c05565b915050611cc7565b50505050565b601560009054906101000a900460ff1680611d835750601760009054906101000a900460ff165b611dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db990614eea565b60405180910390fd5b600081118015611dd457506012548111155b611e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0a90614f7c565b60405180910390fd5b6000611e1f600b613026565b9050611388611e37838361303490919063ffffffff16565b1115611e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6f90614fe8565b60405180910390fd5b601560009054906101000a900460ff1615611fef57600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611f3b57611ef48260115461314290919063ffffffff16565b341015611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d9061507a565b60405180910390fd5b611fea565b601654611f51838361303490919063ffffffff16565b1115611f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f899061510c565b60405180910390fd5b611fa782600f5461314290919063ffffffff16565b341015611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe09061507a565b60405180910390fd5b5b61210c565b601760009054906101000a900460ff161561210b57600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156120b25761206b8260115461314290919063ffffffff16565b3410156120ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a49061507a565b60405180910390fd5b61210a565b6120c78260105461314290919063ffffffff16565b341015612109576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121009061507a565b60405180910390fd5b5b5b5b60005b82811015612133576121203361304a565b808061212b90614c05565b91505061210f565b505050565b61214a612143612c21565b8383613158565b5050565b60008111612191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218890614f7c565b60405180910390fd5b600061219d600b613026565b90506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221890615178565b60405180910390fd5b611388612237838361303490919063ffffffff16565b1115612278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226f90614fe8565b60405180910390fd5b6013546122908360145461303490919063ffffffff16565b11156122d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c8906151e4565b60405180910390fd5b60005b8281101561239f576122e53361304a565b601460008154809291906122f890614c05565b91905055506001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123499190615204565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061239790614c05565b9150506122d4565b505050565b6123ac612c21565b73ffffffffffffffffffffffffffffffffffffffff166123ca611b66565b73ffffffffffffffffffffffffffffffffffffffff1614612420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241790614908565b60405180910390fd5b60005b828290508110156124c657600083838381811061244357612442614cdf565b5b905060200201602081019061245891906141a5565b90506000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505080806124be90614c05565b915050612423565b505050565b6124dc6124d6612c21565b83612ce2565b61251b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125129061489c565b60405180910390fd5b612527848484846132c4565b50505050565b60606000821180156125485750612544600b613026565b8211155b612587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257e90615284565b60405180910390fd5b600c61259283613320565b6040516020016125a39291906153c0565b6040516020818303038152906040529050919050565b600c80546125c690614643565b80601f01602080910402602001604051908101604052809291908181526020018280546125f290614643565b801561263f5780601f106126145761010080835404028352916020019161263f565b820191906000526020600020905b81548152906001019060200180831161262257829003601f168201915b505050505081565b61138881565b612655612c21565b73ffffffffffffffffffffffffffffffffffffffff16612673611b66565b73ffffffffffffffffffffffffffffffffffffffff16146126c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c090614908565b60405180910390fd5b8060128190555050565b60006126dd612c21565b73ffffffffffffffffffffffffffffffffffffffff166126fb611b66565b73ffffffffffffffffffffffffffffffffffffffff1614612751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274890614908565b60405180910390fd5b47905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6127f3612c21565b73ffffffffffffffffffffffffffffffffffffffff16612811611b66565b73ffffffffffffffffffffffffffffffffffffffff1614612867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285e90614908565b60405180910390fd5b60005b828290508110156128fa57600083838381811061288a57612889614cdf565b5b905060200201602081019061289f91906141a5565b90506000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505080806128f290614c05565b91505061286a565b505050565b600061290b600b613026565b905090565b612918612c21565b73ffffffffffffffffffffffffffffffffffffffff16612936611b66565b73ffffffffffffffffffffffffffffffffffffffff161461298c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298390614908565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f290615461565b60405180910390fd5b612a048161307c565b50565b600f5481565b600d6020528060005260406000206000915090505481565b60115481565b612a33612c21565b73ffffffffffffffffffffffffffffffffffffffff16612a51611b66565b73ffffffffffffffffffffffffffffffffffffffff1614612aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9e90614908565b60405180910390fd5b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b9e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612bae5750612bad82613480565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612c9c836114f0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612ced82612bb5565b612d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d23906154f3565b60405180910390fd5b6000612d37836114f0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612da657508373ffffffffffffffffffffffffffffffffffffffff16612d8e84610d06565b73ffffffffffffffffffffffffffffffffffffffff16145b80612db75750612db68185612757565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612de0826114f0565b73ffffffffffffffffffffffffffffffffffffffff1614612e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2d90615585565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9c90615617565b60405180910390fd5b612eb08383836134ea565b612ebb600082612c29565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f0b9190615204565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f629190615637565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130218383836135fc565b505050565b600081600001549050919050565b600081836130429190615637565b905092915050565b60006001613058600b613026565b6130629190615637565b905061306e8282613601565b613078600b61361f565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183613150919061568d565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036131c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bd90615733565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516132b79190613e75565b60405180910390a3505050565b6132cf848484612dc0565b6132db84848484613635565b61331a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613311906157c5565b60405180910390fd5b50505050565b606060008203613367576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061347b565b600082905060005b6000821461339957808061338290614c05565b915050600a826133929190615814565b915061336f565b60008167ffffffffffffffff8111156133b5576133b4614426565b5b6040519080825280601f01601f1916602001820160405280156133e75781602001600182028036833780820191505090505b5090505b60008514613474576001826134009190615204565b9150600a8561340f9190615845565b603061341b9190615637565b60f81b81838151811061343157613430614cdf565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561346d9190615814565b94506133eb565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134f58383836137bc565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361353757613532816137c1565b613576565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461357557613574838261380a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036135b8576135b381613977565b6135f7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135f6576135f58282613a48565b5b5b505050565b505050565b61361b828260405180602001604052806000815250613ac7565b5050565b6001816000016000828254019250508190555050565b60006136568473ffffffffffffffffffffffffffffffffffffffff16613b22565b156137af578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261367f612c21565b8786866040518563ffffffff1660e01b81526004016136a194939291906158cb565b6020604051808303816000875af19250505080156136dd57506040513d601f19601f820116820180604052508101906136da919061592c565b60015b61375f573d806000811461370d576040519150601f19603f3d011682016040523d82523d6000602084013e613712565b606091505b506000815103613757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374e906157c5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506137b4565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613817846115a1565b6138219190615204565b9050600060076000848152602001908152602001600020549050818114613906576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061398b9190615204565b90506000600960008481526020019081526020016000205490506000600883815481106139bb576139ba614cdf565b5b9060005260206000200154905080600883815481106139dd576139dc614cdf565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613a2c57613a2b615959565b5b6001900381819060005260206000200160009055905550505050565b6000613a53836115a1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b613ad18383613b45565b613ade6000848484613635565b613b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b14906157c5565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bab906159d4565b60405180910390fd5b613bbd81612bb5565b15613bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bf490615a40565b60405180910390fd5b613c09600083836134ea565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c599190615637565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613d1a600083836135fc565b5050565b828054613d2a90614643565b90600052602060002090601f016020900481019282613d4c5760008555613d93565b82601f10613d6557803560ff1916838001178555613d93565b82800160010185558215613d93579182015b82811115613d92578235825591602001919060010190613d77565b5b509050613da09190613da4565b5090565b5b80821115613dbd576000816000905550600101613da5565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613e0a81613dd5565b8114613e1557600080fd5b50565b600081359050613e2781613e01565b92915050565b600060208284031215613e4357613e42613dcb565b5b6000613e5184828501613e18565b91505092915050565b60008115159050919050565b613e6f81613e5a565b82525050565b6000602082019050613e8a6000830184613e66565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613eca578082015181840152602081019050613eaf565b83811115613ed9576000848401525b50505050565b6000601f19601f8301169050919050565b6000613efb82613e90565b613f058185613e9b565b9350613f15818560208601613eac565b613f1e81613edf565b840191505092915050565b60006020820190508181036000830152613f438184613ef0565b905092915050565b6000819050919050565b613f5e81613f4b565b8114613f6957600080fd5b50565b600081359050613f7b81613f55565b92915050565b600060208284031215613f9757613f96613dcb565b5b6000613fa584828501613f6c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613fd982613fae565b9050919050565b613fe981613fce565b82525050565b60006020820190506140046000830184613fe0565b92915050565b61401381613fce565b811461401e57600080fd5b50565b6000813590506140308161400a565b92915050565b6000806040838503121561404d5761404c613dcb565b5b600061405b85828601614021565b925050602061406c85828601613f6c565b9150509250929050565b61407f81613f4b565b82525050565b600060208201905061409a6000830184614076565b92915050565b6000806000606084860312156140b9576140b8613dcb565b5b60006140c786828701614021565b93505060206140d886828701614021565b92505060406140e986828701613f6c565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112614118576141176140f3565b5b8235905067ffffffffffffffff811115614135576141346140f8565b5b602083019150836001820283011115614151576141506140fd565b5b9250929050565b6000806020838503121561416f5761416e613dcb565b5b600083013567ffffffffffffffff81111561418d5761418c613dd0565b5b61419985828601614102565b92509250509250929050565b6000602082840312156141bb576141ba613dcb565b5b60006141c984828501614021565b91505092915050565b60008083601f8401126141e8576141e76140f3565b5b8235905067ffffffffffffffff811115614205576142046140f8565b5b602083019150836020820283011115614221576142206140fd565b5b9250929050565b6000806020838503121561423f5761423e613dcb565b5b600083013567ffffffffffffffff81111561425d5761425c613dd0565b5b614269858286016141d2565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6142aa81613f4b565b82525050565b60006142bc83836142a1565b60208301905092915050565b6000602082019050919050565b60006142e082614275565b6142ea8185614280565b93506142f583614291565b8060005b8381101561432657815161430d88826142b0565b9750614318836142c8565b9250506001810190506142f9565b5085935050505092915050565b6000602082019050818103600083015261434d81846142d5565b905092915050565b60008060006040848603121561436e5761436d613dcb565b5b600084013567ffffffffffffffff81111561438c5761438b613dd0565b5b614398868287016141d2565b935093505060206143ab86828701613f6c565b9150509250925092565b6143be81613e5a565b81146143c957600080fd5b50565b6000813590506143db816143b5565b92915050565b600080604083850312156143f8576143f7613dcb565b5b600061440685828601614021565b9250506020614417858286016143cc565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61445e82613edf565b810181811067ffffffffffffffff8211171561447d5761447c614426565b5b80604052505050565b6000614490613dc1565b905061449c8282614455565b919050565b600067ffffffffffffffff8211156144bc576144bb614426565b5b6144c582613edf565b9050602081019050919050565b82818337600083830152505050565b60006144f46144ef846144a1565b614486565b9050828152602081018484840111156145105761450f614421565b5b61451b8482856144d2565b509392505050565b600082601f830112614538576145376140f3565b5b81356145488482602086016144e1565b91505092915050565b6000806000806080858703121561456b5761456a613dcb565b5b600061457987828801614021565b945050602061458a87828801614021565b935050604061459b87828801613f6c565b925050606085013567ffffffffffffffff8111156145bc576145bb613dd0565b5b6145c887828801614523565b91505092959194509250565b600080604083850312156145eb576145ea613dcb565b5b60006145f985828601614021565b925050602061460a85828601614021565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061465b57607f821691505b60208210810361466e5761466d614614565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006146d0602c83613e9b565b91506146db82614674565b604082019050919050565b600060208201905081810360008301526146ff816146c3565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614762602183613e9b565b915061476d82614706565b604082019050919050565b6000602082019050818103600083015261479181614755565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006147f4603883613e9b565b91506147ff82614798565b604082019050919050565b60006020820190508181036000830152614823816147e7565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614886603183613e9b565b91506148918261482a565b604082019050919050565b600060208201905081810360008301526148b581614879565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148f2602083613e9b565b91506148fd826148bc565b602082019050919050565b60006020820190508181036000830152614921816148e5565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614984602b83613e9b565b915061498f82614928565b604082019050919050565b600060208201905081810360008301526149b381614977565b9050919050565b7f4e6f206574686572206c65667420746f20776974686472617700000000000000600082015250565b60006149f0601983613e9b565b91506149fb826149ba565b602082019050919050565b60006020820190508181036000830152614a1f816149e3565b9050919050565b600081905092915050565b50565b6000614a41600083614a26565b9150614a4c82614a31565b600082019050919050565b6000614a6282614a34565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000614aa2601083613e9b565b9150614aad82614a6c565b602082019050919050565b60006020820190508181036000830152614ad181614a95565b9050919050565b7f43616e6e6f74206d696e7420737065636966696564206e756d626572206f662060008201527f4e4654732e000000000000000000000000000000000000000000000000000000602082015250565b6000614b34602583613e9b565b9150614b3f82614ad8565b604082019050919050565b60006020820190508181036000830152614b6381614b27565b9050919050565b7f4e6f7420656e6f756768204e465473206c656674210000000000000000000000600082015250565b6000614ba0601583613e9b565b9150614bab82614b6a565b602082019050919050565b60006020820190508181036000830152614bcf81614b93565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c1082613f4b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c4257614c41614bd6565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614ca9602c83613e9b565b9150614cb482614c4d565b604082019050919050565b60006020820190508181036000830152614cd881614c9c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614d6a602983613e9b565b9150614d7582614d0e565b604082019050919050565b60006020820190508181036000830152614d9981614d5d565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614dfc602a83613e9b565b9150614e0782614da0565b604082019050919050565b60006020820190508181036000830152614e2b81614def565b9050919050565b7f4164647265737320616c726561647920696e207468652077686974656c697374600082015250565b6000614e68602083613e9b565b9150614e7382614e32565b602082019050919050565b60006020820190508181036000830152614e9781614e5b565b9050919050565b7f4e4654206973206e6f74206f6e2073616c650000000000000000000000000000600082015250565b6000614ed4601283613e9b565b9150614edf82614e9e565b602082019050919050565b60006020820190508181036000830152614f0381614ec7565b9050919050565b7f43616e6e6f74206d696e7420737065636966696564206e756d626572206f662060008201527f4e46547300000000000000000000000000000000000000000000000000000000602082015250565b6000614f66602483613e9b565b9150614f7182614f0a565b604082019050919050565b60006020820190508181036000830152614f9581614f59565b9050919050565b7f4e6f7420656e6f756768204e465473206c656674000000000000000000000000600082015250565b6000614fd2601483613e9b565b9150614fdd82614f9c565b602082019050919050565b6000602082019050818103600083015261500181614fc5565b9050919050565b7f4e6f7420656e6f75676820657468657220746f207075726368617365204e465460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615064602183613e9b565b915061506f82615008565b604082019050919050565b6000602082019050818103600083015261509381615057565b9050919050565b7f4e6f7420656e6f75676820707269766174652073616c65204e465473206c656660008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b60006150f6602183613e9b565b91506151018261509a565b604082019050919050565b60006020820190508181036000830152615125816150e9565b9050919050565b7f596f752068617665206e6f2066726565204e465420746f206d696e7400000000600082015250565b6000615162601c83613e9b565b915061516d8261512c565b602082019050919050565b6000602082019050818103600083015261519181615155565b9050919050565b7f4e6f7420656e6f7567682066726565206d696e74204e465473206c6566740000600082015250565b60006151ce601e83613e9b565b91506151d982615198565b602082019050919050565b600060208201905081810360008301526151fd816151c1565b9050919050565b600061520f82613f4b565b915061521a83613f4b565b92508282101561522d5761522c614bd6565b5b828203905092915050565b7f496e76616c696420746f6b656e49440000000000000000000000000000000000600082015250565b600061526e600f83613e9b565b915061527982615238565b602082019050919050565b6000602082019050818103600083015261529d81615261565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546152d181614643565b6152db81866152a4565b945060018216600081146152f657600181146153075761533a565b60ff1983168652818601935061533a565b615310856152af565b60005b8381101561533257815481890152600182019150602081019050615313565b838801955050505b50505092915050565b600061534e82613e90565b61535881856152a4565b9350615368818560208601613eac565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006153aa6005836152a4565b91506153b582615374565b600582019050919050565b60006153cc82856152c4565b91506153d88284615343565b91506153e38261539d565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061544b602683613e9b565b9150615456826153ef565b604082019050919050565b6000602082019050818103600083015261547a8161543e565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006154dd602c83613e9b565b91506154e882615481565b604082019050919050565b6000602082019050818103600083015261550c816154d0565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061556f602583613e9b565b915061557a82615513565b604082019050919050565b6000602082019050818103600083015261559e81615562565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615601602483613e9b565b915061560c826155a5565b604082019050919050565b60006020820190508181036000830152615630816155f4565b9050919050565b600061564282613f4b565b915061564d83613f4b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561568257615681614bd6565b5b828201905092915050565b600061569882613f4b565b91506156a383613f4b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156156dc576156db614bd6565b5b828202905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061571d601983613e9b565b9150615728826156e7565b602082019050919050565b6000602082019050818103600083015261574c81615710565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006157af603283613e9b565b91506157ba82615753565b604082019050919050565b600060208201905081810360008301526157de816157a2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061581f82613f4b565b915061582a83613f4b565b92508261583a576158396157e5565b5b828204905092915050565b600061585082613f4b565b915061585b83613f4b565b92508261586b5761586a6157e5565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061589d82615876565b6158a78185615881565b93506158b7818560208601613eac565b6158c081613edf565b840191505092915050565b60006080820190506158e06000830187613fe0565b6158ed6020830186613fe0565b6158fa6040830185614076565b818103606083015261590c8184615892565b905095945050505050565b60008151905061592681613e01565b92915050565b60006020828403121561594257615941613dcb565b5b600061595084828501615917565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006159be602083613e9b565b91506159c982615988565b602082019050919050565b600060208201905081810360008301526159ed816159b1565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a2a601c83613e9b565b9150615a35826159f4565b602082019050919050565b60006020820190508181036000830152615a5981615a1d565b905091905056fea2646970667358221220e67ac1cc978074eb10848795eeb6a5a65460402f14cb24c0ecb21caed14ab03864736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000013880000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569657834353572646232666e62716775717a706a65366b6c637472756b707963796465666335356f6b72367766677966367a7733692f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c80638462151c11610190578063c87b56dd116100dc578063ea9253d411610095578063f560d4151161006f578063f560d41514610b3d578063fa07ce1d14610b68578063fc1a1c3614610ba5578063ffd1a24b14610bd0576102ff565b8063ea9253d414610ac0578063ebc9bd3b14610ae9578063f2fde38b14610b14576102ff565b8063c87b56dd1461099c578063d547cfb7146109d9578063d5abeb0114610a04578063db6242c314610a2f578063e322ad2b14610a58578063e985e9c514610a83576102ff565b80639b6860c811610149578063a22cb46511610123578063a22cb46514610905578063a41467331461092e578063b11560c51461094a578063b88d4fde14610973576102ff565b80639b6860c8146108955780639dc9e9d3146108c0578063a0712d68146108e9576102ff565b80638462151c1461076f5780638668e5ac146107ac5780638b2b423a146107d75780638da5cb5b1461080257806395d89b411461082d5780639b19251a14610858576102ff565b80633ccfd60b1161024f57806370a0823111610208578063740d73f3116101e2578063740d73f3146106cb578063791a2519146106f45780637bc36e041461071d5780637f953a2214610746576102ff565b806370a082311461064e578063715018a61461068b578063717d57d3146106a2576102ff565b80633ccfd60b1461054d57806342842e0e14610557578063449a52f8146105805780634f6ccce7146105a9578063507e094f146105e65780636352211e14610611576102ff565b806323b872dd116102bc5780632f745c59116102965780632f745c591461049357806330176e13146104d0578063397f2eb0146104f95780633a467e3d14610522576102ff565b806323b872dd1461042857806326d938001461045157806327dfb3f01461047c576102ff565b806301ffc9a71461030457806305c9f30c1461034157806306fdde031461036c578063081812fc14610397578063095ea7b3146103d457806318160ddd146103fd575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190613e2d565b610be7565b6040516103389190613e75565b60405180910390f35b34801561034d57600080fd5b50610356610c61565b6040516103639190613e75565b60405180910390f35b34801561037857600080fd5b50610381610c74565b60405161038e9190613f29565b60405180910390f35b3480156103a357600080fd5b506103be60048036038101906103b99190613f81565b610d06565b6040516103cb9190613fef565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f69190614036565b610d8b565b005b34801561040957600080fd5b50610412610ea2565b60405161041f9190614085565b60405180910390f35b34801561043457600080fd5b5061044f600480360381019061044a91906140a0565b610eaf565b005b34801561045d57600080fd5b50610466610f0f565b6040516104739190613e75565b60405180910390f35b34801561048857600080fd5b50610491610f22565b005b34801561049f57600080fd5b506104ba60048036038101906104b59190614036565b610fca565b6040516104c79190614085565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f29190614158565b61106f565b005b34801561050557600080fd5b50610520600480360381019061051b9190613f81565b611101565b005b34801561052e57600080fd5b50610537611187565b6040516105449190614085565b60405180910390f35b61055561118d565b005b34801561056357600080fd5b5061057e600480360381019061057991906140a0565b611308565b005b34801561058c57600080fd5b506105a760048036038101906105a29190614036565b611328565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190613f81565b611479565b6040516105dd9190614085565b60405180910390f35b3480156105f257600080fd5b506105fb6114ea565b6040516106089190614085565b60405180910390f35b34801561061d57600080fd5b5061063860048036038101906106339190613f81565b6114f0565b6040516106459190613fef565b60405180910390f35b34801561065a57600080fd5b50610675600480360381019061067091906141a5565b6115a1565b6040516106829190614085565b60405180910390f35b34801561069757600080fd5b506106a0611658565b005b3480156106ae57600080fd5b506106c960048036038101906106c49190613f81565b6116e0565b005b3480156106d757600080fd5b506106f260048036038101906106ed9190614228565b611766565b005b34801561070057600080fd5b5061071b60048036038101906107169190613f81565b61191a565b005b34801561072957600080fd5b50610744600480360381019061073f9190613f81565b6119a0565b005b34801561075257600080fd5b5061076d60048036038101906107689190613f81565b611a26565b005b34801561077b57600080fd5b50610796600480360381019061079191906141a5565b611aac565b6040516107a39190614333565b60405180910390f35b3480156107b857600080fd5b506107c1611b5a565b6040516107ce9190614085565b60405180910390f35b3480156107e357600080fd5b506107ec611b60565b6040516107f99190614085565b60405180910390f35b34801561080e57600080fd5b50610817611b66565b6040516108249190613fef565b60405180910390f35b34801561083957600080fd5b50610842611b90565b60405161084f9190613f29565b60405180910390f35b34801561086457600080fd5b5061087f600480360381019061087a91906141a5565b611c22565b60405161088c9190613e75565b60405180910390f35b3480156108a157600080fd5b506108aa611c42565b6040516108b79190614085565b60405180910390f35b3480156108cc57600080fd5b506108e760048036038101906108e29190614355565b611c48565b005b61090360048036038101906108fe9190613f81565b611d5c565b005b34801561091157600080fd5b5061092c600480360381019061092791906143e1565b612138565b005b61094860048036038101906109439190613f81565b61214e565b005b34801561095657600080fd5b50610971600480360381019061096c9190614228565b6123a4565b005b34801561097f57600080fd5b5061099a60048036038101906109959190614551565b6124cb565b005b3480156109a857600080fd5b506109c360048036038101906109be9190613f81565b61252d565b6040516109d09190613f29565b60405180910390f35b3480156109e557600080fd5b506109ee6125b9565b6040516109fb9190613f29565b60405180910390f35b348015610a1057600080fd5b50610a19612647565b604051610a269190614085565b60405180910390f35b348015610a3b57600080fd5b50610a566004803603810190610a519190613f81565b61264d565b005b348015610a6457600080fd5b50610a6d6126d3565b604051610a7a9190614085565b60405180910390f35b348015610a8f57600080fd5b50610aaa6004803603810190610aa591906145d4565b612757565b604051610ab79190613e75565b60405180910390f35b348015610acc57600080fd5b50610ae76004803603810190610ae29190614228565b6127eb565b005b348015610af557600080fd5b50610afe6128ff565b604051610b0b9190614085565b60405180910390f35b348015610b2057600080fd5b50610b3b6004803603810190610b3691906141a5565b612910565b005b348015610b4957600080fd5b50610b52612a07565b604051610b5f9190614085565b60405180910390f35b348015610b7457600080fd5b50610b8f6004803603810190610b8a91906141a5565b612a0d565b604051610b9c9190614085565b60405180910390f35b348015610bb157600080fd5b50610bba612a25565b604051610bc79190614085565b60405180910390f35b348015610bdc57600080fd5b50610be5612a2b565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c5a5750610c5982612ad3565b5b9050919050565b601560009054906101000a900460ff1681565b606060008054610c8390614643565b80601f0160208091040260200160405190810160405280929190818152602001828054610caf90614643565b8015610cfc5780601f10610cd157610100808354040283529160200191610cfc565b820191906000526020600020905b815481529060010190602001808311610cdf57829003601f168201915b5050505050905090565b6000610d1182612bb5565b610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d47906146e6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d96826114f0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90614778565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e25612c21565b73ffffffffffffffffffffffffffffffffffffffff161480610e545750610e5381610e4e612c21565b612757565b5b610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a9061480a565b60405180910390fd5b610e9d8383612c29565b505050565b6000600880549050905090565b610ec0610eba612c21565b82612ce2565b610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef69061489c565b60405180910390fd5b610f0a838383612dc0565b505050565b601760009054906101000a900460ff1681565b610f2a612c21565b73ffffffffffffffffffffffffffffffffffffffff16610f48611b66565b73ffffffffffffffffffffffffffffffffffffffff1614610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9590614908565b60405180910390fd5b601760009054906101000a900460ff1615601760006101000a81548160ff021916908315150217905550565b6000610fd5836115a1565b8210611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d9061499a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611077612c21565b73ffffffffffffffffffffffffffffffffffffffff16611095611b66565b73ffffffffffffffffffffffffffffffffffffffff16146110eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e290614908565b60405180910390fd5b8181600c91906110fc929190613d1e565b505050565b611109612c21565b73ffffffffffffffffffffffffffffffffffffffff16611127611b66565b73ffffffffffffffffffffffffffffffffffffffff161461117d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117490614908565b60405180910390fd5b8060168190555050565b60135481565b611195612c21565b73ffffffffffffffffffffffffffffffffffffffff166111b3611b66565b73ffffffffffffffffffffffffffffffffffffffff1614611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120090614908565b60405180910390fd5b600047905060008111611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124890614a06565b60405180910390fd5b600061125b611b66565b73ffffffffffffffffffffffffffffffffffffffff168260405161127e90614a57565b60006040518083038185875af1925050503d80600081146112bb576040519150601f19603f3d011682016040523d82523d6000602084013e6112c0565b606091505b5050905080611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb90614ab8565b60405180910390fd5b5050565b611323838383604051806020016040528060008152506124cb565b505050565b611330612c21565b73ffffffffffffffffffffffffffffffffffffffff1661134e611b66565b73ffffffffffffffffffffffffffffffffffffffff16146113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b90614908565b60405180910390fd5b600081116113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de90614b4a565b60405180910390fd5b60006113f3600b613026565b905061138861140b838361303490919063ffffffff16565b111561144c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144390614bb6565b60405180910390fd5b60005b82811015611473576114608461304a565b808061146b90614c05565b91505061144f565b50505050565b6000611483610ea2565b82106114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb90614cbf565b60405180910390fd5b600882815481106114d8576114d7614cdf565b5b90600052602060002001549050919050565b60125481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158f90614d80565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160890614e12565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611660612c21565b73ffffffffffffffffffffffffffffffffffffffff1661167e611b66565b73ffffffffffffffffffffffffffffffffffffffff16146116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb90614908565b60405180910390fd5b6116de600061307c565b565b6116e8612c21565b73ffffffffffffffffffffffffffffffffffffffff16611706611b66565b73ffffffffffffffffffffffffffffffffffffffff161461175c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175390614908565b60405180910390fd5b8060118190555050565b61176e612c21565b73ffffffffffffffffffffffffffffffffffffffff1661178c611b66565b73ffffffffffffffffffffffffffffffffffffffff16146117e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d990614908565b60405180910390fd5b60005b8282905081101561191557600083838381811061180557611804614cdf565b5b905060200201602081019061181a91906141a5565b9050600e60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a090614e7e565b60405180910390fd5b6001600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808061190d90614c05565b9150506117e5565b505050565b611922612c21565b73ffffffffffffffffffffffffffffffffffffffff16611940611b66565b73ffffffffffffffffffffffffffffffffffffffff1614611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d90614908565b60405180910390fd5b8060108190555050565b6119a8612c21565b73ffffffffffffffffffffffffffffffffffffffff166119c6611b66565b73ffffffffffffffffffffffffffffffffffffffff1614611a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1390614908565b60405180910390fd5b80600f8190555050565b611a2e612c21565b73ffffffffffffffffffffffffffffffffffffffff16611a4c611b66565b73ffffffffffffffffffffffffffffffffffffffff1614611aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9990614908565b60405180910390fd5b8060138190555050565b60606000611ab9836115a1565b905060008167ffffffffffffffff811115611ad757611ad6614426565b5b604051908082528060200260200182016040528015611b055781602001602082028036833780820191505090505b50905060005b82811015611b4f57611b1d8582610fca565b828281518110611b3057611b2f614cdf565b5b6020026020010181815250508080611b4790614c05565b915050611b0b565b508092505050919050565b60145481565b60165481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611b9f90614643565b80601f0160208091040260200160405190810160405280929190818152602001828054611bcb90614643565b8015611c185780601f10611bed57610100808354040283529160200191611c18565b820191906000526020600020905b815481529060010190602001808311611bfb57829003601f168201915b5050505050905090565b600e6020528060005260406000206000915054906101000a900460ff1681565b60105481565b611c50612c21565b73ffffffffffffffffffffffffffffffffffffffff16611c6e611b66565b73ffffffffffffffffffffffffffffffffffffffff1614611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb90614908565b60405180910390fd5b60005b83839050811015611d56576000848483818110611ce757611ce6614cdf565b5b9050602002016020810190611cfc91906141a5565b905082600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508080611d4e90614c05565b915050611cc7565b50505050565b601560009054906101000a900460ff1680611d835750601760009054906101000a900460ff165b611dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db990614eea565b60405180910390fd5b600081118015611dd457506012548111155b611e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0a90614f7c565b60405180910390fd5b6000611e1f600b613026565b9050611388611e37838361303490919063ffffffff16565b1115611e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6f90614fe8565b60405180910390fd5b601560009054906101000a900460ff1615611fef57600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611f3b57611ef48260115461314290919063ffffffff16565b341015611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d9061507a565b60405180910390fd5b611fea565b601654611f51838361303490919063ffffffff16565b1115611f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f899061510c565b60405180910390fd5b611fa782600f5461314290919063ffffffff16565b341015611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe09061507a565b60405180910390fd5b5b61210c565b601760009054906101000a900460ff161561210b57600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156120b25761206b8260115461314290919063ffffffff16565b3410156120ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a49061507a565b60405180910390fd5b61210a565b6120c78260105461314290919063ffffffff16565b341015612109576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121009061507a565b60405180910390fd5b5b5b5b60005b82811015612133576121203361304a565b808061212b90614c05565b91505061210f565b505050565b61214a612143612c21565b8383613158565b5050565b60008111612191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218890614f7c565b60405180910390fd5b600061219d600b613026565b90506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221890615178565b60405180910390fd5b611388612237838361303490919063ffffffff16565b1115612278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226f90614fe8565b60405180910390fd5b6013546122908360145461303490919063ffffffff16565b11156122d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c8906151e4565b60405180910390fd5b60005b8281101561239f576122e53361304a565b601460008154809291906122f890614c05565b91905055506001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123499190615204565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061239790614c05565b9150506122d4565b505050565b6123ac612c21565b73ffffffffffffffffffffffffffffffffffffffff166123ca611b66565b73ffffffffffffffffffffffffffffffffffffffff1614612420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241790614908565b60405180910390fd5b60005b828290508110156124c657600083838381811061244357612442614cdf565b5b905060200201602081019061245891906141a5565b90506000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505080806124be90614c05565b915050612423565b505050565b6124dc6124d6612c21565b83612ce2565b61251b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125129061489c565b60405180910390fd5b612527848484846132c4565b50505050565b60606000821180156125485750612544600b613026565b8211155b612587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257e90615284565b60405180910390fd5b600c61259283613320565b6040516020016125a39291906153c0565b6040516020818303038152906040529050919050565b600c80546125c690614643565b80601f01602080910402602001604051908101604052809291908181526020018280546125f290614643565b801561263f5780601f106126145761010080835404028352916020019161263f565b820191906000526020600020905b81548152906001019060200180831161262257829003601f168201915b505050505081565b61138881565b612655612c21565b73ffffffffffffffffffffffffffffffffffffffff16612673611b66565b73ffffffffffffffffffffffffffffffffffffffff16146126c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c090614908565b60405180910390fd5b8060128190555050565b60006126dd612c21565b73ffffffffffffffffffffffffffffffffffffffff166126fb611b66565b73ffffffffffffffffffffffffffffffffffffffff1614612751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274890614908565b60405180910390fd5b47905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6127f3612c21565b73ffffffffffffffffffffffffffffffffffffffff16612811611b66565b73ffffffffffffffffffffffffffffffffffffffff1614612867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285e90614908565b60405180910390fd5b60005b828290508110156128fa57600083838381811061288a57612889614cdf565b5b905060200201602081019061289f91906141a5565b90506000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505080806128f290614c05565b91505061286a565b505050565b600061290b600b613026565b905090565b612918612c21565b73ffffffffffffffffffffffffffffffffffffffff16612936611b66565b73ffffffffffffffffffffffffffffffffffffffff161461298c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298390614908565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f290615461565b60405180910390fd5b612a048161307c565b50565b600f5481565b600d6020528060005260406000206000915090505481565b60115481565b612a33612c21565b73ffffffffffffffffffffffffffffffffffffffff16612a51611b66565b73ffffffffffffffffffffffffffffffffffffffff1614612aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9e90614908565b60405180910390fd5b601560009054906101000a900460ff1615601560006101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b9e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612bae5750612bad82613480565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612c9c836114f0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612ced82612bb5565b612d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d23906154f3565b60405180910390fd5b6000612d37836114f0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612da657508373ffffffffffffffffffffffffffffffffffffffff16612d8e84610d06565b73ffffffffffffffffffffffffffffffffffffffff16145b80612db75750612db68185612757565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612de0826114f0565b73ffffffffffffffffffffffffffffffffffffffff1614612e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2d90615585565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9c90615617565b60405180910390fd5b612eb08383836134ea565b612ebb600082612c29565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f0b9190615204565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f629190615637565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130218383836135fc565b505050565b600081600001549050919050565b600081836130429190615637565b905092915050565b60006001613058600b613026565b6130629190615637565b905061306e8282613601565b613078600b61361f565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183613150919061568d565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036131c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bd90615733565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516132b79190613e75565b60405180910390a3505050565b6132cf848484612dc0565b6132db84848484613635565b61331a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613311906157c5565b60405180910390fd5b50505050565b606060008203613367576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061347b565b600082905060005b6000821461339957808061338290614c05565b915050600a826133929190615814565b915061336f565b60008167ffffffffffffffff8111156133b5576133b4614426565b5b6040519080825280601f01601f1916602001820160405280156133e75781602001600182028036833780820191505090505b5090505b60008514613474576001826134009190615204565b9150600a8561340f9190615845565b603061341b9190615637565b60f81b81838151811061343157613430614cdf565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561346d9190615814565b94506133eb565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134f58383836137bc565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361353757613532816137c1565b613576565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461357557613574838261380a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036135b8576135b381613977565b6135f7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135f6576135f58282613a48565b5b5b505050565b505050565b61361b828260405180602001604052806000815250613ac7565b5050565b6001816000016000828254019250508190555050565b60006136568473ffffffffffffffffffffffffffffffffffffffff16613b22565b156137af578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261367f612c21565b8786866040518563ffffffff1660e01b81526004016136a194939291906158cb565b6020604051808303816000875af19250505080156136dd57506040513d601f19601f820116820180604052508101906136da919061592c565b60015b61375f573d806000811461370d576040519150601f19603f3d011682016040523d82523d6000602084013e613712565b606091505b506000815103613757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374e906157c5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506137b4565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613817846115a1565b6138219190615204565b9050600060076000848152602001908152602001600020549050818114613906576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061398b9190615204565b90506000600960008481526020019081526020016000205490506000600883815481106139bb576139ba614cdf565b5b9060005260206000200154905080600883815481106139dd576139dc614cdf565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613a2c57613a2b615959565b5b6001900381819060005260206000200160009055905550505050565b6000613a53836115a1565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b613ad18383613b45565b613ade6000848484613635565b613b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b14906157c5565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bab906159d4565b60405180910390fd5b613bbd81612bb5565b15613bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bf490615a40565b60405180910390fd5b613c09600083836134ea565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c599190615637565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613d1a600083836135fc565b5050565b828054613d2a90614643565b90600052602060002090601f016020900481019282613d4c5760008555613d93565b82601f10613d6557803560ff1916838001178555613d93565b82800160010185558215613d93579182015b82811115613d92578235825591602001919060010190613d77565b5b509050613da09190613da4565b5090565b5b80821115613dbd576000816000905550600101613da5565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613e0a81613dd5565b8114613e1557600080fd5b50565b600081359050613e2781613e01565b92915050565b600060208284031215613e4357613e42613dcb565b5b6000613e5184828501613e18565b91505092915050565b60008115159050919050565b613e6f81613e5a565b82525050565b6000602082019050613e8a6000830184613e66565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613eca578082015181840152602081019050613eaf565b83811115613ed9576000848401525b50505050565b6000601f19601f8301169050919050565b6000613efb82613e90565b613f058185613e9b565b9350613f15818560208601613eac565b613f1e81613edf565b840191505092915050565b60006020820190508181036000830152613f438184613ef0565b905092915050565b6000819050919050565b613f5e81613f4b565b8114613f6957600080fd5b50565b600081359050613f7b81613f55565b92915050565b600060208284031215613f9757613f96613dcb565b5b6000613fa584828501613f6c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613fd982613fae565b9050919050565b613fe981613fce565b82525050565b60006020820190506140046000830184613fe0565b92915050565b61401381613fce565b811461401e57600080fd5b50565b6000813590506140308161400a565b92915050565b6000806040838503121561404d5761404c613dcb565b5b600061405b85828601614021565b925050602061406c85828601613f6c565b9150509250929050565b61407f81613f4b565b82525050565b600060208201905061409a6000830184614076565b92915050565b6000806000606084860312156140b9576140b8613dcb565b5b60006140c786828701614021565b93505060206140d886828701614021565b92505060406140e986828701613f6c565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112614118576141176140f3565b5b8235905067ffffffffffffffff811115614135576141346140f8565b5b602083019150836001820283011115614151576141506140fd565b5b9250929050565b6000806020838503121561416f5761416e613dcb565b5b600083013567ffffffffffffffff81111561418d5761418c613dd0565b5b61419985828601614102565b92509250509250929050565b6000602082840312156141bb576141ba613dcb565b5b60006141c984828501614021565b91505092915050565b60008083601f8401126141e8576141e76140f3565b5b8235905067ffffffffffffffff811115614205576142046140f8565b5b602083019150836020820283011115614221576142206140fd565b5b9250929050565b6000806020838503121561423f5761423e613dcb565b5b600083013567ffffffffffffffff81111561425d5761425c613dd0565b5b614269858286016141d2565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6142aa81613f4b565b82525050565b60006142bc83836142a1565b60208301905092915050565b6000602082019050919050565b60006142e082614275565b6142ea8185614280565b93506142f583614291565b8060005b8381101561432657815161430d88826142b0565b9750614318836142c8565b9250506001810190506142f9565b5085935050505092915050565b6000602082019050818103600083015261434d81846142d5565b905092915050565b60008060006040848603121561436e5761436d613dcb565b5b600084013567ffffffffffffffff81111561438c5761438b613dd0565b5b614398868287016141d2565b935093505060206143ab86828701613f6c565b9150509250925092565b6143be81613e5a565b81146143c957600080fd5b50565b6000813590506143db816143b5565b92915050565b600080604083850312156143f8576143f7613dcb565b5b600061440685828601614021565b9250506020614417858286016143cc565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61445e82613edf565b810181811067ffffffffffffffff8211171561447d5761447c614426565b5b80604052505050565b6000614490613dc1565b905061449c8282614455565b919050565b600067ffffffffffffffff8211156144bc576144bb614426565b5b6144c582613edf565b9050602081019050919050565b82818337600083830152505050565b60006144f46144ef846144a1565b614486565b9050828152602081018484840111156145105761450f614421565b5b61451b8482856144d2565b509392505050565b600082601f830112614538576145376140f3565b5b81356145488482602086016144e1565b91505092915050565b6000806000806080858703121561456b5761456a613dcb565b5b600061457987828801614021565b945050602061458a87828801614021565b935050604061459b87828801613f6c565b925050606085013567ffffffffffffffff8111156145bc576145bb613dd0565b5b6145c887828801614523565b91505092959194509250565b600080604083850312156145eb576145ea613dcb565b5b60006145f985828601614021565b925050602061460a85828601614021565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061465b57607f821691505b60208210810361466e5761466d614614565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006146d0602c83613e9b565b91506146db82614674565b604082019050919050565b600060208201905081810360008301526146ff816146c3565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614762602183613e9b565b915061476d82614706565b604082019050919050565b6000602082019050818103600083015261479181614755565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006147f4603883613e9b565b91506147ff82614798565b604082019050919050565b60006020820190508181036000830152614823816147e7565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614886603183613e9b565b91506148918261482a565b604082019050919050565b600060208201905081810360008301526148b581614879565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148f2602083613e9b565b91506148fd826148bc565b602082019050919050565b60006020820190508181036000830152614921816148e5565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614984602b83613e9b565b915061498f82614928565b604082019050919050565b600060208201905081810360008301526149b381614977565b9050919050565b7f4e6f206574686572206c65667420746f20776974686472617700000000000000600082015250565b60006149f0601983613e9b565b91506149fb826149ba565b602082019050919050565b60006020820190508181036000830152614a1f816149e3565b9050919050565b600081905092915050565b50565b6000614a41600083614a26565b9150614a4c82614a31565b600082019050919050565b6000614a6282614a34565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000614aa2601083613e9b565b9150614aad82614a6c565b602082019050919050565b60006020820190508181036000830152614ad181614a95565b9050919050565b7f43616e6e6f74206d696e7420737065636966696564206e756d626572206f662060008201527f4e4654732e000000000000000000000000000000000000000000000000000000602082015250565b6000614b34602583613e9b565b9150614b3f82614ad8565b604082019050919050565b60006020820190508181036000830152614b6381614b27565b9050919050565b7f4e6f7420656e6f756768204e465473206c656674210000000000000000000000600082015250565b6000614ba0601583613e9b565b9150614bab82614b6a565b602082019050919050565b60006020820190508181036000830152614bcf81614b93565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c1082613f4b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c4257614c41614bd6565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614ca9602c83613e9b565b9150614cb482614c4d565b604082019050919050565b60006020820190508181036000830152614cd881614c9c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614d6a602983613e9b565b9150614d7582614d0e565b604082019050919050565b60006020820190508181036000830152614d9981614d5d565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614dfc602a83613e9b565b9150614e0782614da0565b604082019050919050565b60006020820190508181036000830152614e2b81614def565b9050919050565b7f4164647265737320616c726561647920696e207468652077686974656c697374600082015250565b6000614e68602083613e9b565b9150614e7382614e32565b602082019050919050565b60006020820190508181036000830152614e9781614e5b565b9050919050565b7f4e4654206973206e6f74206f6e2073616c650000000000000000000000000000600082015250565b6000614ed4601283613e9b565b9150614edf82614e9e565b602082019050919050565b60006020820190508181036000830152614f0381614ec7565b9050919050565b7f43616e6e6f74206d696e7420737065636966696564206e756d626572206f662060008201527f4e46547300000000000000000000000000000000000000000000000000000000602082015250565b6000614f66602483613e9b565b9150614f7182614f0a565b604082019050919050565b60006020820190508181036000830152614f9581614f59565b9050919050565b7f4e6f7420656e6f756768204e465473206c656674000000000000000000000000600082015250565b6000614fd2601483613e9b565b9150614fdd82614f9c565b602082019050919050565b6000602082019050818103600083015261500181614fc5565b9050919050565b7f4e6f7420656e6f75676820657468657220746f207075726368617365204e465460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615064602183613e9b565b915061506f82615008565b604082019050919050565b6000602082019050818103600083015261509381615057565b9050919050565b7f4e6f7420656e6f75676820707269766174652073616c65204e465473206c656660008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b60006150f6602183613e9b565b91506151018261509a565b604082019050919050565b60006020820190508181036000830152615125816150e9565b9050919050565b7f596f752068617665206e6f2066726565204e465420746f206d696e7400000000600082015250565b6000615162601c83613e9b565b915061516d8261512c565b602082019050919050565b6000602082019050818103600083015261519181615155565b9050919050565b7f4e6f7420656e6f7567682066726565206d696e74204e465473206c6566740000600082015250565b60006151ce601e83613e9b565b91506151d982615198565b602082019050919050565b600060208201905081810360008301526151fd816151c1565b9050919050565b600061520f82613f4b565b915061521a83613f4b565b92508282101561522d5761522c614bd6565b5b828203905092915050565b7f496e76616c696420746f6b656e49440000000000000000000000000000000000600082015250565b600061526e600f83613e9b565b915061527982615238565b602082019050919050565b6000602082019050818103600083015261529d81615261565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546152d181614643565b6152db81866152a4565b945060018216600081146152f657600181146153075761533a565b60ff1983168652818601935061533a565b615310856152af565b60005b8381101561533257815481890152600182019150602081019050615313565b838801955050505b50505092915050565b600061534e82613e90565b61535881856152a4565b9350615368818560208601613eac565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006153aa6005836152a4565b91506153b582615374565b600582019050919050565b60006153cc82856152c4565b91506153d88284615343565b91506153e38261539d565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061544b602683613e9b565b9150615456826153ef565b604082019050919050565b6000602082019050818103600083015261547a8161543e565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006154dd602c83613e9b565b91506154e882615481565b604082019050919050565b6000602082019050818103600083015261550c816154d0565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061556f602583613e9b565b915061557a82615513565b604082019050919050565b6000602082019050818103600083015261559e81615562565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615601602483613e9b565b915061560c826155a5565b604082019050919050565b60006020820190508181036000830152615630816155f4565b9050919050565b600061564282613f4b565b915061564d83613f4b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561568257615681614bd6565b5b828201905092915050565b600061569882613f4b565b91506156a383613f4b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156156dc576156db614bd6565b5b828202905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061571d601983613e9b565b9150615728826156e7565b602082019050919050565b6000602082019050818103600083015261574c81615710565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006157af603283613e9b565b91506157ba82615753565b604082019050919050565b600060208201905081810360008301526157de816157a2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061581f82613f4b565b915061582a83613f4b565b92508261583a576158396157e5565b5b828204905092915050565b600061585082613f4b565b915061585b83613f4b565b92508261586b5761586a6157e5565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061589d82615876565b6158a78185615881565b93506158b7818560208601613eac565b6158c081613edf565b840191505092915050565b60006080820190506158e06000830187613fe0565b6158ed6020830186613fe0565b6158fa6040830185614076565b818103606083015261590c8184615892565b905095945050505050565b60008151905061592681613e01565b92915050565b60006020828403121561594257615941613dcb565b5b600061595084828501615917565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006159be602083613e9b565b91506159c982615988565b602082019050919050565b600060208201905081810360008301526159ed816159b1565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a2a601c83613e9b565b9150615a35826159f4565b602082019050919050565b60006020820190508181036000830152615a5981615a1d565b905091905056fea2646970667358221220e67ac1cc978074eb10848795eeb6a5a65460402f14cb24c0ecb21caed14ab03864736f6c634300080d0033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000013880000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569657834353572646232666e62716775717a706a65366b6c637472756b707963796465666335356f6b72367766677966367a7733692f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseURI (string): ipfs://bafybeiex455rdb2fnbqguqzpje6klctrukpycydefc55okr6wfgyf6zw3i/
Arg [1] : _maxPerMint (uint256): 5000

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [3] : 697066733a2f2f62616679626569657834353572646232666e62716775717a70
Arg [4] : 6a65366b6c637472756b707963796465666335356f6b72367766677966367a77
Arg [5] : 33692f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

54057:6813:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47806:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54700:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34626:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36185:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35708:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48446:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36935:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54790:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57426:102;;;;;;;;;;;;;:::i;:::-;;48114:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55128:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56116:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54614:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60461:278;;;:::i;:::-;;37345:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57536:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48636:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54576:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34320:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34050:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13222:103;;;;;;;;;;;;;:::i;:::-;;55760:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56258:298;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55646:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55530:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55986:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60100:349;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54656:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54742:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12571:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34795:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54327:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54477:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56816:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57941:1267;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36478:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59216:671;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56564:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37601:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55248:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54242:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54377:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55872:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60747:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36704:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57065:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55011:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13480:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54426:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54277:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54527:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57313:105;;;;;;;;;;;;;:::i;:::-;;47806:224;47908:4;47947:35;47932:50;;;:11;:50;;;;:90;;;;47986:36;48010:11;47986:23;:36::i;:::-;47932:90;47925:97;;47806:224;;;:::o;54700:35::-;;;;;;;;;;;;;:::o;34626:100::-;34680:13;34713:5;34706:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34626:100;:::o;36185:221::-;36261:7;36289:16;36297:7;36289;:16::i;:::-;36281:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36374:15;:24;36390:7;36374:24;;;;;;;;;;;;;;;;;;;;;36367:31;;36185:221;;;:::o;35708:411::-;35789:13;35805:23;35820:7;35805:14;:23::i;:::-;35789:39;;35853:5;35847:11;;:2;:11;;;35839:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35947:5;35931:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35956:37;35973:5;35980:12;:10;:12::i;:::-;35956:16;:37::i;:::-;35931:62;35909:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;36090:21;36099:2;36103:7;36090:8;:21::i;:::-;35778:341;35708:411;;:::o;48446:113::-;48507:7;48534:10;:17;;;;48527:24;;48446:113;:::o;36935:339::-;37130:41;37149:12;:10;:12::i;:::-;37163:7;37130:18;:41::i;:::-;37122:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37238:28;37248:4;37254:2;37258:7;37238:9;:28::i;:::-;36935:339;;;:::o;54790:34::-;;;;;;;;;;;;;:::o;57426:102::-;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57506:14:::1;;;;;;;;;;;57505:15;57488:14;;:32;;;;;;;;;;;;;;;;;;57426:102::o:0;48114:256::-;48211:7;48247:23;48264:5;48247:16;:23::i;:::-;48239:5;:31;48231:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;48336:12;:19;48349:5;48336:19;;;;;;;;;;;;;;;:26;48356:5;48336:26;;;;;;;;;;;;48329:33;;48114:256;;;;:::o;55128:112::-;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55224:8:::1;;55209:12;:23;;;;;;;:::i;:::-;;55128:112:::0;;:::o;56116:134::-;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56224:18:::1;56204:17;:38;;;;56116:134:::0;:::o;54614:35::-;;;;:::o;60461:278::-;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60519:15:::1;60537:21;60519:39;;60587:1;60577:7;:11;60569:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;60632:12;60651:7;:5;:7::i;:::-;60650:14;;60672:7;60650:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60631:53;;;60703:7;60695:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;60508:231;;60461:278::o:0;37345:185::-;37483:39;37500:4;37506:2;37510:7;37483:39;;;;;;;;;;;;:16;:39::i;:::-;37345:185;;;:::o;57536:397::-;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57634:1:::1;57622:9;:13;57614:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;57690:22;57715:25;:15;:23;:25::i;:::-;57690:50;;54413:4;57759:29;57778:9;57759:14;:18;;:29;;;;:::i;:::-;:42;;57751:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;57845:9;57840:86;57864:9;57860:1;:13;57840:86;;;57895:19;57910:3;57895:14;:19::i;:::-;57875:3;;;;;:::i;:::-;;;;57840:86;;;;57603:330;57536:397:::0;;:::o;48636:233::-;48711:7;48747:30;:28;:30::i;:::-;48739:5;:38;48731:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;48844:10;48855:5;48844:17;;;;;;;;:::i;:::-;;;;;;;;;;48837:24;;48636:233;;;:::o;54576:25::-;;;;:::o;34320:239::-;34392:7;34412:13;34428:7;:16;34436:7;34428:16;;;;;;;;;;;;;;;;;;;;;34412:32;;34480:1;34463:19;;:5;:19;;;34455:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34546:5;34539:12;;;34320:239;;;:::o;34050:208::-;34122:7;34167:1;34150:19;;:5;:19;;;34142:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34234:9;:16;34244:5;34234:16;;;;;;;;;;;;;;;;34227:23;;34050:208;;;:::o;13222:103::-;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13287:30:::1;13314:1;13287:18;:30::i;:::-;13222:103::o:0;55760:104::-;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55850:6:::1;55833:14;:23;;;;55760:104:::0;:::o;56258:298::-;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56344:9:::1;56340:209;56359:7;;:14;;56355:1;:18;56340:209;;;56394:13;56410:7;;56418:1;56410:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;56394:26;;56444:9;:16;56454:5;56444:16;;;;;;;;;;;;;;;;;;;;;;;;;56443:17;56435:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;56533:4;56514:9;:16;56524:5;56514:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;56379:170;56375:3;;;;;:::i;:::-;;;;56340:209;;;;56258:298:::0;;:::o;55646:106::-;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55738:6:::1;55720:15;:24;;;;55646:106:::0;:::o;55530:108::-;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55624:6:::1;55605:16;:25;;;;55530:108:::0;:::o;55986:122::-;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56085:15:::1;56068:14;:32;;;;55986:122:::0;:::o;60100:349::-;60162:16;60191:18;60212:17;60222:6;60212:9;:17::i;:::-;60191:38;;60240:25;60282:10;60268:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60240:53;;60309:9;60304:112;60328:10;60324:1;:14;60304:112;;;60374:30;60394:6;60402:1;60374:19;:30::i;:::-;60360:8;60369:1;60360:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;60340:3;;;;;:::i;:::-;;;;60304:112;;;;60433:8;60426:15;;;;60100:349;;;:::o;54656:35::-;;;;:::o;54742:39::-;;;;:::o;12571:87::-;12617:7;12644:6;;;;;;;;;;;12637:13;;12571:87;:::o;34795:104::-;34851:13;34884:7;34877:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34795:104;:::o;54327:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;54477:43::-;;;;:::o;56816:241::-;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56919:9:::1;56915:135;56934:7;;:14;;56930:1;:18;56915:135;;;56969:13;56985:7;;56993:1;56985:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;56969:26;;57030:8;57012;:15;57021:5;57012:15;;;;;;;;;;;;;;;:26;;;;56954:96;56950:3;;;;;:::i;:::-;;;;56915:135;;;;56816:241:::0;;;:::o;57941:1267::-;58010:15;;;;;;;;;;;:33;;;;58029:14;;;;;;;;;;;58010:33;58002:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;58097:1;58085:9;:13;:40;;;;;58115:10;;58102:9;:23;;58085:40;58077:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;58179:22;58204:25;:15;:23;:25::i;:::-;58179:50;;54413:4;58248:29;58267:9;58248:14;:18;;:29;;;;:::i;:::-;:42;;58240:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;58331:15;;;;;;;;;;;58328:768;;;58365:9;:21;58375:10;58365:21;;;;;;;;;;;;;;;;;;;;;;;;;58362:394;;;58427:29;58446:9;58427:14;;:18;;:29;;;;:::i;:::-;58414:9;:42;;58406:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;58362:394;;;58576:17;;58543:29;58562:9;58543:14;:18;;:29;;;;:::i;:::-;:50;;58535:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;58671:31;58692:9;58671:16;;:20;;:31;;;;:::i;:::-;58658:9;:44;;58650:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;58362:394;58328:768;;;58776:14;;;;;;;;;;;58773:323;;;58810:9;:21;58820:10;58810:21;;;;;;;;;;;;;;;;;;;;;;;;;58807:278;;;58872:29;58891:9;58872:14;;:18;;:29;;;;:::i;:::-;58859:9;:42;;58851:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;58807:278;;;59001:30;59021:9;59001:15;;:19;;:30;;;;:::i;:::-;58988:9;:43;;58980:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;58807:278;58773:323;58328:768;59113:9;59108:93;59132:9;59128:1;:13;59108:93;;;59163:26;59178:10;59163:14;:26::i;:::-;59143:3;;;;;:::i;:::-;;;;59108:93;;;;57991:1217;57941:1267;:::o;36478:155::-;36573:52;36592:12;:10;:12::i;:::-;36606:8;36616;36573:18;:52::i;:::-;36478:155;;:::o;59216:671::-;59301:1;59289:9;:13;59281:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;59356:22;59381:25;:15;:23;:25::i;:::-;59356:50;;59448:1;59425:8;:20;59434:10;59425:20;;;;;;;;;;;;;;;;:24;59417:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54413:4;59501:29;59520:9;59501:14;:18;;:29;;;;:::i;:::-;:42;;59493:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;59626:14;;59587:35;59612:9;59587:20;;:24;;:35;;;;:::i;:::-;:53;;59579:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;59693:9;59688:192;59712:9;59708:1;:13;59688:192;;;59743:26;59758:10;59743:14;:26::i;:::-;59784:20;;:22;;;;;;;;;:::i;:::-;;;;;;59867:1;59844:8;:20;59853:10;59844:20;;;;;;;;;;;;;;;;:24;;;;:::i;:::-;59821:8;:20;59830:10;59821:20;;;;;;;;;;;;;;;:47;;;;59723:3;;;;;:::i;:::-;;;;59688:192;;;;59270:617;59216:671;:::o;56564:244::-;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56655:9:::1;56651:150;56674:7;;:14;;56670:1;:18;56651:150;;;56710:13;56726:7;;56734:1;56726:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;56710:26;;56784:5;56765:9;:16;56775:5;56765:16;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;56695:106;56690:3;;;;;:::i;:::-;;;;56651:150;;;;56564:244:::0;;:::o;37601:328::-;37776:41;37795:12;:10;:12::i;:::-;37809:7;37776:18;:41::i;:::-;37768:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37882:39;37896:4;37902:2;37906:7;37915:5;37882:13;:39::i;:::-;37601:328;;;;:::o;55248:274::-;55314:13;55359:1;55348:8;:12;:53;;;;;55376:25;:15;:23;:25::i;:::-;55364:8;:37;;55348:53;55340:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55463:12;55477:26;55494:8;55477:16;:26::i;:::-;55446:67;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55432:82;;55248:274;;;:::o;54242:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54377:40::-;54413:4;54377:40;:::o;55872:106::-;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55959:11:::1;55946:10;:24;;;;55872:106:::0;:::o;60747:120::-;60811:7;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60838:21:::1;60831:28;;60747:120:::0;:::o;36704:164::-;36801:4;36825:18;:25;36844:5;36825:25;;;;;;;;;;;;;;;:35;36851:8;36825:35;;;;;;;;;;;;;;;;;;;;;;;;;36818:42;;36704:164;;;;:::o;57065:238::-;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57155:9:::1;57151:145;57174:7;;:14;;57170:1;:18;57151:145;;;57210:13;57226:7;;57234:1;57226:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;57210:26;;57283:1;57265:8;:15;57274:5;57265:15;;;;;;;;;;;;;;;:19;;;;57195:101;57190:3;;;;;:::i;:::-;;;;57151:145;;;;57065:238:::0;;:::o;55011:109::-;55060:7;55087:25;:15;:23;:25::i;:::-;55080:32;;55011:109;:::o;13480:201::-;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13589:1:::1;13569:22;;:8;:22;;::::0;13561:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;13645:28;13664:8;13645:18;:28::i;:::-;13480:201:::0;:::o;54426:44::-;;;;:::o;54277:43::-;;;;;;;;;;;;;;;;;:::o;54527:42::-;;;;:::o;57313:105::-;12802:12;:10;:12::i;:::-;12791:23;;:7;:5;:7::i;:::-;:23;;;12783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57395:15:::1;;;;;;;;;;;57394:16;57376:15;;:34;;;;;;;;;;;;;;;;;;57313:105::o:0;33681:305::-;33783:4;33835:25;33820:40;;;:11;:40;;;;:105;;;;33892:33;33877:48;;;:11;:48;;;;33820:105;:158;;;;33942:36;33966:11;33942:23;:36::i;:::-;33820:158;33800:178;;33681:305;;;:::o;39439:127::-;39504:4;39556:1;39528:30;;:7;:16;39536:7;39528:16;;;;;;;;;;;;;;;;;;;;;:30;;;;39521:37;;39439:127;;;:::o;11295:98::-;11348:7;11375:10;11368:17;;11295:98;:::o;43585:174::-;43687:2;43660:15;:24;43676:7;43660:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43743:7;43739:2;43705:46;;43714:23;43729:7;43714:14;:23::i;:::-;43705:46;;;;;;;;;;;;43585:174;;:::o;39733:348::-;39826:4;39851:16;39859:7;39851;:16::i;:::-;39843:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39927:13;39943:23;39958:7;39943:14;:23::i;:::-;39927:39;;39996:5;39985:16;;:7;:16;;;:51;;;;40029:7;40005:31;;:20;40017:7;40005:11;:20::i;:::-;:31;;;39985:51;:87;;;;40040:32;40057:5;40064:7;40040:16;:32::i;:::-;39985:87;39977:96;;;39733:348;;;;:::o;42842:625::-;43001:4;42974:31;;:23;42989:7;42974:14;:23::i;:::-;:31;;;42966:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;43080:1;43066:16;;:2;:16;;;43058:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43136:39;43157:4;43163:2;43167:7;43136:20;:39::i;:::-;43240:29;43257:1;43261:7;43240:8;:29::i;:::-;43301:1;43282:9;:15;43292:4;43282:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43330:1;43313:9;:13;43323:2;43313:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43361:2;43342:7;:16;43350:7;43342:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43400:7;43396:2;43381:27;;43390:4;43381:27;;;;;;;;;;;;43421:38;43441:4;43447:2;43451:7;43421:19;:38::i;:::-;42842:625;;;:::o;7899:114::-;7964:7;7991;:14;;;7984:21;;7899:114;;;:::o;2862:98::-;2920:7;2951:1;2947;:5;;;;:::i;:::-;2940:12;;2862:98;;;;:::o;59899:189::-;59955:18;60004:1;59976:25;:15;:23;:25::i;:::-;:29;;;;:::i;:::-;59955:50;;60016:26;60026:3;60031:10;60016:9;:26::i;:::-;60053:27;:15;:25;:27::i;:::-;59944:144;59899:189;:::o;13841:191::-;13915:16;13934:6;;;;;;;;;;;13915:25;;13960:8;13951:6;;:17;;;;;;;;;;;;;;;;;;14015:8;13984:40;;14005:8;13984:40;;;;;;;;;;;;13904:128;13841:191;:::o;3600:98::-;3658:7;3689:1;3685;:5;;;;:::i;:::-;3678:12;;3600:98;;;;:::o;43901:315::-;44056:8;44047:17;;:5;:17;;;44039:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;44143:8;44105:18;:25;44124:5;44105:25;;;;;;;;;;;;;;;:35;44131:8;44105:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;44189:8;44167:41;;44182:5;44167:41;;;44199:8;44167:41;;;;;;:::i;:::-;;;;;;;;43901:315;;;:::o;38811:::-;38968:28;38978:4;38984:2;38988:7;38968:9;:28::i;:::-;39015:48;39038:4;39044:2;39048:7;39057:5;39015:22;:48::i;:::-;39007:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;38811:315;;;;:::o;8857:723::-;8913:13;9143:1;9134:5;:10;9130:53;;9161:10;;;;;;;;;;;;;;;;;;;;;9130:53;9193:12;9208:5;9193:20;;9224:14;9249:78;9264:1;9256:4;:9;9249:78;;9282:8;;;;;:::i;:::-;;;;9313:2;9305:10;;;;;:::i;:::-;;;9249:78;;;9337:19;9369:6;9359:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9337:39;;9387:154;9403:1;9394:5;:10;9387:154;;9431:1;9421:11;;;;;:::i;:::-;;;9498:2;9490:5;:10;;;;:::i;:::-;9477:2;:24;;;;:::i;:::-;9464:39;;9447:6;9454;9447:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9527:2;9518:11;;;;;:::i;:::-;;;9387:154;;;9565:6;9551:21;;;;;8857:723;;;;:::o;25355:157::-;25440:4;25479:25;25464:40;;;:11;:40;;;;25457:47;;25355:157;;;:::o;49482:589::-;49626:45;49653:4;49659:2;49663:7;49626:26;:45::i;:::-;49704:1;49688:18;;:4;:18;;;49684:187;;49723:40;49755:7;49723:31;:40::i;:::-;49684:187;;;49793:2;49785:10;;:4;:10;;;49781:90;;49812:47;49845:4;49851:7;49812:32;:47::i;:::-;49781:90;49684:187;49899:1;49885:16;;:2;:16;;;49881:183;;49918:45;49955:7;49918:36;:45::i;:::-;49881:183;;;49991:4;49985:10;;:2;:10;;;49981:83;;50012:40;50040:2;50044:7;50012:27;:40::i;:::-;49981:83;49881:183;49482:589;;;:::o;46663:125::-;;;;:::o;40423:110::-;40499:26;40509:2;40513:7;40499:26;;;;;;;;;;;;:9;:26::i;:::-;40423:110;;:::o;8021:127::-;8128:1;8110:7;:14;;;:19;;;;;;;;;;;8021:127;:::o;44781:799::-;44936:4;44957:15;:2;:13;;;:15::i;:::-;44953:620;;;45009:2;44993:36;;;45030:12;:10;:12::i;:::-;45044:4;45050:7;45059:5;44993:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44989:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45252:1;45235:6;:13;:18;45231:272;;45278:60;;;;;;;;;;:::i;:::-;;;;;;;;45231:272;45453:6;45447:13;45438:6;45434:2;45430:15;45423:38;44989:529;45126:41;;;45116:51;;;:6;:51;;;;45109:58;;;;;44953:620;45557:4;45550:11;;44781:799;;;;;;;:::o;46152:126::-;;;;:::o;50794:164::-;50898:10;:17;;;;50871:15;:24;50887:7;50871:24;;;;;;;;;;;:44;;;;50926:10;50942:7;50926:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50794:164;:::o;51585:988::-;51851:22;51901:1;51876:22;51893:4;51876:16;:22::i;:::-;:26;;;;:::i;:::-;51851:51;;51913:18;51934:17;:26;51952:7;51934:26;;;;;;;;;;;;51913:47;;52081:14;52067:10;:28;52063:328;;52112:19;52134:12;:18;52147:4;52134:18;;;;;;;;;;;;;;;:34;52153:14;52134:34;;;;;;;;;;;;52112:56;;52218:11;52185:12;:18;52198:4;52185:18;;;;;;;;;;;;;;;:30;52204:10;52185:30;;;;;;;;;;;:44;;;;52335:10;52302:17;:30;52320:11;52302:30;;;;;;;;;;;:43;;;;52097:294;52063:328;52487:17;:26;52505:7;52487:26;;;;;;;;;;;52480:33;;;52531:12;:18;52544:4;52531:18;;;;;;;;;;;;;;;:34;52550:14;52531:34;;;;;;;;;;;52524:41;;;51666:907;;51585:988;;:::o;52868:1079::-;53121:22;53166:1;53146:10;:17;;;;:21;;;;:::i;:::-;53121:46;;53178:18;53199:15;:24;53215:7;53199:24;;;;;;;;;;;;53178:45;;53550:19;53572:10;53583:14;53572:26;;;;;;;;:::i;:::-;;;;;;;;;;53550:48;;53636:11;53611:10;53622;53611:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;53747:10;53716:15;:28;53732:11;53716:28;;;;;;;;;;;:41;;;;53888:15;:24;53904:7;53888:24;;;;;;;;;;;53881:31;;;53923:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52939:1008;;;52868:1079;:::o;50372:221::-;50457:14;50474:20;50491:2;50474:16;:20::i;:::-;50457:37;;50532:7;50505:12;:16;50518:2;50505:16;;;;;;;;;;;;;;;:24;50522:6;50505:24;;;;;;;;;;;:34;;;;50579:6;50550:17;:26;50568:7;50550:26;;;;;;;;;;;:35;;;;50446:147;50372:221;;:::o;40760:321::-;40890:18;40896:2;40900:7;40890:5;:18::i;:::-;40941:54;40972:1;40976:2;40980:7;40989:5;40941:22;:54::i;:::-;40919:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;40760:321;;;:::o;15272:326::-;15332:4;15589:1;15567:7;:19;;;:23;15560:30;;15272:326;;;:::o;41417:439::-;41511:1;41497:16;;:2;:16;;;41489:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41570:16;41578:7;41570;:16::i;:::-;41569:17;41561:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41632:45;41661:1;41665:2;41669:7;41632:20;:45::i;:::-;41707:1;41690:9;:13;41700:2;41690:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41738:2;41719:7;:16;41727:7;41719:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41783:7;41779:2;41758:33;;41775:1;41758:33;;;;;;;;;;;;41804:44;41832:1;41836:2;41840:7;41804:19;:44::i;:::-;41417:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;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:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:117;6270:1;6267;6260:12;6298:553;6356:8;6366:6;6416:3;6409:4;6401:6;6397:17;6393:27;6383:122;;6424:79;;:::i;:::-;6383:122;6537:6;6524:20;6514:30;;6567:18;6559:6;6556:30;6553:117;;;6589:79;;:::i;:::-;6553:117;6703:4;6695:6;6691:17;6679:29;;6757:3;6749:4;6741:6;6737:17;6727:8;6723:32;6720:41;6717:128;;;6764:79;;:::i;:::-;6717:128;6298:553;;;;;:::o;6857:529::-;6928:6;6936;6985:2;6973:9;6964:7;6960:23;6956:32;6953:119;;;6991:79;;:::i;:::-;6953:119;7139:1;7128:9;7124:17;7111:31;7169:18;7161:6;7158:30;7155:117;;;7191:79;;:::i;:::-;7155:117;7304:65;7361:7;7352:6;7341:9;7337:22;7304:65;:::i;:::-;7286:83;;;;7082:297;6857:529;;;;;:::o;7392:329::-;7451:6;7500:2;7488:9;7479:7;7475:23;7471:32;7468:119;;;7506:79;;:::i;:::-;7468:119;7626:1;7651:53;7696:7;7687:6;7676:9;7672:22;7651:53;:::i;:::-;7641:63;;7597:117;7392:329;;;;:::o;7744:568::-;7817:8;7827:6;7877:3;7870:4;7862:6;7858:17;7854:27;7844:122;;7885:79;;:::i;:::-;7844:122;7998:6;7985:20;7975:30;;8028:18;8020:6;8017:30;8014:117;;;8050:79;;:::i;:::-;8014:117;8164:4;8156:6;8152:17;8140:29;;8218:3;8210:4;8202:6;8198:17;8188:8;8184:32;8181:41;8178:128;;;8225:79;;:::i;:::-;8178:128;7744:568;;;;;:::o;8318:559::-;8404:6;8412;8461:2;8449:9;8440:7;8436:23;8432:32;8429:119;;;8467:79;;:::i;:::-;8429:119;8615:1;8604:9;8600:17;8587:31;8645:18;8637:6;8634:30;8631:117;;;8667:79;;:::i;:::-;8631:117;8780:80;8852:7;8843:6;8832:9;8828:22;8780:80;:::i;:::-;8762:98;;;;8558:312;8318:559;;;;;:::o;8883:114::-;8950:6;8984:5;8978:12;8968:22;;8883:114;;;:::o;9003:184::-;9102:11;9136:6;9131:3;9124:19;9176:4;9171:3;9167:14;9152:29;;9003:184;;;;:::o;9193:132::-;9260:4;9283:3;9275:11;;9313:4;9308:3;9304:14;9296:22;;9193:132;;;:::o;9331:108::-;9408:24;9426:5;9408:24;:::i;:::-;9403:3;9396:37;9331:108;;:::o;9445:179::-;9514:10;9535:46;9577:3;9569:6;9535:46;:::i;:::-;9613:4;9608:3;9604:14;9590:28;;9445:179;;;;:::o;9630:113::-;9700:4;9732;9727:3;9723:14;9715:22;;9630:113;;;:::o;9779:732::-;9898:3;9927:54;9975:5;9927:54;:::i;:::-;9997:86;10076:6;10071:3;9997:86;:::i;:::-;9990:93;;10107:56;10157:5;10107:56;:::i;:::-;10186:7;10217:1;10202:284;10227:6;10224:1;10221:13;10202:284;;;10303:6;10297:13;10330:63;10389:3;10374:13;10330:63;:::i;:::-;10323:70;;10416:60;10469:6;10416:60;:::i;:::-;10406:70;;10262:224;10249:1;10246;10242:9;10237:14;;10202:284;;;10206:14;10502:3;10495:10;;9903:608;;;9779:732;;;;:::o;10517:373::-;10660:4;10698:2;10687:9;10683:18;10675:26;;10747:9;10741:4;10737:20;10733:1;10722:9;10718:17;10711:47;10775:108;10878:4;10869:6;10775:108;:::i;:::-;10767:116;;10517:373;;;;:::o;10896:704::-;10991:6;10999;11007;11056:2;11044:9;11035:7;11031:23;11027:32;11024:119;;;11062:79;;:::i;:::-;11024:119;11210:1;11199:9;11195:17;11182:31;11240:18;11232:6;11229:30;11226:117;;;11262:79;;:::i;:::-;11226:117;11375:80;11447:7;11438:6;11427:9;11423:22;11375:80;:::i;:::-;11357:98;;;;11153:312;11504:2;11530:53;11575:7;11566:6;11555:9;11551:22;11530:53;:::i;:::-;11520:63;;11475:118;10896:704;;;;;:::o;11606:116::-;11676:21;11691:5;11676:21;:::i;:::-;11669:5;11666:32;11656:60;;11712:1;11709;11702:12;11656:60;11606:116;:::o;11728:133::-;11771:5;11809:6;11796:20;11787:29;;11825:30;11849:5;11825:30;:::i;:::-;11728:133;;;;:::o;11867:468::-;11932:6;11940;11989:2;11977:9;11968:7;11964:23;11960:32;11957:119;;;11995:79;;:::i;:::-;11957:119;12115:1;12140:53;12185:7;12176:6;12165:9;12161:22;12140:53;:::i;:::-;12130:63;;12086:117;12242:2;12268:50;12310:7;12301:6;12290:9;12286:22;12268:50;:::i;:::-;12258:60;;12213:115;11867:468;;;;;:::o;12341:117::-;12450:1;12447;12440:12;12464:180;12512:77;12509:1;12502:88;12609:4;12606:1;12599:15;12633:4;12630:1;12623:15;12650:281;12733:27;12755:4;12733:27;:::i;:::-;12725:6;12721:40;12863:6;12851:10;12848:22;12827:18;12815:10;12812:34;12809:62;12806:88;;;12874:18;;:::i;:::-;12806:88;12914:10;12910:2;12903:22;12693:238;12650:281;;:::o;12937:129::-;12971:6;12998:20;;:::i;:::-;12988:30;;13027:33;13055:4;13047:6;13027:33;:::i;:::-;12937:129;;;:::o;13072:307::-;13133:4;13223:18;13215:6;13212:30;13209:56;;;13245:18;;:::i;:::-;13209:56;13283:29;13305:6;13283:29;:::i;:::-;13275:37;;13367:4;13361;13357:15;13349:23;;13072:307;;;:::o;13385:154::-;13469:6;13464:3;13459;13446:30;13531:1;13522:6;13517:3;13513:16;13506:27;13385:154;;;:::o;13545:410::-;13622:5;13647:65;13663:48;13704:6;13663:48;:::i;:::-;13647:65;:::i;:::-;13638:74;;13735:6;13728:5;13721:21;13773:4;13766:5;13762:16;13811:3;13802:6;13797:3;13793:16;13790:25;13787:112;;;13818:79;;:::i;:::-;13787:112;13908:41;13942:6;13937:3;13932;13908:41;:::i;:::-;13628:327;13545:410;;;;;:::o;13974:338::-;14029:5;14078:3;14071:4;14063:6;14059:17;14055:27;14045:122;;14086:79;;:::i;:::-;14045:122;14203:6;14190:20;14228:78;14302:3;14294:6;14287:4;14279:6;14275:17;14228:78;:::i;:::-;14219:87;;14035:277;13974:338;;;;:::o;14318:943::-;14413:6;14421;14429;14437;14486:3;14474:9;14465:7;14461:23;14457:33;14454:120;;;14493:79;;:::i;:::-;14454:120;14613:1;14638:53;14683:7;14674:6;14663:9;14659:22;14638:53;:::i;:::-;14628:63;;14584:117;14740:2;14766:53;14811:7;14802:6;14791:9;14787:22;14766:53;:::i;:::-;14756:63;;14711:118;14868:2;14894:53;14939:7;14930:6;14919:9;14915:22;14894:53;:::i;:::-;14884:63;;14839:118;15024:2;15013:9;15009:18;14996:32;15055:18;15047:6;15044:30;15041:117;;;15077:79;;:::i;:::-;15041:117;15182:62;15236:7;15227:6;15216:9;15212:22;15182:62;:::i;:::-;15172:72;;14967:287;14318:943;;;;;;;:::o;15267:474::-;15335:6;15343;15392:2;15380:9;15371:7;15367:23;15363:32;15360:119;;;15398:79;;:::i;:::-;15360:119;15518:1;15543:53;15588:7;15579:6;15568:9;15564:22;15543:53;:::i;:::-;15533:63;;15489:117;15645:2;15671:53;15716:7;15707:6;15696:9;15692:22;15671:53;:::i;:::-;15661:63;;15616:118;15267:474;;;;;:::o;15747:180::-;15795:77;15792:1;15785:88;15892:4;15889:1;15882:15;15916:4;15913:1;15906:15;15933:320;15977:6;16014:1;16008:4;16004:12;15994:22;;16061:1;16055:4;16051:12;16082:18;16072:81;;16138:4;16130:6;16126:17;16116:27;;16072:81;16200:2;16192:6;16189:14;16169:18;16166:38;16163:84;;16219:18;;:::i;:::-;16163:84;15984:269;15933:320;;;:::o;16259:231::-;16399:34;16395:1;16387:6;16383:14;16376:58;16468:14;16463:2;16455:6;16451:15;16444:39;16259:231;:::o;16496:366::-;16638:3;16659:67;16723:2;16718:3;16659:67;:::i;:::-;16652:74;;16735:93;16824:3;16735:93;:::i;:::-;16853:2;16848:3;16844:12;16837:19;;16496:366;;;:::o;16868:419::-;17034:4;17072:2;17061:9;17057:18;17049:26;;17121:9;17115:4;17111:20;17107:1;17096:9;17092:17;17085:47;17149:131;17275:4;17149:131;:::i;:::-;17141:139;;16868:419;;;:::o;17293:220::-;17433:34;17429:1;17421:6;17417:14;17410:58;17502:3;17497:2;17489:6;17485:15;17478:28;17293:220;:::o;17519:366::-;17661:3;17682:67;17746:2;17741:3;17682:67;:::i;:::-;17675:74;;17758:93;17847:3;17758:93;:::i;:::-;17876:2;17871:3;17867:12;17860:19;;17519:366;;;:::o;17891:419::-;18057:4;18095:2;18084:9;18080:18;18072:26;;18144:9;18138:4;18134:20;18130:1;18119:9;18115:17;18108:47;18172:131;18298:4;18172:131;:::i;:::-;18164:139;;17891:419;;;:::o;18316:243::-;18456:34;18452:1;18444:6;18440:14;18433:58;18525:26;18520:2;18512:6;18508:15;18501:51;18316:243;:::o;18565:366::-;18707:3;18728:67;18792:2;18787:3;18728:67;:::i;:::-;18721:74;;18804:93;18893:3;18804:93;:::i;:::-;18922:2;18917:3;18913:12;18906:19;;18565:366;;;:::o;18937:419::-;19103:4;19141:2;19130:9;19126:18;19118:26;;19190:9;19184:4;19180:20;19176:1;19165:9;19161:17;19154:47;19218:131;19344:4;19218:131;:::i;:::-;19210:139;;18937:419;;;:::o;19362:236::-;19502:34;19498:1;19490:6;19486:14;19479:58;19571:19;19566:2;19558:6;19554:15;19547:44;19362:236;:::o;19604:366::-;19746:3;19767:67;19831:2;19826:3;19767:67;:::i;:::-;19760:74;;19843:93;19932:3;19843:93;:::i;:::-;19961:2;19956:3;19952:12;19945:19;;19604:366;;;:::o;19976:419::-;20142:4;20180:2;20169:9;20165:18;20157:26;;20229:9;20223:4;20219:20;20215:1;20204:9;20200:17;20193:47;20257:131;20383:4;20257:131;:::i;:::-;20249:139;;19976:419;;;:::o;20401:182::-;20541:34;20537:1;20529:6;20525:14;20518:58;20401:182;:::o;20589:366::-;20731:3;20752:67;20816:2;20811:3;20752:67;:::i;:::-;20745:74;;20828:93;20917:3;20828:93;:::i;:::-;20946:2;20941:3;20937:12;20930:19;;20589:366;;;:::o;20961:419::-;21127:4;21165:2;21154:9;21150:18;21142:26;;21214:9;21208:4;21204:20;21200:1;21189:9;21185:17;21178:47;21242:131;21368:4;21242:131;:::i;:::-;21234:139;;20961:419;;;:::o;21386:230::-;21526:34;21522:1;21514:6;21510:14;21503:58;21595:13;21590:2;21582:6;21578:15;21571:38;21386:230;:::o;21622:366::-;21764:3;21785:67;21849:2;21844:3;21785:67;:::i;:::-;21778:74;;21861:93;21950:3;21861:93;:::i;:::-;21979:2;21974:3;21970:12;21963:19;;21622:366;;;:::o;21994:419::-;22160:4;22198:2;22187:9;22183:18;22175:26;;22247:9;22241:4;22237:20;22233:1;22222:9;22218:17;22211:47;22275:131;22401:4;22275:131;:::i;:::-;22267:139;;21994:419;;;:::o;22419:175::-;22559:27;22555:1;22547:6;22543:14;22536:51;22419:175;:::o;22600:366::-;22742:3;22763:67;22827:2;22822:3;22763:67;:::i;:::-;22756:74;;22839:93;22928:3;22839:93;:::i;:::-;22957:2;22952:3;22948:12;22941:19;;22600:366;;;:::o;22972:419::-;23138:4;23176:2;23165:9;23161:18;23153:26;;23225:9;23219:4;23215:20;23211:1;23200:9;23196:17;23189:47;23253:131;23379:4;23253:131;:::i;:::-;23245:139;;22972:419;;;:::o;23397:147::-;23498:11;23535:3;23520:18;;23397:147;;;;:::o;23550:114::-;;:::o;23670:398::-;23829:3;23850:83;23931:1;23926:3;23850:83;:::i;:::-;23843:90;;23942:93;24031:3;23942:93;:::i;:::-;24060:1;24055:3;24051:11;24044:18;;23670:398;;;:::o;24074:379::-;24258:3;24280:147;24423:3;24280:147;:::i;:::-;24273:154;;24444:3;24437:10;;24074:379;;;:::o;24459:166::-;24599:18;24595:1;24587:6;24583:14;24576:42;24459:166;:::o;24631:366::-;24773:3;24794:67;24858:2;24853:3;24794:67;:::i;:::-;24787:74;;24870:93;24959:3;24870:93;:::i;:::-;24988:2;24983:3;24979:12;24972:19;;24631:366;;;:::o;25003:419::-;25169:4;25207:2;25196:9;25192:18;25184:26;;25256:9;25250:4;25246:20;25242:1;25231:9;25227:17;25220:47;25284:131;25410:4;25284:131;:::i;:::-;25276:139;;25003:419;;;:::o;25428:224::-;25568:34;25564:1;25556:6;25552:14;25545:58;25637:7;25632:2;25624:6;25620:15;25613:32;25428:224;:::o;25658:366::-;25800:3;25821:67;25885:2;25880:3;25821:67;:::i;:::-;25814:74;;25897:93;25986:3;25897:93;:::i;:::-;26015:2;26010:3;26006:12;25999:19;;25658:366;;;:::o;26030:419::-;26196:4;26234:2;26223:9;26219:18;26211:26;;26283:9;26277:4;26273:20;26269:1;26258:9;26254:17;26247:47;26311:131;26437:4;26311:131;:::i;:::-;26303:139;;26030:419;;;:::o;26455:171::-;26595:23;26591:1;26583:6;26579:14;26572:47;26455:171;:::o;26632:366::-;26774:3;26795:67;26859:2;26854:3;26795:67;:::i;:::-;26788:74;;26871:93;26960:3;26871:93;:::i;:::-;26989:2;26984:3;26980:12;26973:19;;26632:366;;;:::o;27004:419::-;27170:4;27208:2;27197:9;27193:18;27185:26;;27257:9;27251:4;27247:20;27243:1;27232:9;27228:17;27221:47;27285:131;27411:4;27285:131;:::i;:::-;27277:139;;27004:419;;;:::o;27429:180::-;27477:77;27474:1;27467:88;27574:4;27571:1;27564:15;27598:4;27595:1;27588:15;27615:233;27654:3;27677:24;27695:5;27677:24;:::i;:::-;27668:33;;27723:66;27716:5;27713:77;27710:103;;27793:18;;:::i;:::-;27710:103;27840:1;27833:5;27829:13;27822:20;;27615:233;;;:::o;27854:231::-;27994:34;27990:1;27982:6;27978:14;27971:58;28063:14;28058:2;28050:6;28046:15;28039:39;27854:231;:::o;28091:366::-;28233:3;28254:67;28318:2;28313:3;28254:67;:::i;:::-;28247:74;;28330:93;28419:3;28330:93;:::i;:::-;28448:2;28443:3;28439:12;28432:19;;28091:366;;;:::o;28463:419::-;28629:4;28667:2;28656:9;28652:18;28644:26;;28716:9;28710:4;28706:20;28702:1;28691:9;28687:17;28680:47;28744:131;28870:4;28744:131;:::i;:::-;28736:139;;28463:419;;;:::o;28888:180::-;28936:77;28933:1;28926:88;29033:4;29030:1;29023:15;29057:4;29054:1;29047:15;29074:228;29214:34;29210:1;29202:6;29198:14;29191:58;29283:11;29278:2;29270:6;29266:15;29259:36;29074:228;:::o;29308:366::-;29450:3;29471:67;29535:2;29530:3;29471:67;:::i;:::-;29464:74;;29547:93;29636:3;29547:93;:::i;:::-;29665:2;29660:3;29656:12;29649:19;;29308:366;;;:::o;29680:419::-;29846:4;29884:2;29873:9;29869:18;29861:26;;29933:9;29927:4;29923:20;29919:1;29908:9;29904:17;29897:47;29961:131;30087:4;29961:131;:::i;:::-;29953:139;;29680:419;;;:::o;30105:229::-;30245:34;30241:1;30233:6;30229:14;30222:58;30314:12;30309:2;30301:6;30297:15;30290:37;30105:229;:::o;30340:366::-;30482:3;30503:67;30567:2;30562:3;30503:67;:::i;:::-;30496:74;;30579:93;30668:3;30579:93;:::i;:::-;30697:2;30692:3;30688:12;30681:19;;30340:366;;;:::o;30712:419::-;30878:4;30916:2;30905:9;30901:18;30893:26;;30965:9;30959:4;30955:20;30951:1;30940:9;30936:17;30929:47;30993:131;31119:4;30993:131;:::i;:::-;30985:139;;30712:419;;;:::o;31137:182::-;31277:34;31273:1;31265:6;31261:14;31254:58;31137:182;:::o;31325:366::-;31467:3;31488:67;31552:2;31547:3;31488:67;:::i;:::-;31481:74;;31564:93;31653:3;31564:93;:::i;:::-;31682:2;31677:3;31673:12;31666:19;;31325:366;;;:::o;31697:419::-;31863:4;31901:2;31890:9;31886:18;31878:26;;31950:9;31944:4;31940:20;31936:1;31925:9;31921:17;31914:47;31978:131;32104:4;31978:131;:::i;:::-;31970:139;;31697:419;;;:::o;32122:168::-;32262:20;32258:1;32250:6;32246:14;32239:44;32122:168;:::o;32296:366::-;32438:3;32459:67;32523:2;32518:3;32459:67;:::i;:::-;32452:74;;32535:93;32624:3;32535:93;:::i;:::-;32653:2;32648:3;32644:12;32637:19;;32296:366;;;:::o;32668:419::-;32834:4;32872:2;32861:9;32857:18;32849:26;;32921:9;32915:4;32911:20;32907:1;32896:9;32892:17;32885:47;32949:131;33075:4;32949:131;:::i;:::-;32941:139;;32668:419;;;:::o;33093:223::-;33233:34;33229:1;33221:6;33217:14;33210:58;33302:6;33297:2;33289:6;33285:15;33278:31;33093:223;:::o;33322:366::-;33464:3;33485:67;33549:2;33544:3;33485:67;:::i;:::-;33478:74;;33561:93;33650:3;33561:93;:::i;:::-;33679:2;33674:3;33670:12;33663:19;;33322:366;;;:::o;33694:419::-;33860:4;33898:2;33887:9;33883:18;33875:26;;33947:9;33941:4;33937:20;33933:1;33922:9;33918:17;33911:47;33975:131;34101:4;33975:131;:::i;:::-;33967:139;;33694:419;;;:::o;34119:170::-;34259:22;34255:1;34247:6;34243:14;34236:46;34119:170;:::o;34295:366::-;34437:3;34458:67;34522:2;34517:3;34458:67;:::i;:::-;34451:74;;34534:93;34623:3;34534:93;:::i;:::-;34652:2;34647:3;34643:12;34636:19;;34295:366;;;:::o;34667:419::-;34833:4;34871:2;34860:9;34856:18;34848:26;;34920:9;34914:4;34910:20;34906:1;34895:9;34891:17;34884:47;34948:131;35074:4;34948:131;:::i;:::-;34940:139;;34667:419;;;:::o;35092:220::-;35232:34;35228:1;35220:6;35216:14;35209:58;35301:3;35296:2;35288:6;35284:15;35277:28;35092:220;:::o;35318:366::-;35460:3;35481:67;35545:2;35540:3;35481:67;:::i;:::-;35474:74;;35557:93;35646:3;35557:93;:::i;:::-;35675:2;35670:3;35666:12;35659:19;;35318:366;;;:::o;35690:419::-;35856:4;35894:2;35883:9;35879:18;35871:26;;35943:9;35937:4;35933:20;35929:1;35918:9;35914:17;35907:47;35971:131;36097:4;35971:131;:::i;:::-;35963:139;;35690:419;;;:::o;36115:220::-;36255:34;36251:1;36243:6;36239:14;36232:58;36324:3;36319:2;36311:6;36307:15;36300:28;36115:220;:::o;36341:366::-;36483:3;36504:67;36568:2;36563:3;36504:67;:::i;:::-;36497:74;;36580:93;36669:3;36580:93;:::i;:::-;36698:2;36693:3;36689:12;36682:19;;36341:366;;;:::o;36713:419::-;36879:4;36917:2;36906:9;36902:18;36894:26;;36966:9;36960:4;36956:20;36952:1;36941:9;36937:17;36930:47;36994:131;37120:4;36994:131;:::i;:::-;36986:139;;36713:419;;;:::o;37138:178::-;37278:30;37274:1;37266:6;37262:14;37255:54;37138:178;:::o;37322:366::-;37464:3;37485:67;37549:2;37544:3;37485:67;:::i;:::-;37478:74;;37561:93;37650:3;37561:93;:::i;:::-;37679:2;37674:3;37670:12;37663:19;;37322:366;;;:::o;37694:419::-;37860:4;37898:2;37887:9;37883:18;37875:26;;37947:9;37941:4;37937:20;37933:1;37922:9;37918:17;37911:47;37975:131;38101:4;37975:131;:::i;:::-;37967:139;;37694:419;;;:::o;38119:180::-;38259:32;38255:1;38247:6;38243:14;38236:56;38119:180;:::o;38305:366::-;38447:3;38468:67;38532:2;38527:3;38468:67;:::i;:::-;38461:74;;38544:93;38633:3;38544:93;:::i;:::-;38662:2;38657:3;38653:12;38646:19;;38305:366;;;:::o;38677:419::-;38843:4;38881:2;38870:9;38866:18;38858:26;;38930:9;38924:4;38920:20;38916:1;38905:9;38901:17;38894:47;38958:131;39084:4;38958:131;:::i;:::-;38950:139;;38677:419;;;:::o;39102:191::-;39142:4;39162:20;39180:1;39162:20;:::i;:::-;39157:25;;39196:20;39214:1;39196:20;:::i;:::-;39191:25;;39235:1;39232;39229:8;39226:34;;;39240:18;;:::i;:::-;39226:34;39285:1;39282;39278:9;39270:17;;39102:191;;;;:::o;39299:165::-;39439:17;39435:1;39427:6;39423:14;39416:41;39299:165;:::o;39470:366::-;39612:3;39633:67;39697:2;39692:3;39633:67;:::i;:::-;39626:74;;39709:93;39798:3;39709:93;:::i;:::-;39827:2;39822:3;39818:12;39811:19;;39470:366;;;:::o;39842:419::-;40008:4;40046:2;40035:9;40031:18;40023:26;;40095:9;40089:4;40085:20;40081:1;40070:9;40066:17;40059:47;40123:131;40249:4;40123:131;:::i;:::-;40115:139;;39842:419;;;:::o;40267:148::-;40369:11;40406:3;40391:18;;40267:148;;;;:::o;40421:141::-;40470:4;40493:3;40485:11;;40516:3;40513:1;40506:14;40550:4;40547:1;40537:18;40529:26;;40421:141;;;:::o;40592:845::-;40695:3;40732:5;40726:12;40761:36;40787:9;40761:36;:::i;:::-;40813:89;40895:6;40890:3;40813:89;:::i;:::-;40806:96;;40933:1;40922:9;40918:17;40949:1;40944:137;;;;41095:1;41090:341;;;;40911:520;;40944:137;41028:4;41024:9;41013;41009:25;41004:3;40997:38;41064:6;41059:3;41055:16;41048:23;;40944:137;;41090:341;41157:38;41189:5;41157:38;:::i;:::-;41217:1;41231:154;41245:6;41242:1;41239:13;41231:154;;;41319:7;41313:14;41309:1;41304:3;41300:11;41293:35;41369:1;41360:7;41356:15;41345:26;;41267:4;41264:1;41260:12;41255:17;;41231:154;;;41414:6;41409:3;41405:16;41398:23;;41097:334;;40911:520;;40699:738;;40592:845;;;;:::o;41443:377::-;41549:3;41577:39;41610:5;41577:39;:::i;:::-;41632:89;41714:6;41709:3;41632:89;:::i;:::-;41625:96;;41730:52;41775:6;41770:3;41763:4;41756:5;41752:16;41730:52;:::i;:::-;41807:6;41802:3;41798:16;41791:23;;41553:267;41443:377;;;;:::o;41826:155::-;41966:7;41962:1;41954:6;41950:14;41943:31;41826:155;:::o;41987:400::-;42147:3;42168:84;42250:1;42245:3;42168:84;:::i;:::-;42161:91;;42261:93;42350:3;42261:93;:::i;:::-;42379:1;42374:3;42370:11;42363:18;;41987:400;;;:::o;42393:695::-;42671:3;42693:92;42781:3;42772:6;42693:92;:::i;:::-;42686:99;;42802:95;42893:3;42884:6;42802:95;:::i;:::-;42795:102;;42914:148;43058:3;42914:148;:::i;:::-;42907:155;;43079:3;43072:10;;42393:695;;;;;:::o;43094:225::-;43234:34;43230:1;43222:6;43218:14;43211:58;43303:8;43298:2;43290:6;43286:15;43279:33;43094:225;:::o;43325:366::-;43467:3;43488:67;43552:2;43547:3;43488:67;:::i;:::-;43481:74;;43564:93;43653:3;43564:93;:::i;:::-;43682:2;43677:3;43673:12;43666:19;;43325:366;;;:::o;43697:419::-;43863:4;43901:2;43890:9;43886:18;43878:26;;43950:9;43944:4;43940:20;43936:1;43925:9;43921:17;43914:47;43978:131;44104:4;43978:131;:::i;:::-;43970:139;;43697:419;;;:::o;44122:231::-;44262:34;44258:1;44250:6;44246:14;44239:58;44331:14;44326:2;44318:6;44314:15;44307:39;44122:231;:::o;44359:366::-;44501:3;44522:67;44586:2;44581:3;44522:67;:::i;:::-;44515:74;;44598:93;44687:3;44598:93;:::i;:::-;44716:2;44711:3;44707:12;44700:19;;44359:366;;;:::o;44731:419::-;44897:4;44935:2;44924:9;44920:18;44912:26;;44984:9;44978:4;44974:20;44970:1;44959:9;44955:17;44948:47;45012:131;45138:4;45012:131;:::i;:::-;45004:139;;44731:419;;;:::o;45156:224::-;45296:34;45292:1;45284:6;45280:14;45273:58;45365:7;45360:2;45352:6;45348:15;45341:32;45156:224;:::o;45386:366::-;45528:3;45549:67;45613:2;45608:3;45549:67;:::i;:::-;45542:74;;45625:93;45714:3;45625:93;:::i;:::-;45743:2;45738:3;45734:12;45727:19;;45386:366;;;:::o;45758:419::-;45924:4;45962:2;45951:9;45947:18;45939:26;;46011:9;46005:4;46001:20;45997:1;45986:9;45982:17;45975:47;46039:131;46165:4;46039:131;:::i;:::-;46031:139;;45758:419;;;:::o;46183:223::-;46323:34;46319:1;46311:6;46307:14;46300:58;46392:6;46387:2;46379:6;46375:15;46368:31;46183:223;:::o;46412:366::-;46554:3;46575:67;46639:2;46634:3;46575:67;:::i;:::-;46568:74;;46651:93;46740:3;46651:93;:::i;:::-;46769:2;46764:3;46760:12;46753:19;;46412:366;;;:::o;46784:419::-;46950:4;46988:2;46977:9;46973:18;46965:26;;47037:9;47031:4;47027:20;47023:1;47012:9;47008:17;47001:47;47065:131;47191:4;47065:131;:::i;:::-;47057:139;;46784:419;;;:::o;47209:305::-;47249:3;47268:20;47286:1;47268:20;:::i;:::-;47263:25;;47302:20;47320:1;47302:20;:::i;:::-;47297:25;;47456:1;47388:66;47384:74;47381:1;47378:81;47375:107;;;47462:18;;:::i;:::-;47375:107;47506:1;47503;47499:9;47492:16;;47209:305;;;;:::o;47520:348::-;47560:7;47583:20;47601:1;47583:20;:::i;:::-;47578:25;;47617:20;47635:1;47617:20;:::i;:::-;47612:25;;47805:1;47737:66;47733:74;47730:1;47727:81;47722:1;47715:9;47708:17;47704:105;47701:131;;;47812:18;;:::i;:::-;47701:131;47860:1;47857;47853:9;47842:20;;47520:348;;;;:::o;47874:175::-;48014:27;48010:1;48002:6;47998:14;47991:51;47874:175;:::o;48055:366::-;48197:3;48218:67;48282:2;48277:3;48218:67;:::i;:::-;48211:74;;48294:93;48383:3;48294:93;:::i;:::-;48412:2;48407:3;48403:12;48396:19;;48055:366;;;:::o;48427:419::-;48593:4;48631:2;48620:9;48616:18;48608:26;;48680:9;48674:4;48670:20;48666:1;48655:9;48651:17;48644:47;48708:131;48834:4;48708:131;:::i;:::-;48700:139;;48427:419;;;:::o;48852:237::-;48992:34;48988:1;48980:6;48976:14;48969:58;49061:20;49056:2;49048:6;49044:15;49037:45;48852:237;:::o;49095:366::-;49237:3;49258:67;49322:2;49317:3;49258:67;:::i;:::-;49251:74;;49334:93;49423:3;49334:93;:::i;:::-;49452:2;49447:3;49443:12;49436:19;;49095:366;;;:::o;49467:419::-;49633:4;49671:2;49660:9;49656:18;49648:26;;49720:9;49714:4;49710:20;49706:1;49695:9;49691:17;49684:47;49748:131;49874:4;49748:131;:::i;:::-;49740:139;;49467:419;;;:::o;49892:180::-;49940:77;49937:1;49930:88;50037:4;50034:1;50027:15;50061:4;50058:1;50051:15;50078:185;50118:1;50135:20;50153:1;50135:20;:::i;:::-;50130:25;;50169:20;50187:1;50169:20;:::i;:::-;50164:25;;50208:1;50198:35;;50213:18;;:::i;:::-;50198:35;50255:1;50252;50248:9;50243:14;;50078:185;;;;:::o;50269:176::-;50301:1;50318:20;50336:1;50318:20;:::i;:::-;50313:25;;50352:20;50370:1;50352:20;:::i;:::-;50347:25;;50391:1;50381:35;;50396:18;;:::i;:::-;50381:35;50437:1;50434;50430:9;50425:14;;50269:176;;;;:::o;50451:98::-;50502:6;50536:5;50530:12;50520:22;;50451:98;;;:::o;50555:168::-;50638:11;50672:6;50667:3;50660:19;50712:4;50707:3;50703:14;50688:29;;50555:168;;;;:::o;50729:360::-;50815:3;50843:38;50875:5;50843:38;:::i;:::-;50897:70;50960:6;50955:3;50897:70;:::i;:::-;50890:77;;50976:52;51021:6;51016:3;51009:4;51002:5;50998:16;50976:52;:::i;:::-;51053:29;51075:6;51053:29;:::i;:::-;51048:3;51044:39;51037:46;;50819:270;50729:360;;;;:::o;51095:640::-;51290:4;51328:3;51317:9;51313:19;51305:27;;51342:71;51410:1;51399:9;51395:17;51386:6;51342:71;:::i;:::-;51423:72;51491:2;51480:9;51476:18;51467:6;51423:72;:::i;:::-;51505;51573:2;51562:9;51558:18;51549:6;51505:72;:::i;:::-;51624:9;51618:4;51614:20;51609:2;51598:9;51594:18;51587:48;51652:76;51723:4;51714:6;51652:76;:::i;:::-;51644:84;;51095:640;;;;;;;:::o;51741:141::-;51797:5;51828:6;51822:13;51813:22;;51844:32;51870:5;51844:32;:::i;:::-;51741:141;;;;:::o;51888:349::-;51957:6;52006:2;51994:9;51985:7;51981:23;51977:32;51974:119;;;52012:79;;:::i;:::-;51974:119;52132:1;52157:63;52212:7;52203:6;52192:9;52188:22;52157:63;:::i;:::-;52147:73;;52103:127;51888:349;;;;:::o;52243:180::-;52291:77;52288:1;52281:88;52388:4;52385:1;52378:15;52412:4;52409:1;52402:15;52429:182;52569:34;52565:1;52557:6;52553:14;52546:58;52429:182;:::o;52617:366::-;52759:3;52780:67;52844:2;52839:3;52780:67;:::i;:::-;52773:74;;52856:93;52945:3;52856:93;:::i;:::-;52974:2;52969:3;52965:12;52958:19;;52617:366;;;:::o;52989:419::-;53155:4;53193:2;53182:9;53178:18;53170:26;;53242:9;53236:4;53232:20;53228:1;53217:9;53213:17;53206:47;53270:131;53396:4;53270:131;:::i;:::-;53262:139;;52989:419;;;:::o;53414:178::-;53554:30;53550:1;53542:6;53538:14;53531:54;53414:178;:::o;53598:366::-;53740:3;53761:67;53825:2;53820:3;53761:67;:::i;:::-;53754:74;;53837:93;53926:3;53837:93;:::i;:::-;53955:2;53950:3;53946:12;53939:19;;53598:366;;;:::o;53970:419::-;54136:4;54174:2;54163:9;54159:18;54151:26;;54223:9;54217:4;54213:20;54209:1;54198:9;54194:17;54187:47;54251:131;54377:4;54251:131;:::i;:::-;54243:139;;53970:419;;;:::o

Swarm Source

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

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