ETH Price: $2,620.02 (+1.08%)

Token

GoblinMurlocTown (GOBMUR)
 

Overview

Max Total Supply

1,111 GOBMUR

Holders

108

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 GOBMUR
0x3078aeef4c90e801b4d6f8982b96a8cbe15c601b
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NFT3

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// File: contracts/SixteenBitApes.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/security/ReentrancyGuard.sol

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/interfaces/IERC20.sol

// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol)

pragma solidity ^0.8.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 v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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/interfaces/IERC165.sol

// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;

// File: @openzeppelin/contracts/interfaces/IERC2981.sol

// OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// 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 v4.4.1 (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 tokenId);

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

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

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

pragma solidity ^0.8.0;

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

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

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

// File: contracts/ERC721A.sol

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 private currentIndex = 0;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    /**
     * @dev
     * `maxBatchSize` refers to how much a minter can mint at a time.
     * `collectionSize_` refers to how many tokens are in the collection.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 collectionSize_
    ) {
        require(
            collectionSize_ > 0,
            "ERC721A: collection must have a nonzero supply"
        );
        require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
    }

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

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("ERC721A: unable to get token of owner by index");
    }

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

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

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

    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: transfer to non ERC721Receiver implementer"
        );
    }

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

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - there must be `quantity` tokens remaining unminted in the total collection.
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "ERC721A: mint to the zero address");
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), "ERC721A: token already minted");
        require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

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

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

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

        currentIndex = updatedIndex;
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                    prevOwnership.addr,
                    prevOwnership.startTimestamp
                );
            }
        }

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

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

    uint256 public nextOwnerToExplicitlySet = 0;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "quantity must be nonzero");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > collectionSize - 1) {
            endIndex = collectionSize - 1;
        }
        // We know if the last one in the group exists, all in the group exist, due to serial ordering.
        require(_exists(endIndex), "not enough minted yet for this cleanup");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(
                    ownership.addr,
                    ownership.startTimestamp
                );
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

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

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

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

//SPDX-License-Identifier: MIT
//Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)

pragma solidity ^0.8.0;

contract NFT3 is ERC721A, IERC2981, Ownable, ReentrancyGuard {
    using Counters for Counters.Counter;
    using Strings for uint256;

    Counters.Counter private tokenCounter;

    string private baseURI =
        "ipfs://QmZfURosZQvNLeDhD44yEaPKDW3TiUKHuEskSFK3DmGLLK";
    address private openSeaProxyRegistryAddress =
        0xa5409ec958C83C3f309868babACA7c86DCB077c1;
    bool private isOpenSeaProxyActive = true;

    uint256 public constant MAX_MINTS_PER_TX = 10;
    uint256 public maxSupply = 1111;
    address private addressReceive = 0xcF4A2483A797387A303E032E9aA812C6A15D1784;

    uint256 public constant PRICE = 0.003 ether;
    uint256 public NUM_FREE_MINTS = 700;
    bool public isPublicSaleActive = true;
    mapping(address => uint256) private _walletMintedCount;
    mapping(address => bool) private whliteListAddress;
    // ============ ACCESS CONTROL/SANITY MODIFIERS ============

    modifier publicSaleActive() {
        require(isPublicSaleActive, "Public sale is not open");
        _;
    }

    modifier maxMintsPerTX(uint256 numberOfTokens) {
        require(
            numberOfTokens <= MAX_MINTS_PER_TX,
            "Max mints per transaction exceeded"
        );
        _;
    }

    modifier canMintNFTs(uint256 numberOfTokens) {
        require(
            totalSupply() + numberOfTokens <= maxSupply,
            "Not enough mints remaining to mint"
        );
        _;
    }

    modifier freeMintsAvailable() {
        require(
            totalSupply() <= NUM_FREE_MINTS,
            "Not enough free mints remain"
        );
        _;
    }
    modifier isCorrectNormalMint(uint256 numberOfTokens) {
        require(numberOfTokens <= NUM_FREE_MINTS);
        NUM_FREE_MINTS = NUM_FREE_MINTS - numberOfTokens;
        _;
    }

    constructor()
        ERC721A("GoblinMurlocTown", "GOBMUR", 1001, maxSupply)
    {
        whliteListAddress[0x17556E7Eac64eF4B6D9A934D1d66C9F5A27837Df] = true;
        whliteListAddress[0x3c20a7aEEB08E2efeBA28675c588FF2f7bfE5244] = true;
        whliteListAddress[0x8524c8D5B58A048467AB1e298d52C2E1B3f17188] = true;
        whliteListAddress[0xdD1215F7601BF78e2435144e84aA2E19D55a80b3] = true;
        whliteListAddress[0x7c4Ac3b7E1F22810F22081ECFAcE8434E2653AFf] = true;
        whliteListAddress[0xE42219CF03Bd769F0432736242C67D559144dEfC] = true;
        whliteListAddress[0x63B52B9A0dc6E208Eb9223aEafF86135142Ec7A6] = true;
        whliteListAddress[0xA89Bca7Abfba8Ba4917E45eE899072BaFc1D0719] = true;
        whliteListAddress[0x975a6cCaad6B29F814ee17C8b41Ca326db0f8268] = true;
        whliteListAddress[0x9D758F44D37e4DA638780968c3e089a092E7045C] = true;
        whliteListAddress[0x02995C05941F562b87dD41F0DBE83f83420c8B5c] = true;
        whliteListAddress[0x3729fC600AE0baA5b835CB9DfF7cdbe6366259cB] = true;
        whliteListAddress[0xd41Cc570897A73c97403B32222c88D00620e8A02] = true;
        whliteListAddress[0x2067E564e88A003BA95BDb9b3bD237EB111cC278] = true;
        whliteListAddress[0xe03878897669515701B6e83EB2020AF707aDE206] = true;
        whliteListAddress[0x3132358355C7CC96cbE4d0bA89195b6274594D6D] = true;
        whliteListAddress[0x1C4d87F5989b5995C92655192935e2A553FEC022] = true;
        whliteListAddress[0x4025f3e77D58eBEa66d8bBdb2F1736Bda58dCe29] = true;
        whliteListAddress[0x17F28c703916E0789c61643363C00C5F77C07006] = true;
        whliteListAddress[0x52c049014CdEEF045AC4470E560e26AD89385fB7] = true;
        whliteListAddress[0x86f468ec51d40c29B3f686b05A085eAfFFf22921] = true;
        whliteListAddress[0x332716bA10772Ce0AaCac05882A4d8D7C088146a] = true;
        whliteListAddress[0xe0ea0747AbcB0bF4Ad75CD353f25b33294428C44] = true;
        whliteListAddress[0x87A251bEC5Ff9dB5383655E48694DD89360CAa0F] = true;
        whliteListAddress[0x4FF427f55bA59102A36F0757c6868B1106C0932b] = true;
        whliteListAddress[0xAEb1e2d967cC3480892c7D9dBc3B00a2a0EB5144] = true;
        whliteListAddress[0x990409d73a55caF84A5F187c1F90EfA46936c03a] = true;
        whliteListAddress[0xFF00c7747BC275f65687e5178A5C5294404B8085] = true;
        whliteListAddress[0x57a502b2a82ce8600C6E01CB8F51F5d15B2A6B59] = true;
        whliteListAddress[0xeD546e817B2aA30a526F0A393F519e2240418F93] = true;
        whliteListAddress[0xe0c37966AeAC34B5292D7b5d4dB9292C59546e38] = true;
        whliteListAddress[0x0D03aBf5ba2c47D83A61F5f24c64aE03c45931c7] = true;
        whliteListAddress[0x15c3515d21ce2f899C223dAbE7A67BC2EB15f600] = true;
        whliteListAddress[0x9eCb6684FCE4E6793bb2c950AaC745bCDdCB3Df9] = true;
        whliteListAddress[0x7ADc6aF70356d78586eeef163617C316Abb86Fa5] = true;
        whliteListAddress[0xA9A2C1f2d4276F8474b7F00B1e24832AdC7d879A] = true;
        whliteListAddress[0x040fFd52219792b0a5C790Bf7149295C9cdE5352] = true;
        whliteListAddress[0x59B0bA9790b2bAe5c13A428607d52d31e222CCf9] = true;
        whliteListAddress[0x117df1a9687510a6E2c9E0958C7008B8bBDdd324] = true;
        whliteListAddress[0xeD99e7D8391EDDFdCE5DEf51BdE053EEcc647b66] = true;
        whliteListAddress[0x87fFB7A6b0dFaCbDe9e6b629C7A62c7bD44ef091] = true;
        whliteListAddress[0x082e4c9eaFF4750aAd14cDD1c3987e19b411f344] = true;
        whliteListAddress[0xB9B247B650E194b4156a5C8d741D9A25A080EF72] = true;
        whliteListAddress[0xe87c820A62222c631b3EF03005bBAc2109EfC831] = true;
        whliteListAddress[0x6Aa588340945233cF294C5076cad681b6fe35Ff1] = true;
        whliteListAddress[0x0ceB827B1163B2f61Ad27c54F69f43b1F1C8Ad8D] = true;
        whliteListAddress[0x32F3F9785Cd02bB1029ddFFF7Db2110D84f9E947] = true;
        whliteListAddress[0xDd52f7Bfc9Bd071824cdC03e21F104f5f18f0c6A] = true;
        whliteListAddress[0x41b014f515c051B08d4539bec2aa0D43287f3E2D] = true;
        whliteListAddress[0xa4E85de59B4c4C3254c223F13eF95571dd10e929] = true;
        whliteListAddress[0x2F289150ec3bea3d0923b3De99b6176Cd8743FE2] = true;
        whliteListAddress[0x677A5C35cC1c5f16b8D69f742c132C2559EF9945] = true;
        whliteListAddress[0xf28017B02460Ef9b2712ec3E895bF10F1E01Ef9E] = true;
        whliteListAddress[0x65D578A3361cbb1C3a6b98EA776da0f6b2e74ddF] = true;
        whliteListAddress[0xdf73085ECDFF76cA9f96e5be202fBcc48605f562] = true;
        whliteListAddress[0xA061818F461f21CE0A64c1aF2EC7d9B698f36cF3] = true;
        whliteListAddress[0xCe743D6e345e5a4D3Af3052e7AE3B65389E4dD78] = true;
        whliteListAddress[0x33c431923B1C30d0bC37BA1c0dd136888437FB6b] = true;
        whliteListAddress[0x94199af89F79E3027A7e198b59dd1511EaE51B22] = true;
        whliteListAddress[0xd3012D64160f01da406A7F1B1494723A2d4D6F9D] = true;
        whliteListAddress[0xba27fbeAB81460b68dEDbceA04Be4000602B57e7] = true;
        whliteListAddress[0xF4cfbD41BCf01b7a0A742A3B73941912d1311A45] = true;
        whliteListAddress[0xa36Aa1580Be15759E0a1Db70ba3cC1d4C736F30f] = true;
        whliteListAddress[0x15bfb374c628810CF1bE96D27765e47b61f34263] = true;
        whliteListAddress[0x1eb807b52F9A614e97792E92069d62E8A30e6534] = true;
        whliteListAddress[0x10A4819D8b9948C1fd077b80bFb7a4f2B7Adf753] = true;
        whliteListAddress[0x8095c88EE4FD272EB3BEcc06ca7E7A33ED848268] = true;
        whliteListAddress[0x0c0c9e6396673c57eC5cEA4584639A1c9880245A] = true;
        whliteListAddress[0x0c4331229872a67b98559B1cb60440249BF2620b] = true;
        whliteListAddress[0xFf0629df4767576e537df47a9BAd28D3618073aB] = true;
        whliteListAddress[0x8Cc510B79815CeB59f0D55E53E098285bF6399f4] = true;
        whliteListAddress[0xdff4d08D28F337263c39983BdA3Ec4Eb40A84921] = true;
        whliteListAddress[0xcBB9c73c3efb9FD8e0803302d483df6F24faEDa4] = true;
        whliteListAddress[0xb96AAb890b9673d97c3003c9e432580272e789B3] = true;
        whliteListAddress[0x2bc22c850dCC8Ea15B8f1849541fa55B48497314] = true;
        whliteListAddress[0xC92B68EDCf5f50b6e5F8556F9C274CA766c8Ea9D] = true;
        whliteListAddress[0x40E994cdaCCfF1c4C1831d3162F0F02acE0E6807] = true;
        whliteListAddress[0xC09662c86004d1D56e6e21f0DB2c3aa159E9ee93] = true;
        whliteListAddress[0x594bF320433C21E3e3725fD99b6155abf37ce0D8] = true;
        whliteListAddress[0xfa37FDAB0e70103c011d9E46bE3fBC4B23588013] = true;
    }

    // ============ PUBLIC FUNCTIONS FOR MINTING ============

    function mint(uint256 numberOfTokens)
        external
        payable
        nonReentrant
        publicSaleActive
        isCorrectNormalMint(numberOfTokens)
        canMintNFTs(numberOfTokens)
        maxMintsPerTX(numberOfTokens)
    {
        uint256 mintedSoFar = _walletMintedCount[msg.sender];
        _walletMintedCount[msg.sender] += numberOfTokens;
        uint256 payForCount = numberOfTokens;
        if (mintedSoFar < 2) {
            uint256 remainingFreeMints = 2 - mintedSoFar;
            if (numberOfTokens > remainingFreeMints) {
                payForCount = numberOfTokens - remainingFreeMints;
            } else {
                payForCount = 0;
            }
        }
        require(
            msg.value >= payForCount * PRICE,
            "Ether value sent is not sufficient"
        );

        payable(addressReceive).transfer(address(this).balance);
        _safeMint(msg.sender, numberOfTokens);
    }

    function whiteListMint(uint256 numberOfTokens)
        external
        canMintNFTs(numberOfTokens)
    {
        require(whliteListAddress[msg.sender] == true);
        require(numberOfTokens <= 5);
        _safeMint(msg.sender, numberOfTokens);
    }

    function superMint(uint256 numberOfTokens)
        external
        canMintNFTs(numberOfTokens)
    {
        require(msg.sender == 0xC639132DB51a4B70c35e641f7CC2af979512a6D8);
        _safeMint(msg.sender, numberOfTokens);
    }

    //A simple free mint function to avoid confusion
    //The normal mint function with a cost of 0 would work too

    // ============ PUBLIC READ-ONLY FUNCTIONS ============

    function getBaseURI() external view returns (string memory) {
        return baseURI;
    }

    // ============ OWNER-ONLY ADMIN FUNCTIONS ============

    function setBaseURI(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    // function to disable gasless listings for security in case
    // opensea ever shuts down or is compromised
    function setIsOpenSeaProxyActive(bool _isOpenSeaProxyActive)
        external
        onlyOwner
    {
        isOpenSeaProxyActive = _isOpenSeaProxyActive;
    }

    function setIsPublicSaleActive(bool _isPublicSaleActive)
        external
        onlyOwner
    {
        isPublicSaleActive = _isPublicSaleActive;
    }

    function setNumFreeMints(uint256 _numfreemints) external onlyOwner {
        NUM_FREE_MINTS = _numfreemints;
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function withdrawTokens(IERC20 token) public onlyOwner {
        uint256 balance = token.balanceOf(address(this));
        token.transfer(msg.sender, balance);
    }

    // ============ SUPPORTING FUNCTIONS ============

    function nextTokenId() private returns (uint256) {
        tokenCounter.increment();
        return tokenCounter.current();
    }

    // ============ FUNCTION OVERRIDES ============

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721A, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC2981).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev Override isApprovedForAll to allowlist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        // Get a reference to OpenSea's proxy registry contract by instantiating
        // the contract using the already existing address.
        ProxyRegistry proxyRegistry = ProxyRegistry(
            openSeaProxyRegistryAddress
        );
        if (
            isOpenSeaProxyActive &&
            address(proxyRegistry.proxies(owner)) == operator
        ) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

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

        return string(abi.encodePacked(baseURI, "/", (tokenId + 1).toString()));
    }

    /**
     * @dev See {IERC165-royaltyInfo}.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        require(_exists(tokenId), "Nonexistent token");

        return (address(this), SafeMath.div(SafeMath.mul(salePrice, 5), 100));
    }
}

// These contract definitions are used to create a reference to the OpenSea
// ProxyRegistry contract by using the registry's address (see isApprovedForAll).
contract OwnableDelegateProxy {

}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINTS_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUM_FREE_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isOpenSeaProxyActive","type":"bool"}],"name":"setIsOpenSeaProxyActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPublicSaleActive","type":"bool"}],"name":"setIsPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numfreemints","type":"uint256"}],"name":"setNumFreeMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"superMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"whiteListMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526000805560006007556040518060600160405280603581526020016200769960359139600b90805190602001906200003e92919062002539565b5073a5409ec958c83c3f309868babaca7c86dcb077c1600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c60146101000a81548160ff021916908315150217905550610457600d5573cf4a2483a797387a303e032e9aa812c6a15d1784600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506102bc600f556001601060006101000a81548160ff0219169083151502179055503480156200013857600080fd5b506040518060400160405280601081526020017f476f626c696e4d75726c6f63546f776e000000000000000000000000000000008152506040518060400160405280600681526020017f474f424d555200000000000000000000000000000000000000000000000000008152506103e9600d5460008111620001f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001e89062002670565b60405180910390fd5b6000821162000237576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200022e9062002708565b60405180910390fd5b83600190805190602001906200024f92919062002539565b5082600290805190602001906200026892919062002539565b508160a081815250508060808181525050505050506200029d620002916200246b60201b60201c565b6200247360201b60201c565b60016009819055506001601260007317556e7eac64ef4b6d9a934d1d66c9f5a27837df73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000733c20a7aeeb08e2efeba28675c588ff2f7bfe524473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000738524c8d5b58a048467ab1e298d52c2e1b3f1718873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073dd1215f7601bf78e2435144e84aa2e19d55a80b373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000737c4ac3b7e1f22810f22081ecface8434e2653aff73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073e42219cf03bd769f0432736242c67d559144defc73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007363b52b9a0dc6e208eb9223aeaff86135142ec7a673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073a89bca7abfba8ba4917e45ee899072bafc1d071973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073975a6ccaad6b29f814ee17c8b41ca326db0f826873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000739d758f44d37e4da638780968c3e089a092e7045c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007302995c05941f562b87dd41f0dbe83f83420c8b5c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000733729fc600ae0baa5b835cb9dff7cdbe6366259cb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073d41cc570897a73c97403b32222c88d00620e8a0273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000732067e564e88a003ba95bdb9b3bd237eb111cc27873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073e03878897669515701b6e83eb2020af707ade20673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000733132358355c7cc96cbe4d0ba89195b6274594d6d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000731c4d87f5989b5995c92655192935e2a553fec02273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000734025f3e77d58ebea66d8bbdb2f1736bda58dce2973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007317f28c703916e0789c61643363c00c5f77c0700673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007352c049014cdeef045ac4470e560e26ad89385fb773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007386f468ec51d40c29b3f686b05a085eaffff2292173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073332716ba10772ce0aacac05882a4d8d7c088146a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073e0ea0747abcb0bf4ad75cd353f25b33294428c4473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007387a251bec5ff9db5383655e48694dd89360caa0f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000734ff427f55ba59102a36f0757c6868b1106c0932b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073aeb1e2d967cc3480892c7d9dbc3b00a2a0eb514473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073990409d73a55caf84a5f187c1f90efa46936c03a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073ff00c7747bc275f65687e5178a5c5294404b808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007357a502b2a82ce8600c6e01cb8f51f5d15b2a6b5973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073ed546e817b2aa30a526f0a393f519e2240418f9373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073e0c37966aeac34b5292d7b5d4db9292c59546e3873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000730d03abf5ba2c47d83a61f5f24c64ae03c45931c773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007315c3515d21ce2f899c223dabe7a67bc2eb15f60073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000739ecb6684fce4e6793bb2c950aac745bcddcb3df973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000737adc6af70356d78586eeef163617c316abb86fa573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073a9a2c1f2d4276f8474b7f00b1e24832adc7d879a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073040ffd52219792b0a5c790bf7149295c9cde535273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007359b0ba9790b2bae5c13a428607d52d31e222ccf973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073117df1a9687510a6e2c9e0958c7008b8bbddd32473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073ed99e7d8391eddfdce5def51bde053eecc647b6673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007387ffb7a6b0dfacbde9e6b629c7a62c7bd44ef09173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073082e4c9eaff4750aad14cdd1c3987e19b411f34473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073b9b247b650e194b4156a5c8d741d9a25a080ef7273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073e87c820a62222c631b3ef03005bbac2109efc83173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000736aa588340945233cf294c5076cad681b6fe35ff173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000730ceb827b1163b2f61ad27c54f69f43b1f1c8ad8d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007332f3f9785cd02bb1029ddfff7db2110d84f9e94773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073dd52f7bfc9bd071824cdc03e21f104f5f18f0c6a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007341b014f515c051b08d4539bec2aa0d43287f3e2d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073a4e85de59b4c4c3254c223f13ef95571dd10e92973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000732f289150ec3bea3d0923b3de99b6176cd8743fe273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073677a5c35cc1c5f16b8d69f742c132c2559ef994573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073f28017b02460ef9b2712ec3e895bf10f1e01ef9e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007365d578a3361cbb1c3a6b98ea776da0f6b2e74ddf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073df73085ecdff76ca9f96e5be202fbcc48605f56273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073a061818f461f21ce0a64c1af2ec7d9b698f36cf373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073ce743d6e345e5a4d3af3052e7ae3b65389e4dd7873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007333c431923b1c30d0bc37ba1c0dd136888437fb6b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007394199af89f79e3027a7e198b59dd1511eae51b2273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073d3012d64160f01da406a7f1b1494723a2d4d6f9d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073ba27fbeab81460b68dedbcea04be4000602b57e773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073f4cfbd41bcf01b7a0a742a3b73941912d1311a4573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073a36aa1580be15759e0a1db70ba3cc1d4c736f30f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007315bfb374c628810cf1be96d27765e47b61f3426373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000731eb807b52f9a614e97792e92069d62e8a30e653473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007310a4819d8b9948c1fd077b80bfb7a4f2b7adf75373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000738095c88ee4fd272eb3becc06ca7e7a33ed84826873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000730c0c9e6396673c57ec5cea4584639a1c9880245a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000730c4331229872a67b98559b1cb60440249bf2620b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073ff0629df4767576e537df47a9bad28d3618073ab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000738cc510b79815ceb59f0d55e53e098285bf6399f473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073dff4d08d28f337263c39983bda3ec4eb40a8492173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073cbb9c73c3efb9fd8e0803302d483df6f24faeda473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073b96aab890b9673d97c3003c9e432580272e789b373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000732bc22c850dcc8ea15b8f1849541fa55b4849731473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073c92b68edcf5f50b6e5f8556f9c274ca766c8ea9d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601260007340e994cdaccff1c4c1831d3162f0f02ace0e680773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073c09662c86004d1d56e6e21f0db2c3aa159e9ee9373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073594bf320433c21e3e3725fd99b6155abf37ce0d873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600073fa37fdab0e70103c011d9e46be3fbc4b2358801373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200278e565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620025479062002759565b90600052602060002090601f0160209004810192826200256b5760008555620025b7565b82601f106200258657805160ff1916838001178555620025b7565b82800160010185558215620025b7579182015b82811115620025b657825182559160200191906001019062002599565b5b509050620025c69190620025ca565b5090565b5b80821115620025e5576000816000905550600101620025cb565b5090565b600082825260208201905092915050565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b600062002658602e83620025e9565b91506200266582620025fa565b604082019050919050565b600060208201905081810360008301526200268b8162002649565b9050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b6000620026f0602783620025e9565b9150620026fd8262002692565b604082019050919050565b600060208201905081810360008301526200272381620026e1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200277257607f821691505b6020821081036200278857620027876200272a565b5b50919050565b60805160a051614eda620027bf6000396000818161270d015281816127360152612e27015260005050614eda6000f3fe60806040526004361061020f5760003560e01c806370a0823111610118578063a22cb465116100a0578063d5abeb011161006f578063d5abeb011461078d578063d7224ba0146107b8578063e43082f7146107e3578063e985e9c51461080c578063f2fde38b146108495761020f565b8063a22cb465146106d3578063b88d4fde146106fc578063c6a91b4214610725578063c87b56dd146107505761020f565b80638d859f3e116100e75780638d859f3e1461060b5780638da5cb5b1461063657806395d89b4114610661578063982d669e1461068c578063a0712d68146106b75761020f565b806370a0823114610563578063714c5398146105a0578063715018a6146105cb5780638415c954146105e25761020f565b806328cad13d1161019b57806342842e0e1161016a57806342842e0e1461046e57806349df728c146104975780634f6ccce7146104c057806355f804b3146104fd5780636352211e146105265761020f565b806328cad13d146103b35780632a55205a146103dc5780632f745c591461041a5780633ccfd60b146104575761020f565b8063095ea7b3116101e2578063095ea7b3146102e25780630a00ae831461030b57806318160ddd146103345780631e84c4131461035f57806323b872dd1461038a5761020f565b806301ffc9a71461021457806302e001ef1461025157806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906133ad565b610872565b60405161024891906133f5565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190613446565b6108ec565b005b34801561028657600080fd5b5061028f6109bd565b60405161029c919061350c565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c79190613446565b610a4f565b6040516102d9919061356f565b60405180910390f35b3480156102ee57600080fd5b50610309600480360381019061030491906135b6565b610ad4565b005b34801561031757600080fd5b50610332600480360381019061032d9190613446565b610bec565b005b34801561034057600080fd5b50610349610c72565b6040516103569190613605565b60405180910390f35b34801561036b57600080fd5b50610374610c7b565b60405161038191906133f5565b60405180910390f35b34801561039657600080fd5b506103b160048036038101906103ac9190613620565b610c8e565b005b3480156103bf57600080fd5b506103da60048036038101906103d5919061369f565b610c9e565b005b3480156103e857600080fd5b5061040360048036038101906103fe91906136cc565b610d37565b60405161041192919061370c565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c91906135b6565b610da3565b60405161044e9190613605565b60405180910390f35b34801561046357600080fd5b5061046c610f9f565b005b34801561047a57600080fd5b5061049560048036038101906104909190613620565b61106a565b005b3480156104a357600080fd5b506104be60048036038101906104b99190613773565b61108a565b005b3480156104cc57600080fd5b506104e760048036038101906104e29190613446565b611207565b6040516104f49190613605565b60405180910390f35b34801561050957600080fd5b50610524600480360381019061051f91906138d5565b61125a565b005b34801561053257600080fd5b5061054d60048036038101906105489190613446565b6112f0565b60405161055a919061356f565b60405180910390f35b34801561056f57600080fd5b5061058a6004803603810190610585919061391e565b611306565b6040516105979190613605565b60405180910390f35b3480156105ac57600080fd5b506105b56113ee565b6040516105c2919061350c565b60405180910390f35b3480156105d757600080fd5b506105e0611480565b005b3480156105ee57600080fd5b5061060960048036038101906106049190613446565b611508565b005b34801561061757600080fd5b506106206115ba565b60405161062d9190613605565b60405180910390f35b34801561064257600080fd5b5061064b6115c5565b604051610658919061356f565b60405180910390f35b34801561066d57600080fd5b506106766115ef565b604051610683919061350c565b60405180910390f35b34801561069857600080fd5b506106a1611681565b6040516106ae9190613605565b60405180910390f35b6106d160048036038101906106cc9190613446565b611687565b005b3480156106df57600080fd5b506106fa60048036038101906106f5919061394b565b611997565b005b34801561070857600080fd5b50610723600480360381019061071e9190613a2c565b611b17565b005b34801561073157600080fd5b5061073a611b73565b6040516107479190613605565b60405180910390f35b34801561075c57600080fd5b5061077760048036038101906107729190613446565b611b78565b604051610784919061350c565b60405180910390f35b34801561079957600080fd5b506107a2611c00565b6040516107af9190613605565b60405180910390f35b3480156107c457600080fd5b506107cd611c06565b6040516107da9190613605565b60405180910390f35b3480156107ef57600080fd5b5061080a6004803603810190610805919061369f565b611c0c565b005b34801561081857600080fd5b50610833600480360381019061082e9190613aaf565b611ca5565b60405161084091906133f5565b60405180910390f35b34801561085557600080fd5b50610870600480360381019061086b919061391e565b611db0565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e557506108e482611ea7565b5b9050919050565b80600d54816108f9610c72565b6109039190613b1e565b1115610944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093b90613be6565b60405180910390fd5b60011515601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146109a157600080fd5b60058211156109af57600080fd5b6109b93383611ff1565b5050565b6060600180546109cc90613c35565b80601f01602080910402602001604051908101604052809291908181526020018280546109f890613c35565b8015610a455780601f10610a1a57610100808354040283529160200191610a45565b820191906000526020600020905b815481529060010190602001808311610a2857829003601f168201915b5050505050905090565b6000610a5a8261200f565b610a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9090613cd8565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610adf826112f0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4690613d6a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b6e61201c565b73ffffffffffffffffffffffffffffffffffffffff161480610b9d5750610b9c81610b9761201c565b611ca5565b5b610bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd390613dfc565b60405180910390fd5b610be7838383612024565b505050565b610bf461201c565b73ffffffffffffffffffffffffffffffffffffffff16610c126115c5565b73ffffffffffffffffffffffffffffffffffffffff1614610c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5f90613e68565b60405180910390fd5b80600f8190555050565b60008054905090565b601060009054906101000a900460ff1681565b610c998383836120d6565b505050565b610ca661201c565b73ffffffffffffffffffffffffffffffffffffffff16610cc46115c5565b73ffffffffffffffffffffffffffffffffffffffff1614610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1190613e68565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b600080610d438461200f565b610d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7990613ed4565b60405180910390fd5b30610d98610d9185600561268d565b60646126a3565b915091509250929050565b6000610dae83611306565b8210610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de690613f66565b60405180910390fd5b6000610df9610c72565b905060008060005b83811015610f5d576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ef357806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f4957868403610f3a578195505050505050610f99565b8380610f4590613f86565b9450505b508080610f5590613f86565b915050610e01565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9090614040565b60405180910390fd5b92915050565b610fa761201c565b73ffffffffffffffffffffffffffffffffffffffff16610fc56115c5565b73ffffffffffffffffffffffffffffffffffffffff161461101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101290613e68565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611066573d6000803e3d6000fd5b5050565b61108583838360405180602001604052806000815250611b17565b505050565b61109261201c565b73ffffffffffffffffffffffffffffffffffffffff166110b06115c5565b73ffffffffffffffffffffffffffffffffffffffff1614611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd90613e68565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611141919061356f565b602060405180830381865afa15801561115e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111829190614075565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016111bf92919061370c565b6020604051808303816000875af11580156111de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120291906140b7565b505050565b6000611211610c72565b8210611252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124990614156565b60405180910390fd5b819050919050565b61126261201c565b73ffffffffffffffffffffffffffffffffffffffff166112806115c5565b73ffffffffffffffffffffffffffffffffffffffff16146112d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cd90613e68565b60405180910390fd5b80600b90805190602001906112ec929190613264565b5050565b60006112fb826126b9565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136d906141e8565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6060600b80546113fd90613c35565b80601f016020809104026020016040519081016040528092919081815260200182805461142990613c35565b80156114765780601f1061144b57610100808354040283529160200191611476565b820191906000526020600020905b81548152906001019060200180831161145957829003601f168201915b5050505050905090565b61148861201c565b73ffffffffffffffffffffffffffffffffffffffff166114a66115c5565b73ffffffffffffffffffffffffffffffffffffffff16146114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f390613e68565b60405180910390fd5b61150660006128bc565b565b80600d5481611515610c72565b61151f9190613b1e565b1115611560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155790613be6565b60405180910390fd5b73c639132db51a4b70c35e641f7cc2af979512a6d873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115ac57600080fd5b6115b63383611ff1565b5050565b660aa87bee53800081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115fe90613c35565b80601f016020809104026020016040519081016040528092919081815260200182805461162a90613c35565b80156116775780601f1061164c57610100808354040283529160200191611677565b820191906000526020600020905b81548152906001019060200180831161165a57829003601f168201915b5050505050905090565b600f5481565b6002600954036116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c390614254565b60405180910390fd5b6002600981905550601060009054906101000a900460ff16611723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171a906142c0565b60405180910390fd5b80600f5481111561173357600080fd5b80600f5461174191906142e0565b600f8190555081600d5481611754610c72565b61175e9190613b1e565b111561179f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179690613be6565b60405180910390fd5b82600a8111156117e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117db90614386565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118779190613b1e565b92505081905550600085905060028210156118bf57600082600261189b91906142e0565b9050808711156118b85780876118b191906142e0565b91506118bd565b600091505b505b660aa87bee538000816118d291906143a6565b341015611914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190b90614472565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561197c573d6000803e3d6000fd5b506119873387611ff1565b5050505050600160098190555050565b61199f61201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a03906144de565b60405180910390fd5b8060066000611a1961201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ac661201c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b0b91906133f5565b60405180910390a35050565b611b228484846120d6565b611b2e84848484612982565b611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6490614570565b60405180910390fd5b50505050565b600a81565b6060611b838261200f565b611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb990613ed4565b60405180910390fd5b600b611bd9600184611bd49190613b1e565b612b09565b604051602001611bea9291906146ac565b6040516020818303038152906040529050919050565b600d5481565b60075481565b611c1461201c565b73ffffffffffffffffffffffffffffffffffffffff16611c326115c5565b73ffffffffffffffffffffffffffffffffffffffff1614611c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7f90613e68565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c60149054906101000a900460ff168015611d8d57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611d34919061356f565b602060405180830381865afa158015611d51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d759190614719565b73ffffffffffffffffffffffffffffffffffffffff16145b15611d9c576001915050611daa565b611da68484612c69565b9150505b92915050565b611db861201c565b73ffffffffffffffffffffffffffffffffffffffff16611dd66115c5565b73ffffffffffffffffffffffffffffffffffffffff1614611e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2390613e68565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e92906147b8565b60405180910390fd5b611ea4816128bc565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f7257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fda57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fea5750611fe982612cfd565b5b9050919050565b61200b828260405180602001604052806000815250612d67565b5050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006120e1826126b9565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661210861201c565b73ffffffffffffffffffffffffffffffffffffffff161480612164575061212d61201c565b73ffffffffffffffffffffffffffffffffffffffff1661214c84610a4f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612180575061217f826000015161217a61201c565b611ca5565b5b9050806121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b99061484a565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222b906148dc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a9061496e565b60405180910390fd5b6122b08585856001613245565b6122c06000848460000151612024565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661232e91906149aa565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166123d291906149de565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846124d89190613b1e565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361261d5761254d8161200f565b1561261c576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612685868686600161324b565b505050505050565b6000818361269b91906143a6565b905092915050565b600081836126b19190614a53565b905092915050565b6126c16132ea565b6126ca8261200f565b612709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270090614af6565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000831061276d5760017f00000000000000000000000000000000000000000000000000000000000000008461276091906142e0565b61276a9190613b1e565b90505b60008390505b81811061287b576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612867578093505050506128b7565b50808061287390614b16565b915050612773565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ae90614bb1565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006129a38473ffffffffffffffffffffffffffffffffffffffff16613251565b15612afc578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129cc61201c565b8786866040518563ffffffff1660e01b81526004016129ee9493929190614c26565b6020604051808303816000875af1925050508015612a2a57506040513d601f19601f82011682018060405250810190612a279190614c87565b60015b612aac573d8060008114612a5a576040519150601f19603f3d011682016040523d82523d6000602084013e612a5f565b606091505b506000815103612aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9b90614570565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b01565b600190505b949350505050565b606060008203612b50576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c64565b600082905060005b60008214612b82578080612b6b90613f86565b915050600a82612b7b9190614a53565b9150612b58565b60008167ffffffffffffffff811115612b9e57612b9d6137aa565b5b6040519080825280601f01601f191660200182016040528015612bd05781602001600182028036833780820191505090505b5090505b60008514612c5d57600182612be991906142e0565b9150600a85612bf89190614cb4565b6030612c049190613b1e565b60f81b818381518110612c1a57612c19614ce5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c569190614a53565b9450612bd4565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd390614d86565b60405180910390fd5b612de58161200f565b15612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614df2565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115612e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7f90614e84565b60405180910390fd5b612e956000858386613245565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612f9291906149de565b6fffffffffffffffffffffffffffffffff168152602001858360200151612fb991906149de565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561322857818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131c86000888488612982565b613207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fe90614570565b60405180910390fd5b818061321290613f86565b925050808061322090613f86565b915050613157565b508060008190555061323d600087858861324b565b505050505050565b50505050565b50505050565b600080823b905060008111915050919050565b82805461327090613c35565b90600052602060002090601f01602090048101928261329257600085556132d9565b82601f106132ab57805160ff19168380011785556132d9565b828001600101855582156132d9579182015b828111156132d85782518255916020019190600101906132bd565b5b5090506132e69190613324565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561333d576000816000905550600101613325565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61338a81613355565b811461339557600080fd5b50565b6000813590506133a781613381565b92915050565b6000602082840312156133c3576133c261334b565b5b60006133d184828501613398565b91505092915050565b60008115159050919050565b6133ef816133da565b82525050565b600060208201905061340a60008301846133e6565b92915050565b6000819050919050565b61342381613410565b811461342e57600080fd5b50565b6000813590506134408161341a565b92915050565b60006020828403121561345c5761345b61334b565b5b600061346a84828501613431565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134ad578082015181840152602081019050613492565b838111156134bc576000848401525b50505050565b6000601f19601f8301169050919050565b60006134de82613473565b6134e8818561347e565b93506134f881856020860161348f565b613501816134c2565b840191505092915050565b6000602082019050818103600083015261352681846134d3565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135598261352e565b9050919050565b6135698161354e565b82525050565b60006020820190506135846000830184613560565b92915050565b6135938161354e565b811461359e57600080fd5b50565b6000813590506135b08161358a565b92915050565b600080604083850312156135cd576135cc61334b565b5b60006135db858286016135a1565b92505060206135ec85828601613431565b9150509250929050565b6135ff81613410565b82525050565b600060208201905061361a60008301846135f6565b92915050565b6000806000606084860312156136395761363861334b565b5b6000613647868287016135a1565b9350506020613658868287016135a1565b925050604061366986828701613431565b9150509250925092565b61367c816133da565b811461368757600080fd5b50565b60008135905061369981613673565b92915050565b6000602082840312156136b5576136b461334b565b5b60006136c38482850161368a565b91505092915050565b600080604083850312156136e3576136e261334b565b5b60006136f185828601613431565b925050602061370285828601613431565b9150509250929050565b60006040820190506137216000830185613560565b61372e60208301846135f6565b9392505050565b60006137408261354e565b9050919050565b61375081613735565b811461375b57600080fd5b50565b60008135905061376d81613747565b92915050565b6000602082840312156137895761378861334b565b5b60006137978482850161375e565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137e2826134c2565b810181811067ffffffffffffffff82111715613801576138006137aa565b5b80604052505050565b6000613814613341565b905061382082826137d9565b919050565b600067ffffffffffffffff8211156138405761383f6137aa565b5b613849826134c2565b9050602081019050919050565b82818337600083830152505050565b600061387861387384613825565b61380a565b905082815260208101848484011115613894576138936137a5565b5b61389f848285613856565b509392505050565b600082601f8301126138bc576138bb6137a0565b5b81356138cc848260208601613865565b91505092915050565b6000602082840312156138eb576138ea61334b565b5b600082013567ffffffffffffffff81111561390957613908613350565b5b613915848285016138a7565b91505092915050565b6000602082840312156139345761393361334b565b5b6000613942848285016135a1565b91505092915050565b600080604083850312156139625761396161334b565b5b6000613970858286016135a1565b92505060206139818582860161368a565b9150509250929050565b600067ffffffffffffffff8211156139a6576139a56137aa565b5b6139af826134c2565b9050602081019050919050565b60006139cf6139ca8461398b565b61380a565b9050828152602081018484840111156139eb576139ea6137a5565b5b6139f6848285613856565b509392505050565b600082601f830112613a1357613a126137a0565b5b8135613a238482602086016139bc565b91505092915050565b60008060008060808587031215613a4657613a4561334b565b5b6000613a54878288016135a1565b9450506020613a65878288016135a1565b9350506040613a7687828801613431565b925050606085013567ffffffffffffffff811115613a9757613a96613350565b5b613aa3878288016139fe565b91505092959194509250565b60008060408385031215613ac657613ac561334b565b5b6000613ad4858286016135a1565b9250506020613ae5858286016135a1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b2982613410565b9150613b3483613410565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b6957613b68613aef565b5b828201905092915050565b7f4e6f7420656e6f756768206d696e74732072656d61696e696e6720746f206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bd060228361347e565b9150613bdb82613b74565b604082019050919050565b60006020820190508181036000830152613bff81613bc3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c4d57607f821691505b602082108103613c6057613c5f613c06565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613cc2602d8361347e565b9150613ccd82613c66565b604082019050919050565b60006020820190508181036000830152613cf181613cb5565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d5460228361347e565b9150613d5f82613cf8565b604082019050919050565b60006020820190508181036000830152613d8381613d47565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000613de660398361347e565b9150613df182613d8a565b604082019050919050565b60006020820190508181036000830152613e1581613dd9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e5260208361347e565b9150613e5d82613e1c565b602082019050919050565b60006020820190508181036000830152613e8181613e45565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b6000613ebe60118361347e565b9150613ec982613e88565b602082019050919050565b60006020820190508181036000830152613eed81613eb1565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f5060228361347e565b9150613f5b82613ef4565b604082019050919050565b60006020820190508181036000830152613f7f81613f43565b9050919050565b6000613f9182613410565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613fc357613fc2613aef565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b600061402a602e8361347e565b915061403582613fce565b604082019050919050565b600060208201905081810360008301526140598161401d565b9050919050565b60008151905061406f8161341a565b92915050565b60006020828403121561408b5761408a61334b565b5b600061409984828501614060565b91505092915050565b6000815190506140b181613673565b92915050565b6000602082840312156140cd576140cc61334b565b5b60006140db848285016140a2565b91505092915050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b600061414060238361347e565b915061414b826140e4565b604082019050919050565b6000602082019050818103600083015261416f81614133565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006141d2602b8361347e565b91506141dd82614176565b604082019050919050565b60006020820190508181036000830152614201816141c5565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061423e601f8361347e565b915061424982614208565b602082019050919050565b6000602082019050818103600083015261426d81614231565b9050919050565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b60006142aa60178361347e565b91506142b582614274565b602082019050919050565b600060208201905081810360008301526142d98161429d565b9050919050565b60006142eb82613410565b91506142f683613410565b92508282101561430957614308613aef565b5b828203905092915050565b7f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b600061437060228361347e565b915061437b82614314565b604082019050919050565b6000602082019050818103600083015261439f81614363565b9050919050565b60006143b182613410565b91506143bc83613410565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143f5576143f4613aef565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420737566666963696560008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b600061445c60228361347e565b915061446782614400565b604082019050919050565b6000602082019050818103600083015261448b8161444f565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b60006144c8601a8361347e565b91506144d382614492565b602082019050919050565b600060208201905081810360008301526144f7816144bb565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b600061455a60338361347e565b9150614565826144fe565b604082019050919050565b600060208201905081810360008301526145898161454d565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546145bd81613c35565b6145c78186614590565b945060018216600081146145e257600181146145f357614626565b60ff19831686528186019350614626565b6145fc8561459b565b60005b8381101561461e578154818901526001820191506020810190506145ff565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614665600183614590565b91506146708261462f565b600182019050919050565b600061468682613473565b6146908185614590565b93506146a081856020860161348f565b80840191505092915050565b60006146b882856145b0565b91506146c382614658565b91506146cf828461467b565b91508190509392505050565b60006146e68261354e565b9050919050565b6146f6816146db565b811461470157600080fd5b50565b600081519050614713816146ed565b92915050565b60006020828403121561472f5761472e61334b565b5b600061473d84828501614704565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006147a260268361347e565b91506147ad82614746565b604082019050919050565b600060208201905081810360008301526147d181614795565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b600061483460328361347e565b915061483f826147d8565b604082019050919050565b6000602082019050818103600083015261486381614827565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006148c660268361347e565b91506148d18261486a565b604082019050919050565b600060208201905081810360008301526148f5816148b9565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061495860258361347e565b9150614963826148fc565b604082019050919050565b600060208201905081810360008301526149878161494b565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006149b58261498e565b91506149c08361498e565b9250828210156149d3576149d2613aef565b5b828203905092915050565b60006149e98261498e565b91506149f48361498e565b9250826fffffffffffffffffffffffffffffffff03821115614a1957614a18613aef565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a5e82613410565b9150614a6983613410565b925082614a7957614a78614a24565b5b828204905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000614ae0602a8361347e565b9150614aeb82614a84565b604082019050919050565b60006020820190508181036000830152614b0f81614ad3565b9050919050565b6000614b2182613410565b915060008203614b3457614b33613aef565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000614b9b602f8361347e565b9150614ba682614b3f565b604082019050919050565b60006020820190508181036000830152614bca81614b8e565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614bf882614bd1565b614c028185614bdc565b9350614c1281856020860161348f565b614c1b816134c2565b840191505092915050565b6000608082019050614c3b6000830187613560565b614c486020830186613560565b614c5560408301856135f6565b8181036060830152614c678184614bed565b905095945050505050565b600081519050614c8181613381565b92915050565b600060208284031215614c9d57614c9c61334b565b5b6000614cab84828501614c72565b91505092915050565b6000614cbf82613410565b9150614cca83613410565b925082614cda57614cd9614a24565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614d7060218361347e565b9150614d7b82614d14565b604082019050919050565b60006020820190508181036000830152614d9f81614d63565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000614ddc601d8361347e565b9150614de782614da6565b602082019050919050565b60006020820190508181036000830152614e0b81614dcf565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6000614e6e60228361347e565b9150614e7982614e12565b604082019050919050565b60006020820190508181036000830152614e9d81614e61565b905091905056fea26469706673582212203bce37b92cd77845e1d01ba527d5ac5606254e9944f3079270542c2160209c1764736f6c634300080e0033697066733a2f2f516d5a6655526f735a51764e4c654468443434794561504b4457335469554b487545736b53464b33446d474c4c4b

Deployed Bytecode

0x60806040526004361061020f5760003560e01c806370a0823111610118578063a22cb465116100a0578063d5abeb011161006f578063d5abeb011461078d578063d7224ba0146107b8578063e43082f7146107e3578063e985e9c51461080c578063f2fde38b146108495761020f565b8063a22cb465146106d3578063b88d4fde146106fc578063c6a91b4214610725578063c87b56dd146107505761020f565b80638d859f3e116100e75780638d859f3e1461060b5780638da5cb5b1461063657806395d89b4114610661578063982d669e1461068c578063a0712d68146106b75761020f565b806370a0823114610563578063714c5398146105a0578063715018a6146105cb5780638415c954146105e25761020f565b806328cad13d1161019b57806342842e0e1161016a57806342842e0e1461046e57806349df728c146104975780634f6ccce7146104c057806355f804b3146104fd5780636352211e146105265761020f565b806328cad13d146103b35780632a55205a146103dc5780632f745c591461041a5780633ccfd60b146104575761020f565b8063095ea7b3116101e2578063095ea7b3146102e25780630a00ae831461030b57806318160ddd146103345780631e84c4131461035f57806323b872dd1461038a5761020f565b806301ffc9a71461021457806302e001ef1461025157806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906133ad565b610872565b60405161024891906133f5565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190613446565b6108ec565b005b34801561028657600080fd5b5061028f6109bd565b60405161029c919061350c565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c79190613446565b610a4f565b6040516102d9919061356f565b60405180910390f35b3480156102ee57600080fd5b50610309600480360381019061030491906135b6565b610ad4565b005b34801561031757600080fd5b50610332600480360381019061032d9190613446565b610bec565b005b34801561034057600080fd5b50610349610c72565b6040516103569190613605565b60405180910390f35b34801561036b57600080fd5b50610374610c7b565b60405161038191906133f5565b60405180910390f35b34801561039657600080fd5b506103b160048036038101906103ac9190613620565b610c8e565b005b3480156103bf57600080fd5b506103da60048036038101906103d5919061369f565b610c9e565b005b3480156103e857600080fd5b5061040360048036038101906103fe91906136cc565b610d37565b60405161041192919061370c565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c91906135b6565b610da3565b60405161044e9190613605565b60405180910390f35b34801561046357600080fd5b5061046c610f9f565b005b34801561047a57600080fd5b5061049560048036038101906104909190613620565b61106a565b005b3480156104a357600080fd5b506104be60048036038101906104b99190613773565b61108a565b005b3480156104cc57600080fd5b506104e760048036038101906104e29190613446565b611207565b6040516104f49190613605565b60405180910390f35b34801561050957600080fd5b50610524600480360381019061051f91906138d5565b61125a565b005b34801561053257600080fd5b5061054d60048036038101906105489190613446565b6112f0565b60405161055a919061356f565b60405180910390f35b34801561056f57600080fd5b5061058a6004803603810190610585919061391e565b611306565b6040516105979190613605565b60405180910390f35b3480156105ac57600080fd5b506105b56113ee565b6040516105c2919061350c565b60405180910390f35b3480156105d757600080fd5b506105e0611480565b005b3480156105ee57600080fd5b5061060960048036038101906106049190613446565b611508565b005b34801561061757600080fd5b506106206115ba565b60405161062d9190613605565b60405180910390f35b34801561064257600080fd5b5061064b6115c5565b604051610658919061356f565b60405180910390f35b34801561066d57600080fd5b506106766115ef565b604051610683919061350c565b60405180910390f35b34801561069857600080fd5b506106a1611681565b6040516106ae9190613605565b60405180910390f35b6106d160048036038101906106cc9190613446565b611687565b005b3480156106df57600080fd5b506106fa60048036038101906106f5919061394b565b611997565b005b34801561070857600080fd5b50610723600480360381019061071e9190613a2c565b611b17565b005b34801561073157600080fd5b5061073a611b73565b6040516107479190613605565b60405180910390f35b34801561075c57600080fd5b5061077760048036038101906107729190613446565b611b78565b604051610784919061350c565b60405180910390f35b34801561079957600080fd5b506107a2611c00565b6040516107af9190613605565b60405180910390f35b3480156107c457600080fd5b506107cd611c06565b6040516107da9190613605565b60405180910390f35b3480156107ef57600080fd5b5061080a6004803603810190610805919061369f565b611c0c565b005b34801561081857600080fd5b50610833600480360381019061082e9190613aaf565b611ca5565b60405161084091906133f5565b60405180910390f35b34801561085557600080fd5b50610870600480360381019061086b919061391e565b611db0565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e557506108e482611ea7565b5b9050919050565b80600d54816108f9610c72565b6109039190613b1e565b1115610944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093b90613be6565b60405180910390fd5b60011515601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146109a157600080fd5b60058211156109af57600080fd5b6109b93383611ff1565b5050565b6060600180546109cc90613c35565b80601f01602080910402602001604051908101604052809291908181526020018280546109f890613c35565b8015610a455780601f10610a1a57610100808354040283529160200191610a45565b820191906000526020600020905b815481529060010190602001808311610a2857829003601f168201915b5050505050905090565b6000610a5a8261200f565b610a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9090613cd8565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610adf826112f0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4690613d6a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b6e61201c565b73ffffffffffffffffffffffffffffffffffffffff161480610b9d5750610b9c81610b9761201c565b611ca5565b5b610bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd390613dfc565b60405180910390fd5b610be7838383612024565b505050565b610bf461201c565b73ffffffffffffffffffffffffffffffffffffffff16610c126115c5565b73ffffffffffffffffffffffffffffffffffffffff1614610c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5f90613e68565b60405180910390fd5b80600f8190555050565b60008054905090565b601060009054906101000a900460ff1681565b610c998383836120d6565b505050565b610ca661201c565b73ffffffffffffffffffffffffffffffffffffffff16610cc46115c5565b73ffffffffffffffffffffffffffffffffffffffff1614610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1190613e68565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b600080610d438461200f565b610d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7990613ed4565b60405180910390fd5b30610d98610d9185600561268d565b60646126a3565b915091509250929050565b6000610dae83611306565b8210610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de690613f66565b60405180910390fd5b6000610df9610c72565b905060008060005b83811015610f5d576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ef357806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f4957868403610f3a578195505050505050610f99565b8380610f4590613f86565b9450505b508080610f5590613f86565b915050610e01565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9090614040565b60405180910390fd5b92915050565b610fa761201c565b73ffffffffffffffffffffffffffffffffffffffff16610fc56115c5565b73ffffffffffffffffffffffffffffffffffffffff161461101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101290613e68565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611066573d6000803e3d6000fd5b5050565b61108583838360405180602001604052806000815250611b17565b505050565b61109261201c565b73ffffffffffffffffffffffffffffffffffffffff166110b06115c5565b73ffffffffffffffffffffffffffffffffffffffff1614611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd90613e68565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611141919061356f565b602060405180830381865afa15801561115e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111829190614075565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016111bf92919061370c565b6020604051808303816000875af11580156111de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120291906140b7565b505050565b6000611211610c72565b8210611252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124990614156565b60405180910390fd5b819050919050565b61126261201c565b73ffffffffffffffffffffffffffffffffffffffff166112806115c5565b73ffffffffffffffffffffffffffffffffffffffff16146112d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cd90613e68565b60405180910390fd5b80600b90805190602001906112ec929190613264565b5050565b60006112fb826126b9565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136d906141e8565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6060600b80546113fd90613c35565b80601f016020809104026020016040519081016040528092919081815260200182805461142990613c35565b80156114765780601f1061144b57610100808354040283529160200191611476565b820191906000526020600020905b81548152906001019060200180831161145957829003601f168201915b5050505050905090565b61148861201c565b73ffffffffffffffffffffffffffffffffffffffff166114a66115c5565b73ffffffffffffffffffffffffffffffffffffffff16146114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f390613e68565b60405180910390fd5b61150660006128bc565b565b80600d5481611515610c72565b61151f9190613b1e565b1115611560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155790613be6565b60405180910390fd5b73c639132db51a4b70c35e641f7cc2af979512a6d873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115ac57600080fd5b6115b63383611ff1565b5050565b660aa87bee53800081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115fe90613c35565b80601f016020809104026020016040519081016040528092919081815260200182805461162a90613c35565b80156116775780601f1061164c57610100808354040283529160200191611677565b820191906000526020600020905b81548152906001019060200180831161165a57829003601f168201915b5050505050905090565b600f5481565b6002600954036116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c390614254565b60405180910390fd5b6002600981905550601060009054906101000a900460ff16611723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171a906142c0565b60405180910390fd5b80600f5481111561173357600080fd5b80600f5461174191906142e0565b600f8190555081600d5481611754610c72565b61175e9190613b1e565b111561179f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179690613be6565b60405180910390fd5b82600a8111156117e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117db90614386565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118779190613b1e565b92505081905550600085905060028210156118bf57600082600261189b91906142e0565b9050808711156118b85780876118b191906142e0565b91506118bd565b600091505b505b660aa87bee538000816118d291906143a6565b341015611914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190b90614472565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561197c573d6000803e3d6000fd5b506119873387611ff1565b5050505050600160098190555050565b61199f61201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a03906144de565b60405180910390fd5b8060066000611a1961201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ac661201c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b0b91906133f5565b60405180910390a35050565b611b228484846120d6565b611b2e84848484612982565b611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6490614570565b60405180910390fd5b50505050565b600a81565b6060611b838261200f565b611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb990613ed4565b60405180910390fd5b600b611bd9600184611bd49190613b1e565b612b09565b604051602001611bea9291906146ac565b6040516020818303038152906040529050919050565b600d5481565b60075481565b611c1461201c565b73ffffffffffffffffffffffffffffffffffffffff16611c326115c5565b73ffffffffffffffffffffffffffffffffffffffff1614611c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7f90613e68565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c60149054906101000a900460ff168015611d8d57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611d34919061356f565b602060405180830381865afa158015611d51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d759190614719565b73ffffffffffffffffffffffffffffffffffffffff16145b15611d9c576001915050611daa565b611da68484612c69565b9150505b92915050565b611db861201c565b73ffffffffffffffffffffffffffffffffffffffff16611dd66115c5565b73ffffffffffffffffffffffffffffffffffffffff1614611e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2390613e68565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e92906147b8565b60405180910390fd5b611ea4816128bc565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f7257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fda57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fea5750611fe982612cfd565b5b9050919050565b61200b828260405180602001604052806000815250612d67565b5050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006120e1826126b9565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661210861201c565b73ffffffffffffffffffffffffffffffffffffffff161480612164575061212d61201c565b73ffffffffffffffffffffffffffffffffffffffff1661214c84610a4f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612180575061217f826000015161217a61201c565b611ca5565b5b9050806121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b99061484a565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222b906148dc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a9061496e565b60405180910390fd5b6122b08585856001613245565b6122c06000848460000151612024565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661232e91906149aa565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166123d291906149de565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846124d89190613b1e565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361261d5761254d8161200f565b1561261c576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612685868686600161324b565b505050505050565b6000818361269b91906143a6565b905092915050565b600081836126b19190614a53565b905092915050565b6126c16132ea565b6126ca8261200f565b612709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270090614af6565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000003e9831061276d5760017f00000000000000000000000000000000000000000000000000000000000003e98461276091906142e0565b61276a9190613b1e565b90505b60008390505b81811061287b576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612867578093505050506128b7565b50808061287390614b16565b915050612773565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ae90614bb1565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006129a38473ffffffffffffffffffffffffffffffffffffffff16613251565b15612afc578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129cc61201c565b8786866040518563ffffffff1660e01b81526004016129ee9493929190614c26565b6020604051808303816000875af1925050508015612a2a57506040513d601f19601f82011682018060405250810190612a279190614c87565b60015b612aac573d8060008114612a5a576040519150601f19603f3d011682016040523d82523d6000602084013e612a5f565b606091505b506000815103612aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9b90614570565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b01565b600190505b949350505050565b606060008203612b50576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c64565b600082905060005b60008214612b82578080612b6b90613f86565b915050600a82612b7b9190614a53565b9150612b58565b60008167ffffffffffffffff811115612b9e57612b9d6137aa565b5b6040519080825280601f01601f191660200182016040528015612bd05781602001600182028036833780820191505090505b5090505b60008514612c5d57600182612be991906142e0565b9150600a85612bf89190614cb4565b6030612c049190613b1e565b60f81b818381518110612c1a57612c19614ce5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c569190614a53565b9450612bd4565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd390614d86565b60405180910390fd5b612de58161200f565b15612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614df2565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000003e9831115612e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7f90614e84565b60405180910390fd5b612e956000858386613245565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612f9291906149de565b6fffffffffffffffffffffffffffffffff168152602001858360200151612fb991906149de565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561322857818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131c86000888488612982565b613207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fe90614570565b60405180910390fd5b818061321290613f86565b925050808061322090613f86565b915050613157565b508060008190555061323d600087858861324b565b505050505050565b50505050565b50505050565b600080823b905060008111915050919050565b82805461327090613c35565b90600052602060002090601f01602090048101928261329257600085556132d9565b82601f106132ab57805160ff19168380011785556132d9565b828001600101855582156132d9579182015b828111156132d85782518255916020019190600101906132bd565b5b5090506132e69190613324565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561333d576000816000905550600101613325565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61338a81613355565b811461339557600080fd5b50565b6000813590506133a781613381565b92915050565b6000602082840312156133c3576133c261334b565b5b60006133d184828501613398565b91505092915050565b60008115159050919050565b6133ef816133da565b82525050565b600060208201905061340a60008301846133e6565b92915050565b6000819050919050565b61342381613410565b811461342e57600080fd5b50565b6000813590506134408161341a565b92915050565b60006020828403121561345c5761345b61334b565b5b600061346a84828501613431565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134ad578082015181840152602081019050613492565b838111156134bc576000848401525b50505050565b6000601f19601f8301169050919050565b60006134de82613473565b6134e8818561347e565b93506134f881856020860161348f565b613501816134c2565b840191505092915050565b6000602082019050818103600083015261352681846134d3565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135598261352e565b9050919050565b6135698161354e565b82525050565b60006020820190506135846000830184613560565b92915050565b6135938161354e565b811461359e57600080fd5b50565b6000813590506135b08161358a565b92915050565b600080604083850312156135cd576135cc61334b565b5b60006135db858286016135a1565b92505060206135ec85828601613431565b9150509250929050565b6135ff81613410565b82525050565b600060208201905061361a60008301846135f6565b92915050565b6000806000606084860312156136395761363861334b565b5b6000613647868287016135a1565b9350506020613658868287016135a1565b925050604061366986828701613431565b9150509250925092565b61367c816133da565b811461368757600080fd5b50565b60008135905061369981613673565b92915050565b6000602082840312156136b5576136b461334b565b5b60006136c38482850161368a565b91505092915050565b600080604083850312156136e3576136e261334b565b5b60006136f185828601613431565b925050602061370285828601613431565b9150509250929050565b60006040820190506137216000830185613560565b61372e60208301846135f6565b9392505050565b60006137408261354e565b9050919050565b61375081613735565b811461375b57600080fd5b50565b60008135905061376d81613747565b92915050565b6000602082840312156137895761378861334b565b5b60006137978482850161375e565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137e2826134c2565b810181811067ffffffffffffffff82111715613801576138006137aa565b5b80604052505050565b6000613814613341565b905061382082826137d9565b919050565b600067ffffffffffffffff8211156138405761383f6137aa565b5b613849826134c2565b9050602081019050919050565b82818337600083830152505050565b600061387861387384613825565b61380a565b905082815260208101848484011115613894576138936137a5565b5b61389f848285613856565b509392505050565b600082601f8301126138bc576138bb6137a0565b5b81356138cc848260208601613865565b91505092915050565b6000602082840312156138eb576138ea61334b565b5b600082013567ffffffffffffffff81111561390957613908613350565b5b613915848285016138a7565b91505092915050565b6000602082840312156139345761393361334b565b5b6000613942848285016135a1565b91505092915050565b600080604083850312156139625761396161334b565b5b6000613970858286016135a1565b92505060206139818582860161368a565b9150509250929050565b600067ffffffffffffffff8211156139a6576139a56137aa565b5b6139af826134c2565b9050602081019050919050565b60006139cf6139ca8461398b565b61380a565b9050828152602081018484840111156139eb576139ea6137a5565b5b6139f6848285613856565b509392505050565b600082601f830112613a1357613a126137a0565b5b8135613a238482602086016139bc565b91505092915050565b60008060008060808587031215613a4657613a4561334b565b5b6000613a54878288016135a1565b9450506020613a65878288016135a1565b9350506040613a7687828801613431565b925050606085013567ffffffffffffffff811115613a9757613a96613350565b5b613aa3878288016139fe565b91505092959194509250565b60008060408385031215613ac657613ac561334b565b5b6000613ad4858286016135a1565b9250506020613ae5858286016135a1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b2982613410565b9150613b3483613410565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b6957613b68613aef565b5b828201905092915050565b7f4e6f7420656e6f756768206d696e74732072656d61696e696e6720746f206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bd060228361347e565b9150613bdb82613b74565b604082019050919050565b60006020820190508181036000830152613bff81613bc3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c4d57607f821691505b602082108103613c6057613c5f613c06565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613cc2602d8361347e565b9150613ccd82613c66565b604082019050919050565b60006020820190508181036000830152613cf181613cb5565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d5460228361347e565b9150613d5f82613cf8565b604082019050919050565b60006020820190508181036000830152613d8381613d47565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000613de660398361347e565b9150613df182613d8a565b604082019050919050565b60006020820190508181036000830152613e1581613dd9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e5260208361347e565b9150613e5d82613e1c565b602082019050919050565b60006020820190508181036000830152613e8181613e45565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b6000613ebe60118361347e565b9150613ec982613e88565b602082019050919050565b60006020820190508181036000830152613eed81613eb1565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f5060228361347e565b9150613f5b82613ef4565b604082019050919050565b60006020820190508181036000830152613f7f81613f43565b9050919050565b6000613f9182613410565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613fc357613fc2613aef565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b600061402a602e8361347e565b915061403582613fce565b604082019050919050565b600060208201905081810360008301526140598161401d565b9050919050565b60008151905061406f8161341a565b92915050565b60006020828403121561408b5761408a61334b565b5b600061409984828501614060565b91505092915050565b6000815190506140b181613673565b92915050565b6000602082840312156140cd576140cc61334b565b5b60006140db848285016140a2565b91505092915050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b600061414060238361347e565b915061414b826140e4565b604082019050919050565b6000602082019050818103600083015261416f81614133565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006141d2602b8361347e565b91506141dd82614176565b604082019050919050565b60006020820190508181036000830152614201816141c5565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061423e601f8361347e565b915061424982614208565b602082019050919050565b6000602082019050818103600083015261426d81614231565b9050919050565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b60006142aa60178361347e565b91506142b582614274565b602082019050919050565b600060208201905081810360008301526142d98161429d565b9050919050565b60006142eb82613410565b91506142f683613410565b92508282101561430957614308613aef565b5b828203905092915050565b7f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b600061437060228361347e565b915061437b82614314565b604082019050919050565b6000602082019050818103600083015261439f81614363565b9050919050565b60006143b182613410565b91506143bc83613410565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143f5576143f4613aef565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420737566666963696560008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b600061445c60228361347e565b915061446782614400565b604082019050919050565b6000602082019050818103600083015261448b8161444f565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b60006144c8601a8361347e565b91506144d382614492565b602082019050919050565b600060208201905081810360008301526144f7816144bb565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b600061455a60338361347e565b9150614565826144fe565b604082019050919050565b600060208201905081810360008301526145898161454d565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546145bd81613c35565b6145c78186614590565b945060018216600081146145e257600181146145f357614626565b60ff19831686528186019350614626565b6145fc8561459b565b60005b8381101561461e578154818901526001820191506020810190506145ff565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614665600183614590565b91506146708261462f565b600182019050919050565b600061468682613473565b6146908185614590565b93506146a081856020860161348f565b80840191505092915050565b60006146b882856145b0565b91506146c382614658565b91506146cf828461467b565b91508190509392505050565b60006146e68261354e565b9050919050565b6146f6816146db565b811461470157600080fd5b50565b600081519050614713816146ed565b92915050565b60006020828403121561472f5761472e61334b565b5b600061473d84828501614704565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006147a260268361347e565b91506147ad82614746565b604082019050919050565b600060208201905081810360008301526147d181614795565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b600061483460328361347e565b915061483f826147d8565b604082019050919050565b6000602082019050818103600083015261486381614827565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006148c660268361347e565b91506148d18261486a565b604082019050919050565b600060208201905081810360008301526148f5816148b9565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061495860258361347e565b9150614963826148fc565b604082019050919050565b600060208201905081810360008301526149878161494b565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006149b58261498e565b91506149c08361498e565b9250828210156149d3576149d2613aef565b5b828203905092915050565b60006149e98261498e565b91506149f48361498e565b9250826fffffffffffffffffffffffffffffffff03821115614a1957614a18613aef565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a5e82613410565b9150614a6983613410565b925082614a7957614a78614a24565b5b828204905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000614ae0602a8361347e565b9150614aeb82614a84565b604082019050919050565b60006020820190508181036000830152614b0f81614ad3565b9050919050565b6000614b2182613410565b915060008203614b3457614b33613aef565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000614b9b602f8361347e565b9150614ba682614b3f565b604082019050919050565b60006020820190508181036000830152614bca81614b8e565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614bf882614bd1565b614c028185614bdc565b9350614c1281856020860161348f565b614c1b816134c2565b840191505092915050565b6000608082019050614c3b6000830187613560565b614c486020830186613560565b614c5560408301856135f6565b8181036060830152614c678184614bed565b905095945050505050565b600081519050614c8181613381565b92915050565b600060208284031215614c9d57614c9c61334b565b5b6000614cab84828501614c72565b91505092915050565b6000614cbf82613410565b9150614cca83613410565b925082614cda57614cd9614a24565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614d7060218361347e565b9150614d7b82614d14565b604082019050919050565b60006020820190508181036000830152614d9f81614d63565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000614ddc601d8361347e565b9150614de782614da6565b602082019050919050565b60006020820190508181036000830152614e0b81614dcf565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6000614e6e60228361347e565b9150614e7982614e12565b604082019050919050565b60006020820190508181036000830152614e9d81614e61565b905091905056fea26469706673582212203bce37b92cd77845e1d01ba527d5ac5606254e9944f3079270542c2160209c1764736f6c634300080e0033

Deployed Bytecode Sourcemap

57925:13210:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69344:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67220:259;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45774:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47469:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46990:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68641:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42169:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58630:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48496:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68475:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70814:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;42877:864;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68765:143;;;;;;;;;;;;;:::i;:::-;;48729:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68916:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42346:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68077:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45583:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44299:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67913:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19355:103;;;;;;;;;;;;;:::i;:::-;;67487:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58538:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18704:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45943:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58588:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66248:964;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47833:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48977:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58364:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70461:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58416:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53858:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68301:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69773:617;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19613:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69344:292;69492:4;69549:26;69534:41;;;:11;:41;;;;:94;;;;69592:36;69616:11;69592:23;:36::i;:::-;69534:94;69514:114;;69344:292;;;:::o;67220:259::-;67306:14;59297:9;;59279:14;59263:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:43;;59241:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;67379:4:::1;67346:37;;:17;:29;67364:10;67346:29;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;67338:46;;;::::0;::::1;;67421:1;67403:14;:19;;67395:28;;;::::0;::::1;;67434:37;67444:10;67456:14;67434:9;:37::i;:::-;67220:259:::0;;:::o;45774:100::-;45828:13;45861:5;45854:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45774:100;:::o;47469:292::-;47573:7;47620:16;47628:7;47620;:16::i;:::-;47598:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;47729:15;:24;47745:7;47729:24;;;;;;;;;;;;;;;;;;;;;47722:31;;47469:292;;;:::o;46990:413::-;47063:13;47079:24;47095:7;47079:15;:24::i;:::-;47063:40;;47128:5;47122:11;;:2;:11;;;47114:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47223:5;47207:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;47232:37;47249:5;47256:12;:10;:12::i;:::-;47232:16;:37::i;:::-;47207:62;47185:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;47367:28;47376:2;47380:7;47389:5;47367:8;:28::i;:::-;47052:351;46990:413;;:::o;68641:116::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68736:13:::1;68719:14;:30;;;;68641:116:::0;:::o;42169:100::-;42222:7;42249:12;;42242:19;;42169:100;:::o;58630:37::-;;;;;;;;;;;;;:::o;48496:162::-;48622:28;48632:4;48638:2;48642:7;48622:9;:28::i;:::-;48496:162;;;:::o;68475:158::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68606:19:::1;68585:18;;:40;;;;;;;;;;;;;;;;;;68475:158:::0;:::o;70814:318::-;70939:16;70957:21;71004:16;71012:7;71004;:16::i;:::-;70996:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;71071:4;71078:45;71091:26;71104:9;71115:1;71091:12;:26::i;:::-;71119:3;71078:12;:45::i;:::-;71055:69;;;;70814:318;;;;;:::o;42877:864::-;43002:7;43043:16;43053:5;43043:9;:16::i;:::-;43035:5;:24;43027:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43109:22;43134:13;:11;:13::i;:::-;43109:38;;43158:19;43192:25;43246:9;43241:426;43265:14;43261:1;:18;43241:426;;;43301:31;43335:11;:14;43347:1;43335:14;;;;;;;;;;;43301:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43394:1;43368:28;;:9;:14;;;:28;;;43364:103;;43437:9;:14;;;43417:34;;43364:103;43506:5;43485:26;;:17;:26;;;43481:175;;43551:5;43536:11;:20;43532:77;;43588:1;43581:8;;;;;;;;;43532:77;43627:13;;;;;:::i;:::-;;;;43481:175;43286:381;43281:3;;;;;:::i;:::-;;;;43241:426;;;;43677:56;;;;;;;;;;:::i;:::-;;;;;;;;42877:864;;;;;:::o;68765:143::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68813:15:::1;68831:21;68813:39;;68871:10;68863:28;;:37;68892:7;68863:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;68802:106;68765:143::o:0;48729:177::-;48859:39;48876:4;48882:2;48886:7;48859:39;;;;;;;;;;;;:16;:39::i;:::-;48729:177;;;:::o;68916:168::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68982:15:::1;69000:5;:15;;;69024:4;69000:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68982:48;;69041:5;:14;;;69056:10;69068:7;69041:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68971:113;68916:168:::0;:::o;42346:228::-;42449:7;42490:13;:11;:13::i;:::-;42482:5;:21;42474:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;42561:5;42554:12;;42346:228;;;:::o;68077:100::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68161:8:::1;68151:7;:18;;;;;;;;;;;;:::i;:::-;;68077:100:::0;:::o;45583:124::-;45647:7;45674:20;45686:7;45674:11;:20::i;:::-;:25;;;45667:32;;45583:124;;;:::o;44299:258::-;44363:7;44422:1;44405:19;;:5;:19;;;44383:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;44521:12;:19;44534:5;44521:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;44513:36;;44506:43;;44299:258;;;:::o;67913:93::-;67958:13;67991:7;67984:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67913:93;:::o;19355:103::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19420:30:::1;19447:1;19420:18;:30::i;:::-;19355:103::o:0;67487:235::-;67569:14;59297:9;;59279:14;59263:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:43;;59241:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;67623:42:::1;67609:56;;:10;:56;;;67601:65;;;::::0;::::1;;67677:37;67687:10;67699:14;67677:9;:37::i;:::-;67487:235:::0;;:::o;58538:43::-;58570:11;58538:43;:::o;18704:87::-;18750:7;18777:6;;;;;;;;;;;18770:13;;18704:87;:::o;45943:104::-;45999:13;46032:7;46025:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45943:104;:::o;58588:35::-;;;;:::o;66248:964::-;10511:1;11109:7;;:19;11101:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10511:1;11242:7;:18;;;;58907::::1;;;;;;;;;;;58899:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;66398:14:::2;59662;;59644;:32;;59636:41;;;::::0;::::2;;59722:14;59705;;:31;;;;:::i;:::-;59688:14;:48;;;;66435:14:::3;59297:9;;59279:14;59263:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:43;;59241:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;66474:14:::4;58407:2;59061:14;:34;;59039:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;66506:19:::5;66528:18;:30;66547:10;66528:30;;;;;;;;;;;;;;;;66506:52;;66603:14;66569:18;:30;66588:10;66569:30;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;66628:19;66650:14;66628:36;;66693:1;66679:11;:15;66675:287;;;66711:26;66744:11;66740:1;:15;;;;:::i;:::-;66711:44;;66791:18;66774:14;:35;66770:181;;;66861:18;66844:14;:35;;;;:::i;:::-;66830:49;;66770:181;;;66934:1;66920:15;;66770:181;66696:266;66675:287;58570:11;67007;:19;;;;:::i;:::-;66994:9;:32;;66972:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;67109:14;;;;;;;;;;;67101:32;;:55;67134:21;67101:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::5;;;;;;67167:37;67177:10;67189:14;67167:9;:37::i;:::-;66495:717;;59379:1:::4;59747::::3;58964::::2;10467::::0;11421:7;:22;;;;66248:964;:::o;47833:311::-;47963:12;:10;:12::i;:::-;47951:24;;:8;:24;;;47943:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;48064:8;48019:18;:32;48038:12;:10;:12::i;:::-;48019:32;;;;;;;;;;;;;;;:42;48052:8;48019:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;48117:8;48088:48;;48103:12;:10;:12::i;:::-;48088:48;;;48127:8;48088:48;;;;;;:::i;:::-;;;;;;;;47833:311;;:::o;48977:355::-;49136:28;49146:4;49152:2;49156:7;49136:9;:28::i;:::-;49197:48;49220:4;49226:2;49230:7;49239:5;49197:22;:48::i;:::-;49175:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;48977:355;;;;:::o;58364:45::-;58407:2;58364:45;:::o;70461:287::-;70579:13;70618:16;70626:7;70618;:16::i;:::-;70610:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;70700:7;70714:24;70725:1;70715:7;:11;;;;:::i;:::-;70714:22;:24::i;:::-;70683:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70669:71;;70461:287;;;:::o;58416:31::-;;;;:::o;53858:43::-;;;;:::o;68301:166::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68438:21:::1;68415:20;;:44;;;;;;;;;;;;;;;;;;68301:166:::0;:::o;69773:617::-;69898:4;70063:27;70121;;;;;;;;;;;70063:96;;70188:20;;;;;;;;;;;:86;;;;;70266:8;70225:49;;70233:13;:21;;;70255:5;70233:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70225:49;;;70188:86;70170:154;;;70308:4;70301:11;;;;;70170:154;70343:39;70366:5;70373:8;70343:22;:39::i;:::-;70336:46;;;69773:617;;;;;:::o;19613:238::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19736:1:::1;19716:22;;:8;:22;;::::0;19694:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19815:28;19834:8;19815:18;:28::i;:::-;19613:238:::0;:::o;43813:422::-;43960:4;44017:25;44002:40;;;:11;:40;;;;:105;;;;44074:33;44059:48;;;:11;:48;;;;44002:105;:172;;;;44139:35;44124:50;;;:11;:50;;;;44002:172;:225;;;;44191:36;44215:11;44191:23;:36::i;:::-;44002:225;43982:245;;43813:422;;;:::o;49706:104::-;49775:27;49785:2;49789:8;49775:27;;;;;;;;;;;;:9;:27::i;:::-;49706:104;;:::o;49587:111::-;49644:4;49678:12;;49668:7;:22;49661:29;;49587:111;;;:::o;17407:98::-;17460:7;17487:10;17480:17;;17407:98;:::o;53654:196::-;53796:2;53769:15;:24;53785:7;53769:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;53834:7;53830:2;53814:28;;53823:5;53814:28;;;;;;;;;;;;53654:196;;;:::o;51827:1709::-;51942:35;51980:20;51992:7;51980:11;:20::i;:::-;51942:58;;52013:22;52055:13;:18;;;52039:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;52114:12;:10;:12::i;:::-;52090:36;;:20;52102:7;52090:11;:20::i;:::-;:36;;;52039:87;:154;;;;52143:50;52160:13;:18;;;52180:12;:10;:12::i;:::-;52143:16;:50::i;:::-;52039:154;52013:181;;52229:17;52207:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;52381:4;52359:26;;:13;:18;;;:26;;;52337:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;52484:1;52470:16;;:2;:16;;;52462:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;52541:43;52563:4;52569:2;52573:7;52582:1;52541:21;:43::i;:::-;52649:49;52666:1;52670:7;52679:13;:18;;;52649:8;:49::i;:::-;52741:1;52711:12;:18;52724:4;52711:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52781:1;52753:12;:16;52766:2;52753:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52816:43;;;;;;;;52831:2;52816:43;;;;;;52842:15;52816:43;;;;;52793:11;:20;52805:7;52793:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53099:19;53131:1;53121:7;:11;;;;:::i;:::-;53099:33;;53188:1;53147:43;;:11;:24;53159:11;53147:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;53143:288;;53211:20;53219:11;53211:7;:20::i;:::-;53207:213;;;53279:125;;;;;;;;53316:13;:18;;;53279:125;;;;;;53357:13;:28;;;53279:125;;;;;53252:11;:24;53264:11;53252:24;;;;;;;;;;;:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53207:213;53143:288;53467:7;53463:2;53448:27;;53457:4;53448:27;;;;;;;;;;;;53486:42;53507:4;53513:2;53517:7;53526:1;53486:20;:42::i;:::-;51931:1605;;;51827:1709;;;:::o;3811:98::-;3869:7;3900:1;3896;:5;;;;:::i;:::-;3889:12;;3811:98;;;;:::o;4210:::-;4268:7;4299:1;4295;:5;;;;:::i;:::-;4288:12;;4210:98;;;;:::o;44839:682::-;44927:21;;:::i;:::-;44974:16;44982:7;44974;:16::i;:::-;44966:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;45050:26;45102:12;45091:7;:23;45087:103;;45177:1;45162:12;45152:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;45131:47;;45087:103;45207:12;45222:7;45207:22;;45202:242;45239:18;45231:4;:26;45202:242;;45282:31;45316:11;:17;45328:4;45316:17;;;;;;;;;;;45282:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45378:1;45352:28;;:9;:14;;;:28;;;45348:85;;45408:9;45401:16;;;;;;;45348:85;45267:177;45259:6;;;;;:::i;:::-;;;;45202:242;;;;45456:57;;;;;;;;;;:::i;:::-;;;;;;;;44839:682;;;;:::o;20011:191::-;20085:16;20104:6;;;;;;;;;;;20085:25;;20130:8;20121:6;;:17;;;;;;;;;;;;;;;;;;20185:8;20154:40;;20175:8;20154:40;;;;;;;;;;;;20074:128;20011:191;:::o;55529:985::-;55684:4;55705:15;:2;:13;;;:15::i;:::-;55701:806;;;55774:2;55758:36;;;55817:12;:10;:12::i;:::-;55852:4;55879:7;55909:5;55758:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55737:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56137:1;56120:6;:13;:18;56116:321;;56163:109;;;;;;;;;;:::i;:::-;;;;;;;;56116:321;56387:6;56381:13;56372:6;56368:2;56364:15;56357:38;55737:715;56007:45;;;55997:55;;;:6;:55;;;;55990:62;;;;;55701:806;56491:4;56484:11;;55529:985;;;;;;;:::o;14939:723::-;14995:13;15225:1;15216:5;:10;15212:53;;15243:10;;;;;;;;;;;;;;;;;;;;;15212:53;15275:12;15290:5;15275:20;;15306:14;15331:78;15346:1;15338:4;:9;15331:78;;15364:8;;;;;:::i;:::-;;;;15395:2;15387:10;;;;;:::i;:::-;;;15331:78;;;15419:19;15451:6;15441:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15419:39;;15469:154;15485:1;15476:5;:10;15469:154;;15513:1;15503:11;;;;;:::i;:::-;;;15580:2;15572:5;:10;;;;:::i;:::-;15559:2;:24;;;;:::i;:::-;15546:39;;15529:6;15536;15529:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;15609:2;15600:11;;;;;:::i;:::-;;;15469:154;;;15647:6;15633:21;;;;;14939:723;;;;:::o;48215:214::-;48357:4;48386:18;:25;48405:5;48386:25;;;;;;;;;;;;;;;:35;48412:8;48386:35;;;;;;;;;;;;;;;;;;;;;;;;;48379:42;;48215:214;;;;:::o;32590:207::-;32720:4;32764:25;32749:40;;;:11;:40;;;;32742:47;;32590:207;;;:::o;50173:1400::-;50296:20;50319:12;;50296:35;;50364:1;50350:16;;:2;:16;;;50342:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50549:21;50557:12;50549:7;:21::i;:::-;50548:22;50540:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50635:12;50623:8;:24;;50615:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;50699:61;50729:1;50733:2;50737:12;50751:8;50699:21;:61::i;:::-;50773:30;50806:12;:16;50819:2;50806:16;;;;;;;;;;;;;;;50773:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50852:135;;;;;;;;50908:8;50878:11;:19;;;:39;;;;:::i;:::-;50852:135;;;;;;50967:8;50932:11;:24;;;:44;;;;:::i;:::-;50852:135;;;;;50833:12;:16;50846:2;50833:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51026:43;;;;;;;;51041:2;51026:43;;;;;;51052:15;51026:43;;;;;50998:11;:25;51010:12;50998:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51082:20;51105:12;51082:35;;51135:9;51130:325;51154:8;51150:1;:12;51130:325;;;51214:12;51210:2;51189:38;;51206:1;51189:38;;;;;;;;;;;;51268:59;51299:1;51303:2;51307:12;51321:5;51268:22;:59::i;:::-;51242:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;51429:14;;;;;:::i;:::-;;;;51164:3;;;;;:::i;:::-;;;;51130:325;;;;51482:12;51467;:27;;;;51505:60;51534:1;51538:2;51542:12;51556:8;51505:20;:60::i;:::-;50285:1288;;;50173:1400;;;:::o;57002:159::-;;;;;:::o;57573:158::-;;;;;:::o;21027:387::-;21087:4;21295:12;21362:7;21350:20;21342:28;;21405:1;21398:4;:8;21391:15;;;21027:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334: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:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:99::-;2261:6;2295:5;2289:12;2279:22;;2209:99;;;:::o;2314:169::-;2398:11;2432:6;2427:3;2420:19;2472:4;2467:3;2463:14;2448:29;;2314:169;;;;:::o;2489:307::-;2557:1;2567:113;2581:6;2578:1;2575:13;2567:113;;;2666:1;2661:3;2657:11;2651:18;2647:1;2642:3;2638:11;2631:39;2603:2;2600:1;2596:10;2591:15;;2567:113;;;2698:6;2695:1;2692:13;2689:101;;;2778:1;2769:6;2764:3;2760:16;2753:27;2689:101;2538:258;2489:307;;;:::o;2802:102::-;2843:6;2894:2;2890:7;2885:2;2878:5;2874:14;2870:28;2860:38;;2802:102;;;:::o;2910:364::-;2998:3;3026:39;3059:5;3026:39;:::i;:::-;3081:71;3145:6;3140:3;3081:71;:::i;:::-;3074:78;;3161:52;3206:6;3201:3;3194:4;3187:5;3183:16;3161:52;:::i;:::-;3238:29;3260:6;3238:29;:::i;:::-;3233:3;3229:39;3222:46;;3002:272;2910:364;;;;:::o;3280:313::-;3393:4;3431:2;3420:9;3416:18;3408:26;;3480:9;3474:4;3470:20;3466:1;3455:9;3451:17;3444:47;3508:78;3581:4;3572:6;3508:78;:::i;:::-;3500:86;;3280:313;;;;:::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:116::-;5985:21;6000:5;5985:21;:::i;:::-;5978:5;5975:32;5965:60;;6021:1;6018;6011:12;5965:60;5915:116;:::o;6037:133::-;6080:5;6118:6;6105:20;6096:29;;6134:30;6158:5;6134:30;:::i;:::-;6037:133;;;;:::o;6176:323::-;6232:6;6281:2;6269:9;6260:7;6256:23;6252:32;6249:119;;;6287:79;;:::i;:::-;6249:119;6407:1;6432:50;6474:7;6465:6;6454:9;6450:22;6432:50;:::i;:::-;6422:60;;6378:114;6176:323;;;;:::o;6505:474::-;6573:6;6581;6630:2;6618:9;6609:7;6605:23;6601:32;6598:119;;;6636:79;;:::i;:::-;6598:119;6756:1;6781:53;6826:7;6817:6;6806:9;6802:22;6781:53;:::i;:::-;6771:63;;6727:117;6883:2;6909:53;6954:7;6945:6;6934:9;6930:22;6909:53;:::i;:::-;6899:63;;6854:118;6505:474;;;;;:::o;6985:332::-;7106:4;7144:2;7133:9;7129:18;7121:26;;7157:71;7225:1;7214:9;7210:17;7201:6;7157:71;:::i;:::-;7238:72;7306:2;7295:9;7291:18;7282:6;7238:72;:::i;:::-;6985:332;;;;;:::o;7323:110::-;7374:7;7403:24;7421:5;7403:24;:::i;:::-;7392:35;;7323:110;;;:::o;7439:150::-;7526:38;7558:5;7526:38;:::i;:::-;7519:5;7516:49;7506:77;;7579:1;7576;7569:12;7506:77;7439:150;:::o;7595:167::-;7655:5;7693:6;7680:20;7671:29;;7709:47;7750:5;7709:47;:::i;:::-;7595:167;;;;:::o;7768:357::-;7841:6;7890:2;7878:9;7869:7;7865:23;7861:32;7858:119;;;7896:79;;:::i;:::-;7858:119;8016:1;8041:67;8100:7;8091:6;8080:9;8076:22;8041:67;:::i;:::-;8031:77;;7987:131;7768:357;;;;:::o;8131:117::-;8240:1;8237;8230:12;8254:117;8363:1;8360;8353:12;8377:180;8425:77;8422:1;8415:88;8522:4;8519:1;8512:15;8546:4;8543:1;8536:15;8563:281;8646:27;8668:4;8646:27;:::i;:::-;8638:6;8634:40;8776:6;8764:10;8761:22;8740:18;8728:10;8725:34;8722:62;8719:88;;;8787:18;;:::i;:::-;8719:88;8827:10;8823:2;8816:22;8606:238;8563:281;;:::o;8850:129::-;8884:6;8911:20;;:::i;:::-;8901:30;;8940:33;8968:4;8960:6;8940:33;:::i;:::-;8850:129;;;:::o;8985:308::-;9047:4;9137:18;9129:6;9126:30;9123:56;;;9159:18;;:::i;:::-;9123:56;9197:29;9219:6;9197:29;:::i;:::-;9189:37;;9281:4;9275;9271:15;9263:23;;8985:308;;;:::o;9299:154::-;9383:6;9378:3;9373;9360:30;9445:1;9436:6;9431:3;9427:16;9420:27;9299:154;;;:::o;9459:412::-;9537:5;9562:66;9578:49;9620:6;9578:49;:::i;:::-;9562:66;:::i;:::-;9553:75;;9651:6;9644:5;9637:21;9689:4;9682:5;9678:16;9727:3;9718:6;9713:3;9709:16;9706:25;9703:112;;;9734:79;;:::i;:::-;9703:112;9824:41;9858:6;9853:3;9848;9824:41;:::i;:::-;9543:328;9459:412;;;;;:::o;9891:340::-;9947:5;9996:3;9989:4;9981:6;9977:17;9973:27;9963:122;;10004:79;;:::i;:::-;9963:122;10121:6;10108:20;10146:79;10221:3;10213:6;10206:4;10198:6;10194:17;10146:79;:::i;:::-;10137:88;;9953:278;9891:340;;;;:::o;10237:509::-;10306:6;10355:2;10343:9;10334:7;10330:23;10326:32;10323:119;;;10361:79;;:::i;:::-;10323:119;10509:1;10498:9;10494:17;10481:31;10539:18;10531:6;10528:30;10525:117;;;10561:79;;:::i;:::-;10525:117;10666:63;10721:7;10712:6;10701:9;10697:22;10666:63;:::i;:::-;10656:73;;10452:287;10237:509;;;;:::o;10752:329::-;10811:6;10860:2;10848:9;10839:7;10835:23;10831:32;10828:119;;;10866:79;;:::i;:::-;10828:119;10986:1;11011:53;11056:7;11047:6;11036:9;11032:22;11011:53;:::i;:::-;11001:63;;10957:117;10752:329;;;;:::o;11087:468::-;11152:6;11160;11209:2;11197:9;11188:7;11184:23;11180:32;11177:119;;;11215:79;;:::i;:::-;11177:119;11335:1;11360:53;11405:7;11396:6;11385:9;11381:22;11360:53;:::i;:::-;11350:63;;11306:117;11462:2;11488:50;11530:7;11521:6;11510:9;11506:22;11488:50;:::i;:::-;11478:60;;11433:115;11087:468;;;;;:::o;11561:307::-;11622:4;11712:18;11704:6;11701:30;11698:56;;;11734:18;;:::i;:::-;11698:56;11772:29;11794:6;11772:29;:::i;:::-;11764:37;;11856:4;11850;11846:15;11838:23;;11561:307;;;:::o;11874:410::-;11951:5;11976:65;11992:48;12033:6;11992:48;:::i;:::-;11976:65;:::i;:::-;11967:74;;12064:6;12057:5;12050:21;12102:4;12095:5;12091:16;12140:3;12131:6;12126:3;12122:16;12119:25;12116:112;;;12147:79;;:::i;:::-;12116:112;12237:41;12271:6;12266:3;12261;12237:41;:::i;:::-;11957:327;11874:410;;;;;:::o;12303:338::-;12358:5;12407:3;12400:4;12392:6;12388:17;12384:27;12374:122;;12415:79;;:::i;:::-;12374:122;12532:6;12519:20;12557:78;12631:3;12623:6;12616:4;12608:6;12604:17;12557:78;:::i;:::-;12548:87;;12364:277;12303:338;;;;:::o;12647:943::-;12742:6;12750;12758;12766;12815:3;12803:9;12794:7;12790:23;12786:33;12783:120;;;12822:79;;:::i;:::-;12783:120;12942:1;12967:53;13012:7;13003:6;12992:9;12988:22;12967:53;:::i;:::-;12957:63;;12913:117;13069:2;13095:53;13140:7;13131:6;13120:9;13116:22;13095:53;:::i;:::-;13085:63;;13040:118;13197:2;13223:53;13268:7;13259:6;13248:9;13244:22;13223:53;:::i;:::-;13213:63;;13168:118;13353:2;13342:9;13338:18;13325:32;13384:18;13376:6;13373:30;13370:117;;;13406:79;;:::i;:::-;13370:117;13511:62;13565:7;13556:6;13545:9;13541:22;13511:62;:::i;:::-;13501:72;;13296:287;12647:943;;;;;;;:::o;13596:474::-;13664:6;13672;13721:2;13709:9;13700:7;13696:23;13692:32;13689:119;;;13727:79;;:::i;:::-;13689:119;13847:1;13872:53;13917:7;13908:6;13897:9;13893:22;13872:53;:::i;:::-;13862:63;;13818:117;13974:2;14000:53;14045:7;14036:6;14025:9;14021:22;14000:53;:::i;:::-;13990:63;;13945:118;13596:474;;;;;:::o;14076:180::-;14124:77;14121:1;14114:88;14221:4;14218:1;14211:15;14245:4;14242:1;14235:15;14262:305;14302:3;14321:20;14339:1;14321:20;:::i;:::-;14316:25;;14355:20;14373:1;14355:20;:::i;:::-;14350:25;;14509:1;14441:66;14437:74;14434:1;14431:81;14428:107;;;14515:18;;:::i;:::-;14428:107;14559:1;14556;14552:9;14545:16;;14262:305;;;;:::o;14573:221::-;14713:34;14709:1;14701:6;14697:14;14690:58;14782:4;14777:2;14769:6;14765:15;14758:29;14573:221;:::o;14800:366::-;14942:3;14963:67;15027:2;15022:3;14963:67;:::i;:::-;14956:74;;15039:93;15128:3;15039:93;:::i;:::-;15157:2;15152:3;15148:12;15141:19;;14800:366;;;:::o;15172:419::-;15338:4;15376:2;15365:9;15361:18;15353:26;;15425:9;15419:4;15415:20;15411:1;15400:9;15396:17;15389:47;15453:131;15579:4;15453:131;:::i;:::-;15445:139;;15172:419;;;:::o;15597:180::-;15645:77;15642:1;15635:88;15742:4;15739:1;15732:15;15766:4;15763:1;15756:15;15783:320;15827:6;15864:1;15858:4;15854:12;15844:22;;15911:1;15905:4;15901:12;15932:18;15922:81;;15988:4;15980:6;15976:17;15966:27;;15922:81;16050:2;16042:6;16039:14;16019:18;16016:38;16013:84;;16069:18;;:::i;:::-;16013:84;15834:269;15783:320;;;:::o;16109:232::-;16249:34;16245:1;16237:6;16233:14;16226:58;16318:15;16313:2;16305:6;16301:15;16294:40;16109:232;:::o;16347:366::-;16489:3;16510:67;16574:2;16569:3;16510:67;:::i;:::-;16503:74;;16586:93;16675:3;16586:93;:::i;:::-;16704:2;16699:3;16695:12;16688:19;;16347:366;;;:::o;16719:419::-;16885:4;16923:2;16912:9;16908:18;16900:26;;16972:9;16966:4;16962:20;16958:1;16947:9;16943:17;16936:47;17000:131;17126:4;17000:131;:::i;:::-;16992:139;;16719:419;;;:::o;17144:221::-;17284:34;17280:1;17272:6;17268:14;17261:58;17353:4;17348:2;17340:6;17336:15;17329:29;17144:221;:::o;17371:366::-;17513:3;17534:67;17598:2;17593:3;17534:67;:::i;:::-;17527:74;;17610:93;17699:3;17610:93;:::i;:::-;17728:2;17723:3;17719:12;17712:19;;17371:366;;;:::o;17743:419::-;17909:4;17947:2;17936:9;17932:18;17924:26;;17996:9;17990:4;17986:20;17982:1;17971:9;17967:17;17960:47;18024:131;18150:4;18024:131;:::i;:::-;18016:139;;17743:419;;;:::o;18168:244::-;18308:34;18304:1;18296:6;18292:14;18285:58;18377:27;18372:2;18364:6;18360:15;18353:52;18168:244;:::o;18418:366::-;18560:3;18581:67;18645:2;18640:3;18581:67;:::i;:::-;18574:74;;18657:93;18746:3;18657:93;:::i;:::-;18775:2;18770:3;18766:12;18759:19;;18418:366;;;:::o;18790:419::-;18956:4;18994:2;18983:9;18979:18;18971:26;;19043:9;19037:4;19033:20;19029:1;19018:9;19014:17;19007:47;19071:131;19197:4;19071:131;:::i;:::-;19063:139;;18790:419;;;:::o;19215:182::-;19355:34;19351:1;19343:6;19339:14;19332:58;19215:182;:::o;19403:366::-;19545:3;19566:67;19630:2;19625:3;19566:67;:::i;:::-;19559:74;;19642:93;19731:3;19642:93;:::i;:::-;19760:2;19755:3;19751:12;19744:19;;19403:366;;;:::o;19775:419::-;19941:4;19979:2;19968:9;19964:18;19956:26;;20028:9;20022:4;20018:20;20014:1;20003:9;19999:17;19992:47;20056:131;20182:4;20056:131;:::i;:::-;20048:139;;19775:419;;;:::o;20200:167::-;20340:19;20336:1;20328:6;20324:14;20317:43;20200:167;:::o;20373:366::-;20515:3;20536:67;20600:2;20595:3;20536:67;:::i;:::-;20529:74;;20612:93;20701:3;20612:93;:::i;:::-;20730:2;20725:3;20721:12;20714:19;;20373:366;;;:::o;20745:419::-;20911:4;20949:2;20938:9;20934:18;20926:26;;20998:9;20992:4;20988:20;20984:1;20973:9;20969:17;20962:47;21026:131;21152:4;21026:131;:::i;:::-;21018:139;;20745:419;;;:::o;21170:221::-;21310:34;21306:1;21298:6;21294:14;21287:58;21379:4;21374:2;21366:6;21362:15;21355:29;21170:221;:::o;21397:366::-;21539:3;21560:67;21624:2;21619:3;21560:67;:::i;:::-;21553:74;;21636:93;21725:3;21636:93;:::i;:::-;21754:2;21749:3;21745:12;21738:19;;21397:366;;;:::o;21769:419::-;21935:4;21973:2;21962:9;21958:18;21950:26;;22022:9;22016:4;22012:20;22008:1;21997:9;21993:17;21986:47;22050:131;22176:4;22050:131;:::i;:::-;22042:139;;21769:419;;;:::o;22194:233::-;22233:3;22256:24;22274:5;22256:24;:::i;:::-;22247:33;;22302:66;22295:5;22292:77;22289:103;;22372:18;;:::i;:::-;22289:103;22419:1;22412:5;22408:13;22401:20;;22194:233;;;:::o;22433:::-;22573:34;22569:1;22561:6;22557:14;22550:58;22642:16;22637:2;22629:6;22625:15;22618:41;22433:233;:::o;22672:366::-;22814:3;22835:67;22899:2;22894:3;22835:67;:::i;:::-;22828:74;;22911:93;23000:3;22911:93;:::i;:::-;23029:2;23024:3;23020:12;23013:19;;22672:366;;;:::o;23044:419::-;23210:4;23248:2;23237:9;23233:18;23225:26;;23297:9;23291:4;23287:20;23283:1;23272:9;23268:17;23261:47;23325:131;23451:4;23325:131;:::i;:::-;23317:139;;23044:419;;;:::o;23469:143::-;23526:5;23557:6;23551:13;23542:22;;23573:33;23600:5;23573:33;:::i;:::-;23469:143;;;;:::o;23618:351::-;23688:6;23737:2;23725:9;23716:7;23712:23;23708:32;23705:119;;;23743:79;;:::i;:::-;23705:119;23863:1;23888:64;23944:7;23935:6;23924:9;23920:22;23888:64;:::i;:::-;23878:74;;23834:128;23618:351;;;;:::o;23975:137::-;24029:5;24060:6;24054:13;24045:22;;24076:30;24100:5;24076:30;:::i;:::-;23975:137;;;;:::o;24118:345::-;24185:6;24234:2;24222:9;24213:7;24209:23;24205:32;24202:119;;;24240:79;;:::i;:::-;24202:119;24360:1;24385:61;24438:7;24429:6;24418:9;24414:22;24385:61;:::i;:::-;24375:71;;24331:125;24118:345;;;;:::o;24469:222::-;24609:34;24605:1;24597:6;24593:14;24586:58;24678:5;24673:2;24665:6;24661:15;24654:30;24469:222;:::o;24697:366::-;24839:3;24860:67;24924:2;24919:3;24860:67;:::i;:::-;24853:74;;24936:93;25025:3;24936:93;:::i;:::-;25054:2;25049:3;25045:12;25038:19;;24697:366;;;:::o;25069:419::-;25235:4;25273:2;25262:9;25258:18;25250:26;;25322:9;25316:4;25312:20;25308:1;25297:9;25293:17;25286:47;25350:131;25476:4;25350:131;:::i;:::-;25342:139;;25069:419;;;:::o;25494:230::-;25634:34;25630:1;25622:6;25618:14;25611:58;25703:13;25698:2;25690:6;25686:15;25679:38;25494:230;:::o;25730:366::-;25872:3;25893:67;25957:2;25952:3;25893:67;:::i;:::-;25886:74;;25969:93;26058:3;25969:93;:::i;:::-;26087:2;26082:3;26078:12;26071:19;;25730:366;;;:::o;26102:419::-;26268:4;26306:2;26295:9;26291:18;26283:26;;26355:9;26349:4;26345:20;26341:1;26330:9;26326:17;26319:47;26383:131;26509:4;26383:131;:::i;:::-;26375:139;;26102:419;;;:::o;26527:181::-;26667:33;26663:1;26655:6;26651:14;26644:57;26527:181;:::o;26714:366::-;26856:3;26877:67;26941:2;26936:3;26877:67;:::i;:::-;26870:74;;26953:93;27042:3;26953:93;:::i;:::-;27071:2;27066:3;27062:12;27055:19;;26714:366;;;:::o;27086:419::-;27252:4;27290:2;27279:9;27275:18;27267:26;;27339:9;27333:4;27329:20;27325:1;27314:9;27310:17;27303:47;27367:131;27493:4;27367:131;:::i;:::-;27359:139;;27086:419;;;:::o;27511:173::-;27651:25;27647:1;27639:6;27635:14;27628:49;27511:173;:::o;27690:366::-;27832:3;27853:67;27917:2;27912:3;27853:67;:::i;:::-;27846:74;;27929:93;28018:3;27929:93;:::i;:::-;28047:2;28042:3;28038:12;28031:19;;27690:366;;;:::o;28062:419::-;28228:4;28266:2;28255:9;28251:18;28243:26;;28315:9;28309:4;28305:20;28301:1;28290:9;28286:17;28279:47;28343:131;28469:4;28343:131;:::i;:::-;28335:139;;28062:419;;;:::o;28487:191::-;28527:4;28547:20;28565:1;28547:20;:::i;:::-;28542:25;;28581:20;28599:1;28581:20;:::i;:::-;28576:25;;28620:1;28617;28614:8;28611:34;;;28625:18;;:::i;:::-;28611:34;28670:1;28667;28663:9;28655:17;;28487:191;;;;:::o;28684:221::-;28824:34;28820:1;28812:6;28808:14;28801:58;28893:4;28888:2;28880:6;28876:15;28869:29;28684:221;:::o;28911:366::-;29053:3;29074:67;29138:2;29133:3;29074:67;:::i;:::-;29067:74;;29150:93;29239:3;29150:93;:::i;:::-;29268:2;29263:3;29259:12;29252:19;;28911:366;;;:::o;29283:419::-;29449:4;29487:2;29476:9;29472:18;29464:26;;29536:9;29530:4;29526:20;29522:1;29511:9;29507:17;29500:47;29564:131;29690:4;29564:131;:::i;:::-;29556:139;;29283:419;;;:::o;29708:348::-;29748:7;29771:20;29789:1;29771:20;:::i;:::-;29766:25;;29805:20;29823:1;29805:20;:::i;:::-;29800:25;;29993:1;29925:66;29921:74;29918:1;29915:81;29910:1;29903:9;29896:17;29892:105;29889:131;;;30000:18;;:::i;:::-;29889:131;30048:1;30045;30041:9;30030:20;;29708:348;;;;:::o;30062:221::-;30202:34;30198:1;30190:6;30186:14;30179:58;30271:4;30266:2;30258:6;30254:15;30247:29;30062:221;:::o;30289:366::-;30431:3;30452:67;30516:2;30511:3;30452:67;:::i;:::-;30445:74;;30528:93;30617:3;30528:93;:::i;:::-;30646:2;30641:3;30637:12;30630:19;;30289:366;;;:::o;30661:419::-;30827:4;30865:2;30854:9;30850:18;30842:26;;30914:9;30908:4;30904:20;30900:1;30889:9;30885:17;30878:47;30942:131;31068:4;30942:131;:::i;:::-;30934:139;;30661:419;;;:::o;31086:176::-;31226:28;31222:1;31214:6;31210:14;31203:52;31086:176;:::o;31268:366::-;31410:3;31431:67;31495:2;31490:3;31431:67;:::i;:::-;31424:74;;31507:93;31596:3;31507:93;:::i;:::-;31625:2;31620:3;31616:12;31609:19;;31268:366;;;:::o;31640:419::-;31806:4;31844:2;31833:9;31829:18;31821:26;;31893:9;31887:4;31883:20;31879:1;31868:9;31864:17;31857:47;31921:131;32047:4;31921:131;:::i;:::-;31913:139;;31640:419;;;:::o;32065:238::-;32205:34;32201:1;32193:6;32189:14;32182:58;32274:21;32269:2;32261:6;32257:15;32250:46;32065:238;:::o;32309:366::-;32451:3;32472:67;32536:2;32531:3;32472:67;:::i;:::-;32465:74;;32548:93;32637:3;32548:93;:::i;:::-;32666:2;32661:3;32657:12;32650:19;;32309:366;;;:::o;32681:419::-;32847:4;32885:2;32874:9;32870:18;32862:26;;32934:9;32928:4;32924:20;32920:1;32909:9;32905:17;32898:47;32962:131;33088:4;32962:131;:::i;:::-;32954:139;;32681:419;;;:::o;33106:148::-;33208:11;33245:3;33230:18;;33106:148;;;;:::o;33260:141::-;33309:4;33332:3;33324:11;;33355:3;33352:1;33345:14;33389:4;33386:1;33376:18;33368:26;;33260:141;;;:::o;33431:845::-;33534:3;33571:5;33565:12;33600:36;33626:9;33600:36;:::i;:::-;33652:89;33734:6;33729:3;33652:89;:::i;:::-;33645:96;;33772:1;33761:9;33757:17;33788:1;33783:137;;;;33934:1;33929:341;;;;33750:520;;33783:137;33867:4;33863:9;33852;33848:25;33843:3;33836:38;33903:6;33898:3;33894:16;33887:23;;33783:137;;33929:341;33996:38;34028:5;33996:38;:::i;:::-;34056:1;34070:154;34084:6;34081:1;34078:13;34070:154;;;34158:7;34152:14;34148:1;34143:3;34139:11;34132:35;34208:1;34199:7;34195:15;34184:26;;34106:4;34103:1;34099:12;34094:17;;34070:154;;;34253:6;34248:3;34244:16;34237:23;;33936:334;;33750:520;;33538:738;;33431:845;;;;:::o;34282:151::-;34422:3;34418:1;34410:6;34406:14;34399:27;34282:151;:::o;34439:400::-;34599:3;34620:84;34702:1;34697:3;34620:84;:::i;:::-;34613:91;;34713:93;34802:3;34713:93;:::i;:::-;34831:1;34826:3;34822:11;34815:18;;34439:400;;;:::o;34845:377::-;34951:3;34979:39;35012:5;34979:39;:::i;:::-;35034:89;35116:6;35111:3;35034:89;:::i;:::-;35027:96;;35132:52;35177:6;35172:3;35165:4;35158:5;35154:16;35132:52;:::i;:::-;35209:6;35204:3;35200:16;35193:23;;34955:267;34845:377;;;;:::o;35228:695::-;35506:3;35528:92;35616:3;35607:6;35528:92;:::i;:::-;35521:99;;35637:148;35781:3;35637:148;:::i;:::-;35630:155;;35802:95;35893:3;35884:6;35802:95;:::i;:::-;35795:102;;35914:3;35907:10;;35228:695;;;;;:::o;35929:125::-;35995:7;36024:24;36042:5;36024:24;:::i;:::-;36013:35;;35929:125;;;:::o;36060:180::-;36162:53;36209:5;36162:53;:::i;:::-;36155:5;36152:64;36142:92;;36230:1;36227;36220:12;36142:92;36060:180;:::o;36246:201::-;36332:5;36363:6;36357:13;36348:22;;36379:62;36435:5;36379:62;:::i;:::-;36246:201;;;;:::o;36453:409::-;36552:6;36601:2;36589:9;36580:7;36576:23;36572:32;36569:119;;;36607:79;;:::i;:::-;36569:119;36727:1;36752:93;36837:7;36828:6;36817:9;36813:22;36752:93;:::i;:::-;36742:103;;36698:157;36453:409;;;;:::o;36868:225::-;37008:34;37004:1;36996:6;36992:14;36985:58;37077:8;37072:2;37064:6;37060:15;37053:33;36868:225;:::o;37099:366::-;37241:3;37262:67;37326:2;37321:3;37262:67;:::i;:::-;37255:74;;37338:93;37427:3;37338:93;:::i;:::-;37456:2;37451:3;37447:12;37440:19;;37099:366;;;:::o;37471:419::-;37637:4;37675:2;37664:9;37660:18;37652:26;;37724:9;37718:4;37714:20;37710:1;37699:9;37695:17;37688:47;37752:131;37878:4;37752:131;:::i;:::-;37744:139;;37471:419;;;:::o;37896:237::-;38036:34;38032:1;38024:6;38020:14;38013:58;38105:20;38100:2;38092:6;38088:15;38081:45;37896:237;:::o;38139:366::-;38281:3;38302:67;38366:2;38361:3;38302:67;:::i;:::-;38295:74;;38378:93;38467:3;38378:93;:::i;:::-;38496:2;38491:3;38487:12;38480:19;;38139:366;;;:::o;38511:419::-;38677:4;38715:2;38704:9;38700:18;38692:26;;38764:9;38758:4;38754:20;38750:1;38739:9;38735:17;38728:47;38792:131;38918:4;38792:131;:::i;:::-;38784:139;;38511:419;;;:::o;38936:225::-;39076:34;39072:1;39064:6;39060:14;39053:58;39145:8;39140:2;39132:6;39128:15;39121:33;38936:225;:::o;39167:366::-;39309:3;39330:67;39394:2;39389:3;39330:67;:::i;:::-;39323:74;;39406:93;39495:3;39406:93;:::i;:::-;39524:2;39519:3;39515:12;39508:19;;39167:366;;;:::o;39539:419::-;39705:4;39743:2;39732:9;39728:18;39720:26;;39792:9;39786:4;39782:20;39778:1;39767:9;39763:17;39756:47;39820:131;39946:4;39820:131;:::i;:::-;39812:139;;39539:419;;;:::o;39964:224::-;40104:34;40100:1;40092:6;40088:14;40081:58;40173:7;40168:2;40160:6;40156:15;40149:32;39964:224;:::o;40194:366::-;40336:3;40357:67;40421:2;40416:3;40357:67;:::i;:::-;40350:74;;40433:93;40522:3;40433:93;:::i;:::-;40551:2;40546:3;40542:12;40535:19;;40194:366;;;:::o;40566:419::-;40732:4;40770:2;40759:9;40755:18;40747:26;;40819:9;40813:4;40809:20;40805:1;40794:9;40790:17;40783:47;40847:131;40973:4;40847:131;:::i;:::-;40839:139;;40566:419;;;:::o;40991:118::-;41028:7;41068:34;41061:5;41057:46;41046:57;;40991:118;;;:::o;41115:191::-;41155:4;41175:20;41193:1;41175:20;:::i;:::-;41170:25;;41209:20;41227:1;41209:20;:::i;:::-;41204:25;;41248:1;41245;41242:8;41239:34;;;41253:18;;:::i;:::-;41239:34;41298:1;41295;41291:9;41283:17;;41115:191;;;;:::o;41312:273::-;41352:3;41371:20;41389:1;41371:20;:::i;:::-;41366:25;;41405:20;41423:1;41405:20;:::i;:::-;41400:25;;41527:1;41491:34;41487:42;41484:1;41481:49;41478:75;;;41533:18;;:::i;:::-;41478:75;41577:1;41574;41570:9;41563:16;;41312:273;;;;:::o;41591:180::-;41639:77;41636:1;41629:88;41736:4;41733:1;41726:15;41760:4;41757:1;41750:15;41777:185;41817:1;41834:20;41852:1;41834:20;:::i;:::-;41829:25;;41868:20;41886:1;41868:20;:::i;:::-;41863:25;;41907:1;41897:35;;41912:18;;:::i;:::-;41897:35;41954:1;41951;41947:9;41942:14;;41777:185;;;;:::o;41968:229::-;42108:34;42104:1;42096:6;42092:14;42085:58;42177:12;42172:2;42164:6;42160:15;42153:37;41968:229;:::o;42203:366::-;42345:3;42366:67;42430:2;42425:3;42366:67;:::i;:::-;42359:74;;42442:93;42531:3;42442:93;:::i;:::-;42560:2;42555:3;42551:12;42544:19;;42203:366;;;:::o;42575:419::-;42741:4;42779:2;42768:9;42764:18;42756:26;;42828:9;42822:4;42818:20;42814:1;42803:9;42799:17;42792:47;42856:131;42982:4;42856:131;:::i;:::-;42848:139;;42575:419;;;:::o;43000:171::-;43039:3;43062:24;43080:5;43062:24;:::i;:::-;43053:33;;43108:4;43101:5;43098:15;43095:41;;43116:18;;:::i;:::-;43095:41;43163:1;43156:5;43152:13;43145:20;;43000:171;;;:::o;43177:234::-;43317:34;43313:1;43305:6;43301:14;43294:58;43386:17;43381:2;43373:6;43369:15;43362:42;43177:234;:::o;43417:366::-;43559:3;43580:67;43644:2;43639:3;43580:67;:::i;:::-;43573:74;;43656:93;43745:3;43656:93;:::i;:::-;43774:2;43769:3;43765:12;43758:19;;43417:366;;;:::o;43789:419::-;43955:4;43993:2;43982:9;43978:18;43970:26;;44042:9;44036:4;44032:20;44028:1;44017:9;44013:17;44006:47;44070:131;44196:4;44070:131;:::i;:::-;44062:139;;43789:419;;;:::o;44214:98::-;44265:6;44299:5;44293:12;44283:22;;44214:98;;;:::o;44318:168::-;44401:11;44435:6;44430:3;44423:19;44475:4;44470:3;44466:14;44451:29;;44318:168;;;;:::o;44492:360::-;44578:3;44606:38;44638:5;44606:38;:::i;:::-;44660:70;44723:6;44718:3;44660:70;:::i;:::-;44653:77;;44739:52;44784:6;44779:3;44772:4;44765:5;44761:16;44739:52;:::i;:::-;44816:29;44838:6;44816:29;:::i;:::-;44811:3;44807:39;44800:46;;44582:270;44492:360;;;;:::o;44858:640::-;45053:4;45091:3;45080:9;45076:19;45068:27;;45105:71;45173:1;45162:9;45158:17;45149:6;45105:71;:::i;:::-;45186:72;45254:2;45243:9;45239:18;45230:6;45186:72;:::i;:::-;45268;45336:2;45325:9;45321:18;45312:6;45268:72;:::i;:::-;45387:9;45381:4;45377:20;45372:2;45361:9;45357:18;45350:48;45415:76;45486:4;45477:6;45415:76;:::i;:::-;45407:84;;44858:640;;;;;;;:::o;45504:141::-;45560:5;45591:6;45585:13;45576:22;;45607:32;45633:5;45607:32;:::i;:::-;45504:141;;;;:::o;45651:349::-;45720:6;45769:2;45757:9;45748:7;45744:23;45740:32;45737:119;;;45775:79;;:::i;:::-;45737:119;45895:1;45920:63;45975:7;45966:6;45955:9;45951:22;45920:63;:::i;:::-;45910:73;;45866:127;45651:349;;;;:::o;46006:176::-;46038:1;46055:20;46073:1;46055:20;:::i;:::-;46050:25;;46089:20;46107:1;46089:20;:::i;:::-;46084:25;;46128:1;46118:35;;46133:18;;:::i;:::-;46118:35;46174:1;46171;46167:9;46162:14;;46006:176;;;;:::o;46188:180::-;46236:77;46233:1;46226:88;46333:4;46330:1;46323:15;46357:4;46354:1;46347:15;46374:220;46514:34;46510:1;46502:6;46498:14;46491:58;46583:3;46578:2;46570:6;46566:15;46559:28;46374:220;:::o;46600:366::-;46742:3;46763:67;46827:2;46822:3;46763:67;:::i;:::-;46756:74;;46839:93;46928:3;46839:93;:::i;:::-;46957:2;46952:3;46948:12;46941:19;;46600:366;;;:::o;46972:419::-;47138:4;47176:2;47165:9;47161:18;47153:26;;47225:9;47219:4;47215:20;47211:1;47200:9;47196:17;47189:47;47253:131;47379:4;47253:131;:::i;:::-;47245:139;;46972:419;;;:::o;47397:179::-;47537:31;47533:1;47525:6;47521:14;47514:55;47397:179;:::o;47582:366::-;47724:3;47745:67;47809:2;47804:3;47745:67;:::i;:::-;47738:74;;47821:93;47910:3;47821:93;:::i;:::-;47939:2;47934:3;47930:12;47923:19;;47582:366;;;:::o;47954:419::-;48120:4;48158:2;48147:9;48143:18;48135:26;;48207:9;48201:4;48197:20;48193:1;48182:9;48178:17;48171:47;48235:131;48361:4;48235:131;:::i;:::-;48227:139;;47954:419;;;:::o;48379:221::-;48519:34;48515:1;48507:6;48503:14;48496:58;48588:4;48583:2;48575:6;48571:15;48564:29;48379:221;:::o;48606:366::-;48748:3;48769:67;48833:2;48828:3;48769:67;:::i;:::-;48762:74;;48845:93;48934:3;48845:93;:::i;:::-;48963:2;48958:3;48954:12;48947:19;;48606:366;;;:::o;48978:419::-;49144:4;49182:2;49171:9;49167:18;49159:26;;49231:9;49225:4;49221:20;49217:1;49206:9;49202:17;49195:47;49259:131;49385:4;49259:131;:::i;:::-;49251:139;;48978:419;;;:::o

Swarm Source

ipfs://3bce37b92cd77845e1d01ba527d5ac5606254e9944f3079270542c2160209c17
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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