ETH Price: $3,422.41 (-2.16%)
Gas: 5 Gwei

Token

Wombo Dream (WBO)
 

Overview

Max Total Supply

0 WBO

Holders

331

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 WBO
0xd3d33d9088e7f8ec6cc7b7f8ac0abd7f48d08460
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:
WomboDream

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    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/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `tokenId` must be already minted.
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

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


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

pragma solidity ^0.8.0;




/**
 * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment
 * information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC721Royalty is ERC2981, ERC721 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);
        _resetTokenRoyalty(tokenId);
    }
}

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


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

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

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

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: contracts/WomboDream.sol


pragma solidity ^0.8.4;








/**
 * @title Wombo Dream NFT contract
 * @dev This is an ERC721 contract that defines the Wombo Dream collection. It
 * allows ownerOnly minting, as well as public minting of verified URIs. 
 * Verification is done by the Wombo Dream server.
 */
contract WomboDream is ERC721, ERC721URIStorage, Pausable, Ownable, ERC721Burnable, ERC721Royalty {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdCounter;

    // Public key used to check the signature, which allows public minting of 
    // authorized URIs.
    address private _PUBLIC_VERIFICATION_KEY;

    // Maybe we will require a mint fee in the future.
    uint256 _mintFee = 0;

    // We use OpenZeppelin's ERC721Royalty, which implements ERC-2981:
    // IMPORTANT: ERC-2981 only specifies a way to signal royalty information 
    // and does not enforce its payment. See https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale]
    // in the EIP. Marketplaces are expected to voluntarily pay royalties 
    // together with sales, but note that this standard is not yet widely 
    // supported.
    uint96 ROYALTY_FEE_PERCENT = 10;

    // To guard against replay attack, and ensure only 1 NFT can be minted for
    // a given Dream.
    mapping(string => bool) private _taskIDs;

    // This makes it easy to fetch the taskID for a given token.
    mapping(uint256 => string) _tokenIdToTaskID;

    constructor(address verificationPublicKey) ERC721("Wombo Dream", "WBO") {
        _PUBLIC_VERIFICATION_KEY = verificationPublicKey;
        _setDefaultRoyalty(owner(),  ROYALTY_FEE_PERCENT*100 /*royalty numerator is in basis points*/);
    }

    //
    // Private onlyOwner functions:
    //
    function updateDefaultRoyalty(address receiver, uint96 feeNumerator)
            public onlyOwner {
        _setDefaultRoyalty(receiver, feeNumerator);
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function updateMintFee(uint256 newMintFee) public onlyOwner {
        _mintFee = newMintFee;
    }

    /** 
     * @dev Bulk Minting function, only callable by the contract owner.
     * @param uris an array of metadata URIs
     * @param targetAddresses an array of addresses that will receive the NFTs
     * @param batchSize the number of tokens that we are minting
     */
    function privateBulkAirdrop(
            string[] memory uris,
            address[] memory targetAddresses,
            string[] memory taskIDs, 
            uint batchSize) public onlyOwner {
        // Ensure that the input arrays are all the same size
        require(uris.length == batchSize, "input arrays must be equal to batch_size");
        require(targetAddresses.length == batchSize, "input arrays must be equal to batch_size");
        require(taskIDs.length == batchSize, "taskIDs must be equal to batch_size");

        for (uint i = 0; i < batchSize; i++) {
            privateMint(uris[i], targetAddresses[i], taskIDs[i]);
        }
    }

    /** 
     * @dev Minting function that is only callable by the contract owner.
     * @param uri the metadata URI
     * @param targetAddress the address of the receiver of this NFT
     */
    function privateMint(
            string memory uri,
            address targetAddress,
            string memory taskID) public onlyOwner {
        internalMint(uri, targetAddress, taskID);
    }

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

    function internalMint(string memory uri, address to, string memory taskID) internal {
        require(!_taskIDs[taskID], "This dream has already been minted");
        require(bytes(taskID).length != 0,  "Cannot use empty string for taskID");
        _taskIDs[taskID] = true;
        _safeMint(to, _tokenIdCounter.current());
        _setTokenURI(_tokenIdCounter.current(), uri);
        _tokenIdToTaskID[_tokenIdCounter.current()] = taskID;
        _tokenIdCounter.increment();
    }

    //
    // Public functions:
    // 

    /**
     * @dev Public function to view the taskID for a given token.
     * @param tokenId the token ID
     */
    function tokenTaskID(uint256 tokenId) public view returns (string memory)  {
        string memory taskID = _tokenIdToTaskID[tokenId];
        require(bytes(taskID).length != 0, "ERC721: taskID query for nonexistent token");
        return taskID;
    }


    /** 
     * @dev Public mint function. The signature needs to come from the private 
     * Wombo server.
     * @param uri the metadata URI
     * @param signature the signed payload hash, which is signed using the 
     * Wombo verification private key. We check to ensure that the signature
     * is valid, by reconstructing the payload hash (using uri, sender address, 
     * and taskID), and comparing the signature.
     * @param taskID the taskID of the dream linked to this NFT. This is used
     * to ensure that only a single NFT can be minted for a given Dream.
     */
    function mint(string memory uri, bytes memory signature, string memory taskID) public payable whenNotPaused {
        // Maybe require a mint fee
        require(msg.value >= _mintFee, "Not enough eth sent");

        // Recreate the payload hash and validate the signature
        bytes32 payloadHash = keccak256(abi.encode(uri, msg.sender, taskID));
        require(verify(payloadHash, signature), "signature is invalid");

        internalMint(uri, msg.sender, taskID);
    }

    /**
     * @dev ECDSA signatures consist of two numbers (integers): r and s. Ethereum also uses an additional v 
     * (recovery identifier) variable. The signature can be notated as {r, s, v}. 
     * see https://medium.com/mycrypto/the-magic-of-digital-signatures-on-ethereum-98fe184dc9c7 for more details.
     * @param payloadHash the hash of the payload we are verifying. The payload
     * can be the concatenation of various messages.
     * @param signature the signature that we are verifying.
    */
    function verify(
        bytes32 payloadHash,
        bytes memory signature
    ) public view returns (bool)  {
        (bytes32 r, bytes32 s, uint8 v) = splitSignature(signature);
        bytes32 messageHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", payloadHash));
        return ecrecover(messageHash, v, r, s) == _PUBLIC_VERIFICATION_KEY;
    }

    /**
     * @dev ECDSA signatures consist of two numbers (integers): r and s. Ethereum also uses an additional v 
     * (recovery identifier) variable. The signature can be notated as {r, s, v}. 
     * see https://medium.com/mycrypto/the-magic-of-digital-signatures-on-ethereum-98fe184dc9c7 for more details.
     * @param signature the signature to be split.
     */
    function splitSignature(
        bytes memory signature
    ) internal pure
        returns (
            bytes32 r,
            bytes32 s,
            uint8 v
        )
    {
        require(signature.length == 65, "invalid signature length");

        assembly {
            /*
            First 32 bytes stores the length of the signature

            add(sig, 32) = pointer of sig + 32
            effectively, skips first 32 bytes of signature

            mload(p) loads next 32 bytes starting at the memory address p into memory
            */

            // first 32 bytes, after the length prefix
            r := mload(add(signature, 32))
            // second 32 bytes
            s := mload(add(signature, 64))
            // final byte (first byte of the next 32 bytes)
            v := byte(0, mload(add(signature, 96)))
        }

        // implicitly return (r, s, v)
    }

    // The following function overrides are required by Solidity.
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Royalty) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
    
    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        whenNotPaused
        override
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _burn(uint256 tokenId) internal override(ERC721, ERC721Royalty, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"verificationPublicKey","type":"address"}],"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"string","name":"taskID","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"uris","type":"string[]"},{"internalType":"address[]","name":"targetAddresses","type":"address[]"},{"internalType":"string[]","name":"taskIDs","type":"string[]"},{"internalType":"uint256","name":"batchSize","type":"uint256"}],"name":"privateBulkAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"address","name":"targetAddress","type":"address"},{"internalType":"string","name":"taskID","type":"string"}],"name":"privateMint","outputs":[],"stateMutability":"nonpayable","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":"","type":"address"},{"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":"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenTaskID","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"updateDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintFee","type":"uint256"}],"name":"updateMintFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c55600a600d60006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055503480156200004857600080fd5b5060405162005b1038038062005b1083398181016040528101906200006e919062000546565b6040518060400160405280600b81526020017f576f6d626f20447265616d0000000000000000000000000000000000000000008152506040518060400160405280600381526020017f57424f00000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000f29291906200047f565b5080600390805190602001906200010b9291906200047f565b5050506000600960006101000a81548160ff021916908315150217905550620001496200013d620001da60201b60201c565b620001e260201b60201c565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001d36200019e620002a860201b60201c565b6064600d60009054906101000a90046bffffffffffffffffffffffff16620001c791906200061b565b620002d260201b60201c565b50620007df565b600033905090565b6000600960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620002e26200047560201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000343576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200033a90620005c6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003b6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ad90620005e8565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b8280546200048d90620006b4565b90600052602060002090601f016020900481019282620004b15760008555620004fd565b82601f10620004cc57805160ff1916838001178555620004fd565b82800160010185558215620004fd579182015b82811115620004fc578251825591602001919060010190620004df565b5b5090506200050c919062000510565b5090565b5b808211156200052b57600081600090555060010162000511565b5090565b6000815190506200054081620007c5565b92915050565b6000602082840312156200055f576200055e62000748565b5b60006200056f848285016200052f565b91505092915050565b600062000587602a836200060a565b915062000594826200074d565b604082019050919050565b6000620005ae6019836200060a565b9150620005bb826200079c565b602082019050919050565b60006020820190508181036000830152620005e18162000578565b9050919050565b6000602082019050818103600083015262000603816200059f565b9050919050565b600082825260208201905092915050565b600062000628826200069c565b915062000635836200069c565b9250816bffffffffffffffffffffffff04831182151516156200065d576200065c620006ea565b5b828202905092915050565b600062000675826200067c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b60006002820490506001821680620006cd57607f821691505b60208210811415620006e457620006e362000719565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b620007d08162000668565b8114620007dc57600080fd5b50565b61532180620007ef6000396000f3fe6080604052600436106101c25760003560e01c80636352211e116100f75780638f40522111610095578063c87b56dd11610064578063c87b56dd14610608578063d691e43c14610645578063e985e9c51461066e578063f2fde38b146106ab576101c2565b80638f4052211461056257806395d89b411461058b578063a22cb465146105b6578063b88d4fde146105df576101c2565b8063715018a6116100d1578063715018a6146104e057806384017e52146104f75780638456cb59146105205780638da5cb5b14610537576101c2565b80636352211e1461042957806366f9cff21461046657806370a08231146104a3576101c2565b8063391f88ca1161016457806342842e0e1161013e57806342842e0e1461039057806342966c68146103b9578063532b77b3146103e25780635c975abb146103fe576101c2565b8063391f88ca146103395780633ccfd60b146103625780633f4ba83a14610379576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806323b872dd14610295578063258ae582146102be5780632a55205a146102fb576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906137b4565b6106d4565b6040516101fb919061403b565b60405180910390f35b34801561021057600080fd5b506102196106e6565b604051610226919061409b565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190613940565b610778565b6040516102639190613fab565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e919061361d565b6107fd565b005b3480156102a157600080fd5b506102bc60048036038101906102b79190613507565b610915565b005b3480156102ca57600080fd5b506102e560048036038101906102e09190613758565b610975565b6040516102f2919061403b565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d919061396d565b610a60565b604051610330929190614012565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b919061380e565b610c4b565b005b34801561036e57600080fd5b50610377610cd7565b005b34801561038557600080fd5b5061038e610dd3565b005b34801561039c57600080fd5b506103b760048036038101906103b29190613507565b610e59565b005b3480156103c557600080fd5b506103e060048036038101906103db9190613940565b610e79565b005b6103fc60048036038101906103f79190613899565b610ed5565b005b34801561040a57600080fd5b50610413610feb565b604051610420919061403b565b60405180910390f35b34801561043557600080fd5b50610450600480360381019061044b9190613940565b611002565b60405161045d9190613fab565b60405180910390f35b34801561047257600080fd5b5061048d60048036038101906104889190613940565b6110b4565b60405161049a919061409b565b60405180910390f35b3480156104af57600080fd5b506104ca60048036038101906104c5919061349a565b6111a4565b6040516104d791906144e2565b60405180910390f35b3480156104ec57600080fd5b506104f561125c565b005b34801561050357600080fd5b5061051e60048036038101906105199190613940565b6112e4565b005b34801561052c57600080fd5b5061053561136a565b005b34801561054357600080fd5b5061054c6113f0565b6040516105599190613fab565b60405180910390f35b34801561056e57600080fd5b506105896004803603810190610584919061369d565b61141a565b005b34801561059757600080fd5b506105a06115dd565b6040516105ad919061409b565b60405180910390f35b3480156105c257600080fd5b506105dd60048036038101906105d891906135dd565b61166f565b005b3480156105eb57600080fd5b506106066004803603810190610601919061355a565b611685565b005b34801561061457600080fd5b5061062f600480360381019061062a9190613940565b6116e7565b60405161063c919061409b565b60405180910390f35b34801561065157600080fd5b5061066c6004803603810190610667919061365d565b6116f9565b005b34801561067a57600080fd5b50610695600480360381019061069091906134c7565b611783565b6040516106a2919061403b565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd919061349a565b611817565b005b60006106df8261190f565b9050919050565b6060600280546106f590614824565b80601f016020809104026020016040519081016040528092919081815260200182805461072190614824565b801561076e5780601f106107435761010080835404028352916020019161076e565b820191906000526020600020905b81548152906001019060200180831161075157829003601f168201915b5050505050905090565b600061078382611921565b6107c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b990614342565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080882611002565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610870906143c2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661089861198d565b73ffffffffffffffffffffffffffffffffffffffff1614806108c757506108c6816108c161198d565b611783565b5b610906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fd90614282565b60405180910390fd5b6109108383611995565b505050565b61092661092061198d565b82611a4e565b610965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095c90614402565b60405180910390fd5b610970838383611b2c565b505050565b60008060008061098485611d93565b92509250925060008660405160200161099d9190613f70565b604051602081830303815290604052805190602001209050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018284878760405160008152602001604052604051610a119493929190614056565b6020604051602081039080840390855afa158015610a33573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff161494505050505092915050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610bf65760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610c00611dfb565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610c2c91906146b1565b610c369190614680565b90508160000151819350935050509250929050565b610c5361198d565b73ffffffffffffffffffffffffffffffffffffffff16610c716113f0565b73ffffffffffffffffffffffffffffffffffffffff1614610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90614362565b60405180910390fd5b610cd2838383611e05565b505050565b610cdf61198d565b73ffffffffffffffffffffffffffffffffffffffff16610cfd6113f0565b73ffffffffffffffffffffffffffffffffffffffff1614610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90614362565b60405180910390fd5b6000610d5d6113f0565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d8090613f96565b60006040518083038185875af1925050503d8060008114610dbd576040519150601f19603f3d011682016040523d82523d6000602084013e610dc2565b606091505b5050905080610dd057600080fd5b50565b610ddb61198d565b73ffffffffffffffffffffffffffffffffffffffff16610df96113f0565b73ffffffffffffffffffffffffffffffffffffffff1614610e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4690614362565b60405180910390fd5b610e57611f53565b565b610e7483838360405180602001604052806000815250611685565b505050565b610e8a610e8461198d565b82611a4e565b610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec090614482565b60405180910390fd5b610ed281611ff5565b50565b610edd610feb565b15610f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1490614242565b60405180910390fd5b600c54341015610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990614382565b60405180910390fd5b6000833383604051602001610f79939291906140bd565b604051602081830303815290604052805190602001209050610f9b8184610975565b610fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd1906144a2565b60405180910390fd5b610fe5843384611e05565b50505050565b6000600960009054906101000a900460ff16905090565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a2906142c2565b60405180910390fd5b80915050919050565b60606000600f600084815260200190815260200160002080546110d690614824565b80601f016020809104026020016040519081016040528092919081815260200182805461110290614824565b801561114f5780601f106111245761010080835404028352916020019161114f565b820191906000526020600020905b81548152906001019060200180831161113257829003601f168201915b5050505050905060008151141561119b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119290614262565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120c906142a2565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61126461198d565b73ffffffffffffffffffffffffffffffffffffffff166112826113f0565b73ffffffffffffffffffffffffffffffffffffffff16146112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf90614362565b60405180910390fd5b6112e26000612001565b565b6112ec61198d565b73ffffffffffffffffffffffffffffffffffffffff1661130a6113f0565b73ffffffffffffffffffffffffffffffffffffffff1614611360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135790614362565b60405180910390fd5b80600c8190555050565b61137261198d565b73ffffffffffffffffffffffffffffffffffffffff166113906113f0565b73ffffffffffffffffffffffffffffffffffffffff16146113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd90614362565b60405180910390fd5b6113ee6120c7565b565b6000600960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61142261198d565b73ffffffffffffffffffffffffffffffffffffffff166114406113f0565b73ffffffffffffffffffffffffffffffffffffffff1614611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d90614362565b60405180910390fd5b808451146114d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d090614222565b60405180910390fd5b8083511461151c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151390614222565b60405180910390fd5b8082511461155f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155690614102565b60405180910390fd5b60005b818110156115d6576115c38582815181106115805761157f614998565b5b602002602001015185838151811061159b5761159a614998565b5b60200260200101518584815181106115b6576115b5614998565b5b6020026020010151610c4b565b80806115ce90614887565b915050611562565b5050505050565b6060600380546115ec90614824565b80601f016020809104026020016040519081016040528092919081815260200182805461161890614824565b80156116655780601f1061163a57610100808354040283529160200191611665565b820191906000526020600020905b81548152906001019060200180831161164857829003601f168201915b5050505050905090565b61168161167a61198d565b838361216a565b5050565b61169661169061198d565b83611a4e565b6116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc90614402565b60405180910390fd5b6116e1848484846122d7565b50505050565b60606116f282612333565b9050919050565b61170161198d565b73ffffffffffffffffffffffffffffffffffffffff1661171f6113f0565b73ffffffffffffffffffffffffffffffffffffffff1614611775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176c90614362565b60405180910390fd5b61177f8282612485565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61181f61198d565b73ffffffffffffffffffffffffffffffffffffffff1661183d6113f0565b73ffffffffffffffffffffffffffffffffffffffff1614611893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188a90614362565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90614162565b60405180910390fd5b61190c81612001565b50565b600061191a8261261a565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a0883611002565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a5982611921565b611a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8f90614202565b60405180910390fd5b6000611aa383611002565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ae55750611ae48185611783565b5b80611b2357508373ffffffffffffffffffffffffffffffffffffffff16611b0b84610778565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b4c82611002565b73ffffffffffffffffffffffffffffffffffffffff1614611ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9990614182565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c09906141c2565b60405180910390fd5b611c1d8383836126fc565b611c28600082611995565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c78919061470b565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ccf919061462a565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d8e838383612754565b505050565b60008060006041845114611ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd390614442565b60405180910390fd5b6020840151925060408401519150606084015160001a90509193909250565b6000612710905090565b600e81604051611e159190613f35565b908152602001604051809103902060009054906101000a900460ff1615611e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6890614462565b60405180910390fd5b600081511415611eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ead906143e2565b60405180910390fd5b6001600e82604051611ec89190613f35565b908152602001604051809103902060006101000a81548160ff021916908315150217905550611f0082611efb600a612759565b612767565b611f13611f0d600a612759565b84612785565b80600f6000611f22600a612759565b81526020019081526020016000209080519060200190611f439291906130ea565b50611f4e600a6127f9565b505050565b611f5b610feb565b611f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9190614122565b60405180910390fd5b6000600960006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611fde61198d565b604051611feb9190613fab565b60405180910390a1565b611ffe8161280f565b50565b6000600960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6120cf610feb565b1561210f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210690614242565b60405180910390fd5b6001600960006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861215361198d565b6040516121609190613fab565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d0906141e2565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122ca919061403b565b60405180910390a3505050565b6122e2848484611b2c565b6122ee84848484612824565b61232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614142565b60405180910390fd5b50505050565b606061233e82611921565b61237d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237490614322565b60405180910390fd5b600060086000848152602001908152602001600020805461239d90614824565b80601f01602080910402602001604051908101604052809291908181526020018280546123c990614824565b80156124165780601f106123eb57610100808354040283529160200191612416565b820191906000526020600020905b8154815290600101906020018083116123f957829003601f168201915b5050505050905060006124276129bb565b905060008151141561243d578192505050612480565b60008251111561247257808260405160200161245a929190613f4c565b60405160208183030381529060405292505050612480565b61247b846129d2565b925050505b919050565b61248d611dfb565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156124eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e290614422565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561255b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612552906144c2565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126e557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126f557506126f482612a79565b5b9050919050565b612704610feb565b15612744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273b90614242565b60405180910390fd5b61274f838383612af3565b505050565b505050565b600081600001549050919050565b612781828260405180602001604052806000815250612af8565b5050565b61278e82611921565b6127cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c4906142e2565b60405180910390fd5b806008600084815260200190815260200160002090805190602001906127f49291906130ea565b505050565b6001816000016000828254019250508190555050565b61281881612b53565b61282181612ba6565b50565b60006128458473ffffffffffffffffffffffffffffffffffffffff16612c05565b156129ae578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261286e61198d565b8786866040518563ffffffff1660e01b81526004016128909493929190613fc6565b602060405180830381600087803b1580156128aa57600080fd5b505af19250505080156128db57506040513d601f19601f820116820180604052508101906128d891906137e1565b60015b61295e573d806000811461290b576040519150601f19603f3d011682016040523d82523d6000602084013e612910565b606091505b50600081511415612956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294d90614142565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129b3565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606129dd82611921565b612a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a13906143a2565b60405180910390fd5b6000612a266129bb565b90506000815111612a465760405180602001604052806000815250612a71565b80612a5084612c28565b604051602001612a61929190613f4c565b6040516020818303038152906040525b915050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612aec5750612aeb82612d89565b5b9050919050565b505050565b612b028383612df3565b612b0f6000848484612824565b612b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4590614142565b60405180910390fd5b505050565b612b5c81612fcd565b6000600860008381526020019081526020016000208054612b7c90614824565b905014612ba357600860008281526020019081526020016000206000612ba29190613170565b5b50565b60016000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000821415612c70576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d84565b600082905060005b60008214612ca2578080612c8b90614887565b915050600a82612c9b9190614680565b9150612c78565b60008167ffffffffffffffff811115612cbe57612cbd6149c7565b5b6040519080825280601f01601f191660200182016040528015612cf05781602001600182028036833780820191505090505b5090505b60008514612d7d57600182612d09919061470b565b9150600a85612d1891906148da565b6030612d24919061462a565b60f81b818381518110612d3a57612d39614998565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d769190614680565b9450612cf4565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5a90614302565b60405180910390fd5b612e6c81611921565b15612eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea3906141a2565b60405180910390fd5b612eb8600083836126fc565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f08919061462a565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612fc960008383612754565b5050565b6000612fd882611002565b9050612fe6816000846126fc565b612ff1600083611995565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613041919061470b565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130e681600084612754565b5050565b8280546130f690614824565b90600052602060002090601f016020900481019282613118576000855561315f565b82601f1061313157805160ff191683800117855561315f565b8280016001018555821561315f579182015b8281111561315e578251825591602001919060010190613143565b5b50905061316c91906131b0565b5090565b50805461317c90614824565b6000825580601f1061318e57506131ad565b601f0160209004906000526020600020908101906131ac91906131b0565b5b50565b5b808211156131c95760008160009055506001016131b1565b5090565b60006131e06131db84614522565b6144fd565b90508083825260208201905082856020860282011115613203576132026149fb565b5b60005b858110156132335781613219888261334f565b845260208401935060208301925050600181019050613206565b5050509392505050565b600061325061324b8461454e565b6144fd565b90508083825260208201905082856020860282011115613273576132726149fb565b5b60005b858110156132c157813567ffffffffffffffff811115613299576132986149f6565b5b8086016132a68982613442565b85526020850194506020840193505050600181019050613276565b5050509392505050565b60006132de6132d98461457a565b6144fd565b9050828152602081018484840111156132fa576132f9614a00565b5b6133058482856147e2565b509392505050565b600061332061331b846145ab565b6144fd565b90508281526020810184848401111561333c5761333b614a00565b5b6133478482856147e2565b509392505050565b60008135905061335e81615261565b92915050565b600082601f830112613379576133786149f6565b5b81356133898482602086016131cd565b91505092915050565b600082601f8301126133a7576133a66149f6565b5b81356133b784826020860161323d565b91505092915050565b6000813590506133cf81615278565b92915050565b6000813590506133e48161528f565b92915050565b6000813590506133f9816152a6565b92915050565b60008151905061340e816152a6565b92915050565b600082601f830112613429576134286149f6565b5b81356134398482602086016132cb565b91505092915050565b600082601f830112613457576134566149f6565b5b813561346784826020860161330d565b91505092915050565b60008135905061347f816152bd565b92915050565b600081359050613494816152d4565b92915050565b6000602082840312156134b0576134af614a0a565b5b60006134be8482850161334f565b91505092915050565b600080604083850312156134de576134dd614a0a565b5b60006134ec8582860161334f565b92505060206134fd8582860161334f565b9150509250929050565b6000806000606084860312156135205761351f614a0a565b5b600061352e8682870161334f565b935050602061353f8682870161334f565b925050604061355086828701613470565b9150509250925092565b6000806000806080858703121561357457613573614a0a565b5b60006135828782880161334f565b94505060206135938782880161334f565b93505060406135a487828801613470565b925050606085013567ffffffffffffffff8111156135c5576135c4614a05565b5b6135d187828801613414565b91505092959194509250565b600080604083850312156135f4576135f3614a0a565b5b60006136028582860161334f565b9250506020613613858286016133c0565b9150509250929050565b6000806040838503121561363457613633614a0a565b5b60006136428582860161334f565b925050602061365385828601613470565b9150509250929050565b6000806040838503121561367457613673614a0a565b5b60006136828582860161334f565b925050602061369385828601613485565b9150509250929050565b600080600080608085870312156136b7576136b6614a0a565b5b600085013567ffffffffffffffff8111156136d5576136d4614a05565b5b6136e187828801613392565b945050602085013567ffffffffffffffff81111561370257613701614a05565b5b61370e87828801613364565b935050604085013567ffffffffffffffff81111561372f5761372e614a05565b5b61373b87828801613392565b925050606061374c87828801613470565b91505092959194509250565b6000806040838503121561376f5761376e614a0a565b5b600061377d858286016133d5565b925050602083013567ffffffffffffffff81111561379e5761379d614a05565b5b6137aa85828601613414565b9150509250929050565b6000602082840312156137ca576137c9614a0a565b5b60006137d8848285016133ea565b91505092915050565b6000602082840312156137f7576137f6614a0a565b5b6000613805848285016133ff565b91505092915050565b60008060006060848603121561382757613826614a0a565b5b600084013567ffffffffffffffff81111561384557613844614a05565b5b61385186828701613442565b93505060206138628682870161334f565b925050604084013567ffffffffffffffff81111561388357613882614a05565b5b61388f86828701613442565b9150509250925092565b6000806000606084860312156138b2576138b1614a0a565b5b600084013567ffffffffffffffff8111156138d0576138cf614a05565b5b6138dc86828701613442565b935050602084013567ffffffffffffffff8111156138fd576138fc614a05565b5b61390986828701613414565b925050604084013567ffffffffffffffff81111561392a57613929614a05565b5b61393686828701613442565b9150509250925092565b60006020828403121561395657613955614a0a565b5b600061396484828501613470565b91505092915050565b6000806040838503121561398457613983614a0a565b5b600061399285828601613470565b92505060206139a385828601613470565b9150509250929050565b6139b68161473f565b82525050565b6139c581614751565b82525050565b6139d48161475d565b82525050565b6139eb6139e68261475d565b6148d0565b82525050565b60006139fc826145dc565b613a0681856145f2565b9350613a168185602086016147f1565b613a1f81614a0f565b840191505092915050565b6000613a35826145e7565b613a3f818561460e565b9350613a4f8185602086016147f1565b613a5881614a0f565b840191505092915050565b6000613a6e826145e7565b613a78818561461f565b9350613a888185602086016147f1565b80840191505092915050565b6000613aa160238361460e565b9150613aac82614a20565b604082019050919050565b6000613ac460148361460e565b9150613acf82614a6f565b602082019050919050565b6000613ae7601c8361461f565b9150613af282614a98565b601c82019050919050565b6000613b0a60328361460e565b9150613b1582614ac1565b604082019050919050565b6000613b2d60268361460e565b9150613b3882614b10565b604082019050919050565b6000613b5060258361460e565b9150613b5b82614b5f565b604082019050919050565b6000613b73601c8361460e565b9150613b7e82614bae565b602082019050919050565b6000613b9660248361460e565b9150613ba182614bd7565b604082019050919050565b6000613bb960198361460e565b9150613bc482614c26565b602082019050919050565b6000613bdc602c8361460e565b9150613be782614c4f565b604082019050919050565b6000613bff60288361460e565b9150613c0a82614c9e565b604082019050919050565b6000613c2260108361460e565b9150613c2d82614ced565b602082019050919050565b6000613c45602a8361460e565b9150613c5082614d16565b604082019050919050565b6000613c6860388361460e565b9150613c7382614d65565b604082019050919050565b6000613c8b602a8361460e565b9150613c9682614db4565b604082019050919050565b6000613cae60298361460e565b9150613cb982614e03565b604082019050919050565b6000613cd1602e8361460e565b9150613cdc82614e52565b604082019050919050565b6000613cf460208361460e565b9150613cff82614ea1565b602082019050919050565b6000613d1760318361460e565b9150613d2282614eca565b604082019050919050565b6000613d3a602c8361460e565b9150613d4582614f19565b604082019050919050565b6000613d5d60208361460e565b9150613d6882614f68565b602082019050919050565b6000613d8060138361460e565b9150613d8b82614f91565b602082019050919050565b6000613da3602f8361460e565b9150613dae82614fba565b604082019050919050565b6000613dc660218361460e565b9150613dd182615009565b604082019050919050565b6000613de9600083614603565b9150613df482615058565b600082019050919050565b6000613e0c60228361460e565b9150613e178261505b565b604082019050919050565b6000613e2f60318361460e565b9150613e3a826150aa565b604082019050919050565b6000613e52602a8361460e565b9150613e5d826150f9565b604082019050919050565b6000613e7560188361460e565b9150613e8082615148565b602082019050919050565b6000613e9860228361460e565b9150613ea382615171565b604082019050919050565b6000613ebb60308361460e565b9150613ec6826151c0565b604082019050919050565b6000613ede60148361460e565b9150613ee98261520f565b602082019050919050565b6000613f0160198361460e565b9150613f0c82615238565b602082019050919050565b613f20816147b3565b82525050565b613f2f816147bd565b82525050565b6000613f418284613a63565b915081905092915050565b6000613f588285613a63565b9150613f648284613a63565b91508190509392505050565b6000613f7b82613ada565b9150613f8782846139da565b60208201915081905092915050565b6000613fa182613ddc565b9150819050919050565b6000602082019050613fc060008301846139ad565b92915050565b6000608082019050613fdb60008301876139ad565b613fe860208301866139ad565b613ff56040830185613f17565b818103606083015261400781846139f1565b905095945050505050565b600060408201905061402760008301856139ad565b6140346020830184613f17565b9392505050565b600060208201905061405060008301846139bc565b92915050565b600060808201905061406b60008301876139cb565b6140786020830186613f26565b61408560408301856139cb565b61409260608301846139cb565b95945050505050565b600060208201905081810360008301526140b58184613a2a565b905092915050565b600060608201905081810360008301526140d78186613a2a565b90506140e660208301856139ad565b81810360408301526140f88184613a2a565b9050949350505050565b6000602082019050818103600083015261411b81613a94565b9050919050565b6000602082019050818103600083015261413b81613ab7565b9050919050565b6000602082019050818103600083015261415b81613afd565b9050919050565b6000602082019050818103600083015261417b81613b20565b9050919050565b6000602082019050818103600083015261419b81613b43565b9050919050565b600060208201905081810360008301526141bb81613b66565b9050919050565b600060208201905081810360008301526141db81613b89565b9050919050565b600060208201905081810360008301526141fb81613bac565b9050919050565b6000602082019050818103600083015261421b81613bcf565b9050919050565b6000602082019050818103600083015261423b81613bf2565b9050919050565b6000602082019050818103600083015261425b81613c15565b9050919050565b6000602082019050818103600083015261427b81613c38565b9050919050565b6000602082019050818103600083015261429b81613c5b565b9050919050565b600060208201905081810360008301526142bb81613c7e565b9050919050565b600060208201905081810360008301526142db81613ca1565b9050919050565b600060208201905081810360008301526142fb81613cc4565b9050919050565b6000602082019050818103600083015261431b81613ce7565b9050919050565b6000602082019050818103600083015261433b81613d0a565b9050919050565b6000602082019050818103600083015261435b81613d2d565b9050919050565b6000602082019050818103600083015261437b81613d50565b9050919050565b6000602082019050818103600083015261439b81613d73565b9050919050565b600060208201905081810360008301526143bb81613d96565b9050919050565b600060208201905081810360008301526143db81613db9565b9050919050565b600060208201905081810360008301526143fb81613dff565b9050919050565b6000602082019050818103600083015261441b81613e22565b9050919050565b6000602082019050818103600083015261443b81613e45565b9050919050565b6000602082019050818103600083015261445b81613e68565b9050919050565b6000602082019050818103600083015261447b81613e8b565b9050919050565b6000602082019050818103600083015261449b81613eae565b9050919050565b600060208201905081810360008301526144bb81613ed1565b9050919050565b600060208201905081810360008301526144db81613ef4565b9050919050565b60006020820190506144f76000830184613f17565b92915050565b6000614507614518565b90506145138282614856565b919050565b6000604051905090565b600067ffffffffffffffff82111561453d5761453c6149c7565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614569576145686149c7565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614595576145946149c7565b5b61459e82614a0f565b9050602081019050919050565b600067ffffffffffffffff8211156145c6576145c56149c7565b5b6145cf82614a0f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614635826147b3565b9150614640836147b3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146755761467461490b565b5b828201905092915050565b600061468b826147b3565b9150614696836147b3565b9250826146a6576146a561493a565b5b828204905092915050565b60006146bc826147b3565b91506146c7836147b3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614700576146ff61490b565b5b828202905092915050565b6000614716826147b3565b9150614721836147b3565b9250828210156147345761473361490b565b5b828203905092915050565b600061474a82614793565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561480f5780820151818401526020810190506147f4565b8381111561481e576000848401525b50505050565b6000600282049050600182168061483c57607f821691505b602082108114156148505761484f614969565b5b50919050565b61485f82614a0f565b810181811067ffffffffffffffff8211171561487e5761487d6149c7565b5b80604052505050565b6000614892826147b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148c5576148c461490b565b5b600182019050919050565b6000819050919050565b60006148e5826147b3565b91506148f0836147b3565b925082614900576148ff61493a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f7461736b494473206d75737420626520657175616c20746f2062617463685f7360008201527f697a650000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f696e70757420617272617973206d75737420626520657175616c20746f20626160008201527f7463685f73697a65000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a207461736b494420717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420656e6f756768206574682073656e7400000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f43616e6e6f742075736520656d70747920737472696e6720666f72207461736b60008201527f4944000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f696e76616c6964207369676e6174757265206c656e6774680000000000000000600082015250565b7f5468697320647265616d2068617320616c7265616479206265656e206d696e7460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f7369676e617475726520697320696e76616c6964000000000000000000000000600082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b61526a8161473f565b811461527557600080fd5b50565b61528181614751565b811461528c57600080fd5b50565b6152988161475d565b81146152a357600080fd5b50565b6152af81614767565b81146152ba57600080fd5b50565b6152c6816147b3565b81146152d157600080fd5b50565b6152dd816147ca565b81146152e857600080fd5b5056fea264697066735822122059466b4f0b90f6df67833eede15768911332b143ec3a449968caeafd05fa9a5864736f6c63430008070033000000000000000000000000f5723a225cd6d4e087efd6f7e030b1d8c83a9b59

Deployed Bytecode

0x6080604052600436106101c25760003560e01c80636352211e116100f75780638f40522111610095578063c87b56dd11610064578063c87b56dd14610608578063d691e43c14610645578063e985e9c51461066e578063f2fde38b146106ab576101c2565b80638f4052211461056257806395d89b411461058b578063a22cb465146105b6578063b88d4fde146105df576101c2565b8063715018a6116100d1578063715018a6146104e057806384017e52146104f75780638456cb59146105205780638da5cb5b14610537576101c2565b80636352211e1461042957806366f9cff21461046657806370a08231146104a3576101c2565b8063391f88ca1161016457806342842e0e1161013e57806342842e0e1461039057806342966c68146103b9578063532b77b3146103e25780635c975abb146103fe576101c2565b8063391f88ca146103395780633ccfd60b146103625780633f4ba83a14610379576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806323b872dd14610295578063258ae582146102be5780632a55205a146102fb576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906137b4565b6106d4565b6040516101fb919061403b565b60405180910390f35b34801561021057600080fd5b506102196106e6565b604051610226919061409b565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190613940565b610778565b6040516102639190613fab565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e919061361d565b6107fd565b005b3480156102a157600080fd5b506102bc60048036038101906102b79190613507565b610915565b005b3480156102ca57600080fd5b506102e560048036038101906102e09190613758565b610975565b6040516102f2919061403b565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d919061396d565b610a60565b604051610330929190614012565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b919061380e565b610c4b565b005b34801561036e57600080fd5b50610377610cd7565b005b34801561038557600080fd5b5061038e610dd3565b005b34801561039c57600080fd5b506103b760048036038101906103b29190613507565b610e59565b005b3480156103c557600080fd5b506103e060048036038101906103db9190613940565b610e79565b005b6103fc60048036038101906103f79190613899565b610ed5565b005b34801561040a57600080fd5b50610413610feb565b604051610420919061403b565b60405180910390f35b34801561043557600080fd5b50610450600480360381019061044b9190613940565b611002565b60405161045d9190613fab565b60405180910390f35b34801561047257600080fd5b5061048d60048036038101906104889190613940565b6110b4565b60405161049a919061409b565b60405180910390f35b3480156104af57600080fd5b506104ca60048036038101906104c5919061349a565b6111a4565b6040516104d791906144e2565b60405180910390f35b3480156104ec57600080fd5b506104f561125c565b005b34801561050357600080fd5b5061051e60048036038101906105199190613940565b6112e4565b005b34801561052c57600080fd5b5061053561136a565b005b34801561054357600080fd5b5061054c6113f0565b6040516105599190613fab565b60405180910390f35b34801561056e57600080fd5b506105896004803603810190610584919061369d565b61141a565b005b34801561059757600080fd5b506105a06115dd565b6040516105ad919061409b565b60405180910390f35b3480156105c257600080fd5b506105dd60048036038101906105d891906135dd565b61166f565b005b3480156105eb57600080fd5b506106066004803603810190610601919061355a565b611685565b005b34801561061457600080fd5b5061062f600480360381019061062a9190613940565b6116e7565b60405161063c919061409b565b60405180910390f35b34801561065157600080fd5b5061066c6004803603810190610667919061365d565b6116f9565b005b34801561067a57600080fd5b50610695600480360381019061069091906134c7565b611783565b6040516106a2919061403b565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd919061349a565b611817565b005b60006106df8261190f565b9050919050565b6060600280546106f590614824565b80601f016020809104026020016040519081016040528092919081815260200182805461072190614824565b801561076e5780601f106107435761010080835404028352916020019161076e565b820191906000526020600020905b81548152906001019060200180831161075157829003601f168201915b5050505050905090565b600061078382611921565b6107c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b990614342565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080882611002565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610870906143c2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661089861198d565b73ffffffffffffffffffffffffffffffffffffffff1614806108c757506108c6816108c161198d565b611783565b5b610906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fd90614282565b60405180910390fd5b6109108383611995565b505050565b61092661092061198d565b82611a4e565b610965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095c90614402565b60405180910390fd5b610970838383611b2c565b505050565b60008060008061098485611d93565b92509250925060008660405160200161099d9190613f70565b604051602081830303815290604052805190602001209050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660018284878760405160008152602001604052604051610a119493929190614056565b6020604051602081039080840390855afa158015610a33573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff161494505050505092915050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610bf65760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610c00611dfb565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610c2c91906146b1565b610c369190614680565b90508160000151819350935050509250929050565b610c5361198d565b73ffffffffffffffffffffffffffffffffffffffff16610c716113f0565b73ffffffffffffffffffffffffffffffffffffffff1614610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90614362565b60405180910390fd5b610cd2838383611e05565b505050565b610cdf61198d565b73ffffffffffffffffffffffffffffffffffffffff16610cfd6113f0565b73ffffffffffffffffffffffffffffffffffffffff1614610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90614362565b60405180910390fd5b6000610d5d6113f0565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d8090613f96565b60006040518083038185875af1925050503d8060008114610dbd576040519150601f19603f3d011682016040523d82523d6000602084013e610dc2565b606091505b5050905080610dd057600080fd5b50565b610ddb61198d565b73ffffffffffffffffffffffffffffffffffffffff16610df96113f0565b73ffffffffffffffffffffffffffffffffffffffff1614610e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4690614362565b60405180910390fd5b610e57611f53565b565b610e7483838360405180602001604052806000815250611685565b505050565b610e8a610e8461198d565b82611a4e565b610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec090614482565b60405180910390fd5b610ed281611ff5565b50565b610edd610feb565b15610f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1490614242565b60405180910390fd5b600c54341015610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990614382565b60405180910390fd5b6000833383604051602001610f79939291906140bd565b604051602081830303815290604052805190602001209050610f9b8184610975565b610fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd1906144a2565b60405180910390fd5b610fe5843384611e05565b50505050565b6000600960009054906101000a900460ff16905090565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a2906142c2565b60405180910390fd5b80915050919050565b60606000600f600084815260200190815260200160002080546110d690614824565b80601f016020809104026020016040519081016040528092919081815260200182805461110290614824565b801561114f5780601f106111245761010080835404028352916020019161114f565b820191906000526020600020905b81548152906001019060200180831161113257829003601f168201915b5050505050905060008151141561119b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119290614262565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120c906142a2565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61126461198d565b73ffffffffffffffffffffffffffffffffffffffff166112826113f0565b73ffffffffffffffffffffffffffffffffffffffff16146112d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cf90614362565b60405180910390fd5b6112e26000612001565b565b6112ec61198d565b73ffffffffffffffffffffffffffffffffffffffff1661130a6113f0565b73ffffffffffffffffffffffffffffffffffffffff1614611360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135790614362565b60405180910390fd5b80600c8190555050565b61137261198d565b73ffffffffffffffffffffffffffffffffffffffff166113906113f0565b73ffffffffffffffffffffffffffffffffffffffff16146113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd90614362565b60405180910390fd5b6113ee6120c7565b565b6000600960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61142261198d565b73ffffffffffffffffffffffffffffffffffffffff166114406113f0565b73ffffffffffffffffffffffffffffffffffffffff1614611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d90614362565b60405180910390fd5b808451146114d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d090614222565b60405180910390fd5b8083511461151c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151390614222565b60405180910390fd5b8082511461155f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155690614102565b60405180910390fd5b60005b818110156115d6576115c38582815181106115805761157f614998565b5b602002602001015185838151811061159b5761159a614998565b5b60200260200101518584815181106115b6576115b5614998565b5b6020026020010151610c4b565b80806115ce90614887565b915050611562565b5050505050565b6060600380546115ec90614824565b80601f016020809104026020016040519081016040528092919081815260200182805461161890614824565b80156116655780601f1061163a57610100808354040283529160200191611665565b820191906000526020600020905b81548152906001019060200180831161164857829003601f168201915b5050505050905090565b61168161167a61198d565b838361216a565b5050565b61169661169061198d565b83611a4e565b6116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc90614402565b60405180910390fd5b6116e1848484846122d7565b50505050565b60606116f282612333565b9050919050565b61170161198d565b73ffffffffffffffffffffffffffffffffffffffff1661171f6113f0565b73ffffffffffffffffffffffffffffffffffffffff1614611775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176c90614362565b60405180910390fd5b61177f8282612485565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61181f61198d565b73ffffffffffffffffffffffffffffffffffffffff1661183d6113f0565b73ffffffffffffffffffffffffffffffffffffffff1614611893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188a90614362565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90614162565b60405180910390fd5b61190c81612001565b50565b600061191a8261261a565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a0883611002565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a5982611921565b611a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8f90614202565b60405180910390fd5b6000611aa383611002565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ae55750611ae48185611783565b5b80611b2357508373ffffffffffffffffffffffffffffffffffffffff16611b0b84610778565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b4c82611002565b73ffffffffffffffffffffffffffffffffffffffff1614611ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9990614182565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c09906141c2565b60405180910390fd5b611c1d8383836126fc565b611c28600082611995565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c78919061470b565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ccf919061462a565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d8e838383612754565b505050565b60008060006041845114611ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd390614442565b60405180910390fd5b6020840151925060408401519150606084015160001a90509193909250565b6000612710905090565b600e81604051611e159190613f35565b908152602001604051809103902060009054906101000a900460ff1615611e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6890614462565b60405180910390fd5b600081511415611eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ead906143e2565b60405180910390fd5b6001600e82604051611ec89190613f35565b908152602001604051809103902060006101000a81548160ff021916908315150217905550611f0082611efb600a612759565b612767565b611f13611f0d600a612759565b84612785565b80600f6000611f22600a612759565b81526020019081526020016000209080519060200190611f439291906130ea565b50611f4e600a6127f9565b505050565b611f5b610feb565b611f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9190614122565b60405180910390fd5b6000600960006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611fde61198d565b604051611feb9190613fab565b60405180910390a1565b611ffe8161280f565b50565b6000600960019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6120cf610feb565b1561210f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210690614242565b60405180910390fd5b6001600960006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861215361198d565b6040516121609190613fab565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d0906141e2565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122ca919061403b565b60405180910390a3505050565b6122e2848484611b2c565b6122ee84848484612824565b61232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614142565b60405180910390fd5b50505050565b606061233e82611921565b61237d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237490614322565b60405180910390fd5b600060086000848152602001908152602001600020805461239d90614824565b80601f01602080910402602001604051908101604052809291908181526020018280546123c990614824565b80156124165780601f106123eb57610100808354040283529160200191612416565b820191906000526020600020905b8154815290600101906020018083116123f957829003601f168201915b5050505050905060006124276129bb565b905060008151141561243d578192505050612480565b60008251111561247257808260405160200161245a929190613f4c565b60405160208183030381529060405292505050612480565b61247b846129d2565b925050505b919050565b61248d611dfb565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156124eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e290614422565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561255b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612552906144c2565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126e557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126f557506126f482612a79565b5b9050919050565b612704610feb565b15612744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273b90614242565b60405180910390fd5b61274f838383612af3565b505050565b505050565b600081600001549050919050565b612781828260405180602001604052806000815250612af8565b5050565b61278e82611921565b6127cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c4906142e2565b60405180910390fd5b806008600084815260200190815260200160002090805190602001906127f49291906130ea565b505050565b6001816000016000828254019250508190555050565b61281881612b53565b61282181612ba6565b50565b60006128458473ffffffffffffffffffffffffffffffffffffffff16612c05565b156129ae578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261286e61198d565b8786866040518563ffffffff1660e01b81526004016128909493929190613fc6565b602060405180830381600087803b1580156128aa57600080fd5b505af19250505080156128db57506040513d601f19601f820116820180604052508101906128d891906137e1565b60015b61295e573d806000811461290b576040519150601f19603f3d011682016040523d82523d6000602084013e612910565b606091505b50600081511415612956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294d90614142565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129b3565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606129dd82611921565b612a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a13906143a2565b60405180910390fd5b6000612a266129bb565b90506000815111612a465760405180602001604052806000815250612a71565b80612a5084612c28565b604051602001612a61929190613f4c565b6040516020818303038152906040525b915050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612aec5750612aeb82612d89565b5b9050919050565b505050565b612b028383612df3565b612b0f6000848484612824565b612b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4590614142565b60405180910390fd5b505050565b612b5c81612fcd565b6000600860008381526020019081526020016000208054612b7c90614824565b905014612ba357600860008281526020019081526020016000206000612ba29190613170565b5b50565b60016000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000821415612c70576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d84565b600082905060005b60008214612ca2578080612c8b90614887565b915050600a82612c9b9190614680565b9150612c78565b60008167ffffffffffffffff811115612cbe57612cbd6149c7565b5b6040519080825280601f01601f191660200182016040528015612cf05781602001600182028036833780820191505090505b5090505b60008514612d7d57600182612d09919061470b565b9150600a85612d1891906148da565b6030612d24919061462a565b60f81b818381518110612d3a57612d39614998565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d769190614680565b9450612cf4565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5a90614302565b60405180910390fd5b612e6c81611921565b15612eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea3906141a2565b60405180910390fd5b612eb8600083836126fc565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f08919061462a565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612fc960008383612754565b5050565b6000612fd882611002565b9050612fe6816000846126fc565b612ff1600083611995565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613041919061470b565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130e681600084612754565b5050565b8280546130f690614824565b90600052602060002090601f016020900481019282613118576000855561315f565b82601f1061313157805160ff191683800117855561315f565b8280016001018555821561315f579182015b8281111561315e578251825591602001919060010190613143565b5b50905061316c91906131b0565b5090565b50805461317c90614824565b6000825580601f1061318e57506131ad565b601f0160209004906000526020600020908101906131ac91906131b0565b5b50565b5b808211156131c95760008160009055506001016131b1565b5090565b60006131e06131db84614522565b6144fd565b90508083825260208201905082856020860282011115613203576132026149fb565b5b60005b858110156132335781613219888261334f565b845260208401935060208301925050600181019050613206565b5050509392505050565b600061325061324b8461454e565b6144fd565b90508083825260208201905082856020860282011115613273576132726149fb565b5b60005b858110156132c157813567ffffffffffffffff811115613299576132986149f6565b5b8086016132a68982613442565b85526020850194506020840193505050600181019050613276565b5050509392505050565b60006132de6132d98461457a565b6144fd565b9050828152602081018484840111156132fa576132f9614a00565b5b6133058482856147e2565b509392505050565b600061332061331b846145ab565b6144fd565b90508281526020810184848401111561333c5761333b614a00565b5b6133478482856147e2565b509392505050565b60008135905061335e81615261565b92915050565b600082601f830112613379576133786149f6565b5b81356133898482602086016131cd565b91505092915050565b600082601f8301126133a7576133a66149f6565b5b81356133b784826020860161323d565b91505092915050565b6000813590506133cf81615278565b92915050565b6000813590506133e48161528f565b92915050565b6000813590506133f9816152a6565b92915050565b60008151905061340e816152a6565b92915050565b600082601f830112613429576134286149f6565b5b81356134398482602086016132cb565b91505092915050565b600082601f830112613457576134566149f6565b5b813561346784826020860161330d565b91505092915050565b60008135905061347f816152bd565b92915050565b600081359050613494816152d4565b92915050565b6000602082840312156134b0576134af614a0a565b5b60006134be8482850161334f565b91505092915050565b600080604083850312156134de576134dd614a0a565b5b60006134ec8582860161334f565b92505060206134fd8582860161334f565b9150509250929050565b6000806000606084860312156135205761351f614a0a565b5b600061352e8682870161334f565b935050602061353f8682870161334f565b925050604061355086828701613470565b9150509250925092565b6000806000806080858703121561357457613573614a0a565b5b60006135828782880161334f565b94505060206135938782880161334f565b93505060406135a487828801613470565b925050606085013567ffffffffffffffff8111156135c5576135c4614a05565b5b6135d187828801613414565b91505092959194509250565b600080604083850312156135f4576135f3614a0a565b5b60006136028582860161334f565b9250506020613613858286016133c0565b9150509250929050565b6000806040838503121561363457613633614a0a565b5b60006136428582860161334f565b925050602061365385828601613470565b9150509250929050565b6000806040838503121561367457613673614a0a565b5b60006136828582860161334f565b925050602061369385828601613485565b9150509250929050565b600080600080608085870312156136b7576136b6614a0a565b5b600085013567ffffffffffffffff8111156136d5576136d4614a05565b5b6136e187828801613392565b945050602085013567ffffffffffffffff81111561370257613701614a05565b5b61370e87828801613364565b935050604085013567ffffffffffffffff81111561372f5761372e614a05565b5b61373b87828801613392565b925050606061374c87828801613470565b91505092959194509250565b6000806040838503121561376f5761376e614a0a565b5b600061377d858286016133d5565b925050602083013567ffffffffffffffff81111561379e5761379d614a05565b5b6137aa85828601613414565b9150509250929050565b6000602082840312156137ca576137c9614a0a565b5b60006137d8848285016133ea565b91505092915050565b6000602082840312156137f7576137f6614a0a565b5b6000613805848285016133ff565b91505092915050565b60008060006060848603121561382757613826614a0a565b5b600084013567ffffffffffffffff81111561384557613844614a05565b5b61385186828701613442565b93505060206138628682870161334f565b925050604084013567ffffffffffffffff81111561388357613882614a05565b5b61388f86828701613442565b9150509250925092565b6000806000606084860312156138b2576138b1614a0a565b5b600084013567ffffffffffffffff8111156138d0576138cf614a05565b5b6138dc86828701613442565b935050602084013567ffffffffffffffff8111156138fd576138fc614a05565b5b61390986828701613414565b925050604084013567ffffffffffffffff81111561392a57613929614a05565b5b61393686828701613442565b9150509250925092565b60006020828403121561395657613955614a0a565b5b600061396484828501613470565b91505092915050565b6000806040838503121561398457613983614a0a565b5b600061399285828601613470565b92505060206139a385828601613470565b9150509250929050565b6139b68161473f565b82525050565b6139c581614751565b82525050565b6139d48161475d565b82525050565b6139eb6139e68261475d565b6148d0565b82525050565b60006139fc826145dc565b613a0681856145f2565b9350613a168185602086016147f1565b613a1f81614a0f565b840191505092915050565b6000613a35826145e7565b613a3f818561460e565b9350613a4f8185602086016147f1565b613a5881614a0f565b840191505092915050565b6000613a6e826145e7565b613a78818561461f565b9350613a888185602086016147f1565b80840191505092915050565b6000613aa160238361460e565b9150613aac82614a20565b604082019050919050565b6000613ac460148361460e565b9150613acf82614a6f565b602082019050919050565b6000613ae7601c8361461f565b9150613af282614a98565b601c82019050919050565b6000613b0a60328361460e565b9150613b1582614ac1565b604082019050919050565b6000613b2d60268361460e565b9150613b3882614b10565b604082019050919050565b6000613b5060258361460e565b9150613b5b82614b5f565b604082019050919050565b6000613b73601c8361460e565b9150613b7e82614bae565b602082019050919050565b6000613b9660248361460e565b9150613ba182614bd7565b604082019050919050565b6000613bb960198361460e565b9150613bc482614c26565b602082019050919050565b6000613bdc602c8361460e565b9150613be782614c4f565b604082019050919050565b6000613bff60288361460e565b9150613c0a82614c9e565b604082019050919050565b6000613c2260108361460e565b9150613c2d82614ced565b602082019050919050565b6000613c45602a8361460e565b9150613c5082614d16565b604082019050919050565b6000613c6860388361460e565b9150613c7382614d65565b604082019050919050565b6000613c8b602a8361460e565b9150613c9682614db4565b604082019050919050565b6000613cae60298361460e565b9150613cb982614e03565b604082019050919050565b6000613cd1602e8361460e565b9150613cdc82614e52565b604082019050919050565b6000613cf460208361460e565b9150613cff82614ea1565b602082019050919050565b6000613d1760318361460e565b9150613d2282614eca565b604082019050919050565b6000613d3a602c8361460e565b9150613d4582614f19565b604082019050919050565b6000613d5d60208361460e565b9150613d6882614f68565b602082019050919050565b6000613d8060138361460e565b9150613d8b82614f91565b602082019050919050565b6000613da3602f8361460e565b9150613dae82614fba565b604082019050919050565b6000613dc660218361460e565b9150613dd182615009565b604082019050919050565b6000613de9600083614603565b9150613df482615058565b600082019050919050565b6000613e0c60228361460e565b9150613e178261505b565b604082019050919050565b6000613e2f60318361460e565b9150613e3a826150aa565b604082019050919050565b6000613e52602a8361460e565b9150613e5d826150f9565b604082019050919050565b6000613e7560188361460e565b9150613e8082615148565b602082019050919050565b6000613e9860228361460e565b9150613ea382615171565b604082019050919050565b6000613ebb60308361460e565b9150613ec6826151c0565b604082019050919050565b6000613ede60148361460e565b9150613ee98261520f565b602082019050919050565b6000613f0160198361460e565b9150613f0c82615238565b602082019050919050565b613f20816147b3565b82525050565b613f2f816147bd565b82525050565b6000613f418284613a63565b915081905092915050565b6000613f588285613a63565b9150613f648284613a63565b91508190509392505050565b6000613f7b82613ada565b9150613f8782846139da565b60208201915081905092915050565b6000613fa182613ddc565b9150819050919050565b6000602082019050613fc060008301846139ad565b92915050565b6000608082019050613fdb60008301876139ad565b613fe860208301866139ad565b613ff56040830185613f17565b818103606083015261400781846139f1565b905095945050505050565b600060408201905061402760008301856139ad565b6140346020830184613f17565b9392505050565b600060208201905061405060008301846139bc565b92915050565b600060808201905061406b60008301876139cb565b6140786020830186613f26565b61408560408301856139cb565b61409260608301846139cb565b95945050505050565b600060208201905081810360008301526140b58184613a2a565b905092915050565b600060608201905081810360008301526140d78186613a2a565b90506140e660208301856139ad565b81810360408301526140f88184613a2a565b9050949350505050565b6000602082019050818103600083015261411b81613a94565b9050919050565b6000602082019050818103600083015261413b81613ab7565b9050919050565b6000602082019050818103600083015261415b81613afd565b9050919050565b6000602082019050818103600083015261417b81613b20565b9050919050565b6000602082019050818103600083015261419b81613b43565b9050919050565b600060208201905081810360008301526141bb81613b66565b9050919050565b600060208201905081810360008301526141db81613b89565b9050919050565b600060208201905081810360008301526141fb81613bac565b9050919050565b6000602082019050818103600083015261421b81613bcf565b9050919050565b6000602082019050818103600083015261423b81613bf2565b9050919050565b6000602082019050818103600083015261425b81613c15565b9050919050565b6000602082019050818103600083015261427b81613c38565b9050919050565b6000602082019050818103600083015261429b81613c5b565b9050919050565b600060208201905081810360008301526142bb81613c7e565b9050919050565b600060208201905081810360008301526142db81613ca1565b9050919050565b600060208201905081810360008301526142fb81613cc4565b9050919050565b6000602082019050818103600083015261431b81613ce7565b9050919050565b6000602082019050818103600083015261433b81613d0a565b9050919050565b6000602082019050818103600083015261435b81613d2d565b9050919050565b6000602082019050818103600083015261437b81613d50565b9050919050565b6000602082019050818103600083015261439b81613d73565b9050919050565b600060208201905081810360008301526143bb81613d96565b9050919050565b600060208201905081810360008301526143db81613db9565b9050919050565b600060208201905081810360008301526143fb81613dff565b9050919050565b6000602082019050818103600083015261441b81613e22565b9050919050565b6000602082019050818103600083015261443b81613e45565b9050919050565b6000602082019050818103600083015261445b81613e68565b9050919050565b6000602082019050818103600083015261447b81613e8b565b9050919050565b6000602082019050818103600083015261449b81613eae565b9050919050565b600060208201905081810360008301526144bb81613ed1565b9050919050565b600060208201905081810360008301526144db81613ef4565b9050919050565b60006020820190506144f76000830184613f17565b92915050565b6000614507614518565b90506145138282614856565b919050565b6000604051905090565b600067ffffffffffffffff82111561453d5761453c6149c7565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614569576145686149c7565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614595576145946149c7565b5b61459e82614a0f565b9050602081019050919050565b600067ffffffffffffffff8211156145c6576145c56149c7565b5b6145cf82614a0f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614635826147b3565b9150614640836147b3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146755761467461490b565b5b828201905092915050565b600061468b826147b3565b9150614696836147b3565b9250826146a6576146a561493a565b5b828204905092915050565b60006146bc826147b3565b91506146c7836147b3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614700576146ff61490b565b5b828202905092915050565b6000614716826147b3565b9150614721836147b3565b9250828210156147345761473361490b565b5b828203905092915050565b600061474a82614793565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561480f5780820151818401526020810190506147f4565b8381111561481e576000848401525b50505050565b6000600282049050600182168061483c57607f821691505b602082108114156148505761484f614969565b5b50919050565b61485f82614a0f565b810181811067ffffffffffffffff8211171561487e5761487d6149c7565b5b80604052505050565b6000614892826147b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148c5576148c461490b565b5b600182019050919050565b6000819050919050565b60006148e5826147b3565b91506148f0836147b3565b925082614900576148ff61493a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f7461736b494473206d75737420626520657175616c20746f2062617463685f7360008201527f697a650000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f696e70757420617272617973206d75737420626520657175616c20746f20626160008201527f7463685f73697a65000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a207461736b494420717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420656e6f756768206574682073656e7400000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f43616e6e6f742075736520656d70747920737472696e6720666f72207461736b60008201527f4944000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f696e76616c6964207369676e6174757265206c656e6774680000000000000000600082015250565b7f5468697320647265616d2068617320616c7265616479206265656e206d696e7460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f7369676e617475726520697320696e76616c6964000000000000000000000000600082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b61526a8161473f565b811461527557600080fd5b50565b61528181614751565b811461528c57600080fd5b50565b6152988161475d565b81146152a357600080fd5b50565b6152af81614767565b81146152ba57600080fd5b50565b6152c6816147b3565b81146152d157600080fd5b50565b6152dd816147ca565b81146152e857600080fd5b5056fea264697066735822122059466b4f0b90f6df67833eede15768911332b143ec3a449968caeafd05fa9a5864736f6c63430008070033

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

000000000000000000000000f5723a225cd6d4e087efd6f7e030b1d8c83a9b59

-----Decoded View---------------
Arg [0] : verificationPublicKey (address): 0xf5723A225cD6D4E087Efd6F7E030B1d8c83A9b59

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f5723a225cd6d4e087efd6f7e030b1d8c83a9b59


Deployed Bytecode Sourcemap

50774:8481:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58521:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33970:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35530:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35053:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36280:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56760:378;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23387:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;53847:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54056:147;;;;;;;;;;;;;:::i;:::-;;52507:65;;;;;;;;;;;;;:::i;:::-;;36690:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46676:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55742:487;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8144:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33664:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54877:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33394:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6195:103;;;;;;;;;;;;;:::i;:::-;;52580:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52438:61;;;;;;;;;;;;;:::i;:::-;;5544:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52972:668;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34139:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35823:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36946:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59056:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52270:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36049:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6453:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58521:176;58629:4;58653:36;58677:11;58653:23;:36::i;:::-;58646:43;;58521:176;;;:::o;33970:100::-;34024:13;34057:5;34050:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33970:100;:::o;35530:221::-;35606:7;35634:16;35642:7;35634;:16::i;:::-;35626:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35719:15;:24;35735:7;35719:24;;;;;;;;;;;;;;;;;;;;;35712:31;;35530:221;;;:::o;35053:411::-;35134:13;35150:23;35165:7;35150:14;:23::i;:::-;35134:39;;35198:5;35192:11;;:2;:11;;;;35184:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35292:5;35276:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35301:37;35318:5;35325:12;:10;:12::i;:::-;35301:16;:37::i;:::-;35276:62;35254:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;35435:21;35444:2;35448:7;35435:8;:21::i;:::-;35123:341;35053:411;;:::o;36280:339::-;36475:41;36494:12;:10;:12::i;:::-;36508:7;36475:18;:41::i;:::-;36467:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;36583:28;36593:4;36599:2;36603:7;36583:9;:28::i;:::-;36280:339;;;:::o;56760:378::-;56867:4;56886:9;56897;56908:7;56919:25;56934:9;56919:14;:25::i;:::-;56885:59;;;;;;56955:19;57040:11;56987:65;;;;;;;;:::i;:::-;;;;;;;;;;;;;56977:76;;;;;;56955:98;;57106:24;;;;;;;;;;;57071:59;;:31;57081:11;57094:1;57097;57100;57071:31;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:59;;;57064:66;;;;;;56760:378;;;;:::o;23387:442::-;23484:7;23493;23513:26;23542:17;:27;23560:8;23542:27;;;;;;;;;;;23513:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23614:1;23586:30;;:7;:16;;;:30;;;23582:92;;;23643:19;23633:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23582:92;23686:21;23751:17;:15;:17::i;:::-;23710:58;;23724:7;:23;;;23711:36;;:10;:36;;;;:::i;:::-;23710:58;;;;:::i;:::-;23686:82;;23789:7;:16;;;23807:13;23781:40;;;;;;23387:442;;;;;:::o;53847:201::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54000:40:::1;54013:3;54018:13;54033:6;54000:12;:40::i;:::-;53847:201:::0;;;:::o;54056:147::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54105:7:::1;54126;:5;:7::i;:::-;54118:21;;54147;54118:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54104:69;;;54192:2;54184:11;;;::::0;::::1;;54093:110;54056:147::o:0;52507:65::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52554:10:::1;:8;:10::i;:::-;52507:65::o:0;36690:185::-;36828:39;36845:4;36851:2;36855:7;36828:39;;;;;;;;;;;;:16;:39::i;:::-;36690:185;;;:::o;46676:245::-;46794:41;46813:12;:10;:12::i;:::-;46827:7;46794:18;:41::i;:::-;46786:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;46899:14;46905:7;46899:5;:14::i;:::-;46676:245;:::o;55742:487::-;8470:8;:6;:8::i;:::-;8469:9;8461:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;55919:8:::1;;55906:9;:21;;55898:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;56029:19;56072:3;56077:10;56089:6;56061:35;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56051:46;;;;;;56029:68;;56116:30;56123:11;56136:9;56116:6;:30::i;:::-;56108:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;56184:37;56197:3;56202:10;56214:6;56184:12;:37::i;:::-;55850:379;55742:487:::0;;;:::o;8144:86::-;8191:4;8215:7;;;;;;;;;;;8208:14;;8144:86;:::o;33664:239::-;33736:7;33756:13;33772:7;:16;33780:7;33772:16;;;;;;;;;;;;;;;;;;;;;33756:32;;33824:1;33807:19;;:5;:19;;;;33799:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33890:5;33883:12;;;33664:239;;;:::o;54877:257::-;54936:13;54963:20;54986:16;:25;55003:7;54986:25;;;;;;;;;;;54963:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55054:1;55036:6;55030:20;:25;;55022:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;55120:6;55113:13;;;54877:257;;;:::o;33394:208::-;33466:7;33511:1;33494:19;;:5;:19;;;;33486:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;33578:9;:16;33588:5;33578:16;;;;;;;;;;;;;;;;33571:23;;33394:208;;;:::o;6195:103::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6260:30:::1;6287:1;6260:18;:30::i;:::-;6195:103::o:0;52580:100::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52662:10:::1;52651:8;:21;;;;52580:100:::0;:::o;52438:61::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52483:8:::1;:6;:8::i;:::-;52438:61::o:0;5544:87::-;5590:7;5617:6;;;;;;;;;;;5610:13;;5544:87;:::o;52972:668::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53265:9:::1;53250:4;:11;:24;53242:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;53364:9;53338:15;:22;:35;53330:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;53455:9;53437:7;:14;:27;53429:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;53522:6;53517:116;53538:9;53534:1;:13;53517:116;;;53569:52;53581:4;53586:1;53581:7;;;;;;;;:::i;:::-;;;;;;;;53590:15;53606:1;53590:18;;;;;;;;:::i;:::-;;;;;;;;53610:7;53618:1;53610:10;;;;;;;;:::i;:::-;;;;;;;;53569:11;:52::i;:::-;53549:3;;;;;:::i;:::-;;;;53517:116;;;;52972:668:::0;;;;:::o;34139:104::-;34195:13;34228:7;34221:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34139:104;:::o;35823:155::-;35918:52;35937:12;:10;:12::i;:::-;35951:8;35961;35918:18;:52::i;:::-;35823:155;;:::o;36946:328::-;37121:41;37140:12;:10;:12::i;:::-;37154:7;37121:18;:41::i;:::-;37113:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37227:39;37241:4;37247:2;37251:7;37260:5;37227:13;:39::i;:::-;36946:328;;;;:::o;59056:196::-;59183:13;59221:23;59236:7;59221:14;:23::i;:::-;59214:30;;59056:196;;;:::o;52270:160::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52380:42:::1;52399:8;52409:12;52380:18;:42::i;:::-;52270:160:::0;;:::o;36049:164::-;36146:4;36170:18;:25;36189:5;36170:25;;;;;;;;;;;;;;;:35;36196:8;36170:35;;;;;;;;;;;;;;;;;;;;;;;;;36163:42;;36049:164;;;;:::o;6453:201::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6562:1:::1;6542:22;;:8;:22;;;;6534:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6618:28;6637:8;6618:18;:28::i;:::-;6453:201:::0;:::o;47992:170::-;48094:4;48118:36;48142:11;48118:23;:36::i;:::-;48111:43;;47992:170;;;:::o;38784:127::-;38849:4;38901:1;38873:30;;:7;:16;38881:7;38873:16;;;;;;;;;;;;;;;;;;;;;:30;;;;38866:37;;38784:127;;;:::o;4268:98::-;4321:7;4348:10;4341:17;;4268:98;:::o;42930:174::-;43032:2;43005:15;:24;43021:7;43005:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43088:7;43084:2;43050:46;;43059:23;43074:7;43059:14;:23::i;:::-;43050:46;;;;;;;;;;;;42930:174;;:::o;39078:348::-;39171:4;39196:16;39204:7;39196;:16::i;:::-;39188:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39272:13;39288:23;39303:7;39288:14;:23::i;:::-;39272:39;;39341:5;39330:16;;:7;:16;;;:52;;;;39350:32;39367:5;39374:7;39350:16;:32::i;:::-;39330:52;:87;;;;39410:7;39386:31;;:20;39398:7;39386:11;:20::i;:::-;:31;;;39330:87;39322:96;;;39078:348;;;;:::o;42187:625::-;42346:4;42319:31;;:23;42334:7;42319:14;:23::i;:::-;:31;;;42311:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42425:1;42411:16;;:2;:16;;;;42403:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42481:39;42502:4;42508:2;42512:7;42481:20;:39::i;:::-;42585:29;42602:1;42606:7;42585:8;:29::i;:::-;42646:1;42627:9;:15;42637:4;42627:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;42675:1;42658:9;:13;42668:2;42658:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42706:2;42687:7;:16;42695:7;42687:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42745:7;42741:2;42726:27;;42735:4;42726:27;;;;;;;;;;;;42766:38;42786:4;42792:2;42796:7;42766:19;:38::i;:::-;42187:625;;;:::o;57525:921::-;57635:9;57659;57683:7;57746:2;57726:9;:16;:22;57718:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;58192:2;58181:9;58177:18;58171:25;58166:30;;58268:2;58257:9;58253:18;58247:25;58242:30;;58381:2;58370:9;58366:18;58360:25;58357:1;58352:34;58347:39;;57525:921;;;;;:::o;24111:97::-;24169:6;24195:5;24188:12;;24111:97;:::o;54211:492::-;54315:8;54324:6;54315:16;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;54314:17;54306:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;54413:1;54395:6;54389:20;:25;;54381:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54484:4;54465:8;54474:6;54465:16;;;;;;:::i;:::-;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;54499:40;54509:2;54513:25;:15;:23;:25::i;:::-;54499:9;:40::i;:::-;54550:44;54563:25;:15;:23;:25::i;:::-;54590:3;54550:12;:44::i;:::-;54651:6;54605:16;:43;54622:25;:15;:23;:25::i;:::-;54605:43;;;;;;;;;;;:52;;;;;;;;;;;;:::i;:::-;;54668:27;:15;:25;:27::i;:::-;54211:492;;;:::o;9203:120::-;8747:8;:6;:8::i;:::-;8739:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;9272:5:::1;9262:7;;:15;;;;;;;;;;;;;;;;;;9293:22;9302:12;:10;:12::i;:::-;9293:22;;;;;;:::i;:::-;;;;;;;;9203:120::o:0;58918:130::-;59020:20;59032:7;59020:11;:20::i;:::-;58918:130;:::o;6814:191::-;6888:16;6907:6;;;;;;;;;;;6888:25;;6933:8;6924:6;;:17;;;;;;;;;;;;;;;;;;6988:8;6957:40;;6978:8;6957:40;;;;;;;;;;;;6877:128;6814:191;:::o;8944:118::-;8470:8;:6;:8::i;:::-;8469:9;8461:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;9014:4:::1;9004:7;;:14;;;;;;;;;;;;;;;;;;9034:20;9041:12;:10;:12::i;:::-;9034:20;;;;;;:::i;:::-;;;;;;;;8944:118::o:0;43246:315::-;43401:8;43392:17;;:5;:17;;;;43384:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;43488:8;43450:18;:25;43469:5;43450:25;;;;;;;;;;;;;;;:35;43476:8;43450:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;43534:8;43512:41;;43527:5;43512:41;;;43544:8;43512:41;;;;;;:::i;:::-;;;;;;;;43246:315;;;:::o;38156:::-;38313:28;38323:4;38329:2;38333:7;38313:9;:28::i;:::-;38360:48;38383:4;38389:2;38393:7;38402:5;38360:22;:48::i;:::-;38352:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;38156:315;;;;:::o;48947:679::-;49020:13;49054:16;49062:7;49054;:16::i;:::-;49046:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;49137:23;49163:10;:19;49174:7;49163:19;;;;;;;;;;;49137:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49193:18;49214:10;:8;:10::i;:::-;49193:31;;49322:1;49306:4;49300:18;:23;49296:72;;;49347:9;49340:16;;;;;;49296:72;49498:1;49478:9;49472:23;:27;49468:108;;;49547:4;49553:9;49530:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49516:48;;;;;;49468:108;49595:23;49610:7;49595:14;:23::i;:::-;49588:30;;;;48947:679;;;;:::o;24479:332::-;24598:17;:15;:17::i;:::-;24582:33;;:12;:33;;;;24574:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;24701:1;24681:22;;:8;:22;;;;24673:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;24768:35;;;;;;;;24780:8;24768:35;;;;;;24790:12;24768:35;;;;;24746:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24479:332;;:::o;33025:305::-;33127:4;33179:25;33164:40;;;:11;:40;;;;:105;;;;33236:33;33221:48;;;:11;:48;;;;33164:105;:158;;;;33286:36;33310:11;33286:23;:36::i;:::-;33164:158;33144:178;;33025:305;;;:::o;58709:201::-;8470:8;:6;:8::i;:::-;8469:9;8461:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;58857:45:::1;58884:4;58890:2;58894:7;58857:26;:45::i;:::-;58709:201:::0;;;:::o;46008:125::-;;;;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;39768:110::-;39844:26;39854:2;39858:7;39844:26;;;;;;;;;;;;:9;:26::i;:::-;39768:110;;:::o;49782:217::-;49882:16;49890:7;49882;:16::i;:::-;49874:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;49982:9;49960:10;:19;49971:7;49960:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;49782:217;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;48294:135::-;48363:20;48375:7;48363:11;:20::i;:::-;48394:27;48413:7;48394:18;:27::i;:::-;48294:135;:::o;44126:799::-;44281:4;44302:15;:2;:13;;;:15::i;:::-;44298:620;;;44354:2;44338:36;;;44375:12;:10;:12::i;:::-;44389:4;44395:7;44404:5;44338:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44334:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44597:1;44580:6;:13;:18;44576:272;;;44623:60;;;;;;;;;;:::i;:::-;;;;;;;;44576:272;44798:6;44792:13;44783:6;44779:2;44775:15;44768:38;44334:529;44471:41;;;44461:51;;;:6;:51;;;;44454:58;;;;;44298:620;44902:4;44895:11;;44126:799;;;;;;;:::o;34897:94::-;34948:13;34974:9;;;;;;;;;;;;;;34897:94;:::o;34314:334::-;34387:13;34421:16;34429:7;34421;:16::i;:::-;34413:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;34502:21;34526:10;:8;:10::i;:::-;34502:34;;34578:1;34560:7;34554:21;:25;:86;;;;;;;;;;;;;;;;;34606:7;34615:18;:7;:16;:18::i;:::-;34589:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34554:86;34547:93;;;34314:334;;;:::o;23117:215::-;23219:4;23258:26;23243:41;;;:11;:41;;;;:81;;;;23288:36;23312:11;23288:23;:36::i;:::-;23243:81;23236:88;;23117:215;;;:::o;45497:126::-;;;;:::o;40105:321::-;40235:18;40241:2;40245:7;40235:5;:18::i;:::-;40286:54;40317:1;40321:2;40325:7;40334:5;40286:22;:54::i;:::-;40264:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;40105:321;;;:::o;50228:206::-;50297:20;50309:7;50297:11;:20::i;:::-;50371:1;50340:10;:19;50351:7;50340:19;;;;;;;;;;;50334:33;;;;;:::i;:::-;;;:38;50330:97;;50396:10;:19;50407:7;50396:19;;;;;;;;;;;;50389:26;;;;:::i;:::-;50330:97;50228:206;:::o;25807:114::-;25887:17;:26;25905:7;25887:26;;;;;;;;;;;;25880:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25807:114;:::o;10563:326::-;10623:4;10880:1;10858:7;:19;;;:23;10851:30;;10563:326;;;:::o;1830:723::-;1886:13;2116:1;2107:5;:10;2103:53;;;2134:10;;;;;;;;;;;;;;;;;;;;;2103:53;2166:12;2181:5;2166:20;;2197:14;2222:78;2237:1;2229:4;:9;2222:78;;2255:8;;;;;:::i;:::-;;;;2286:2;2278:10;;;;;:::i;:::-;;;2222:78;;;2310:19;2342:6;2332:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2310:39;;2360:154;2376:1;2367:5;:10;2360:154;;2404:1;2394:11;;;;;:::i;:::-;;;2471:2;2463:5;:10;;;;:::i;:::-;2450:2;:24;;;;:::i;:::-;2437:39;;2420:6;2427;2420:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2500:2;2491:11;;;;;:::i;:::-;;;2360:154;;;2538:6;2524:21;;;;;1830:723;;;;:::o;21567:157::-;21652:4;21691:25;21676:40;;;:11;:40;;;;21669:47;;21567:157;;;:::o;40762:439::-;40856:1;40842:16;;:2;:16;;;;40834:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;40915:16;40923:7;40915;:16::i;:::-;40914:17;40906:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40977:45;41006:1;41010:2;41014:7;40977:20;:45::i;:::-;41052:1;41035:9;:13;41045:2;41035:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41083:2;41064:7;:16;41072:7;41064:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41128:7;41124:2;41103:33;;41120:1;41103:33;;;;;;;;;;;;41149:44;41177:1;41181:2;41185:7;41149:19;:44::i;:::-;40762:439;;:::o;41430:420::-;41490:13;41506:23;41521:7;41506:14;:23::i;:::-;41490:39;;41542:48;41563:5;41578:1;41582:7;41542:20;:48::i;:::-;41631:29;41648:1;41652:7;41631:8;:29::i;:::-;41693:1;41673:9;:16;41683:5;41673:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;41712:7;:16;41720:7;41712:16;;;;;;;;;;;;41705:23;;;;;;;;;;;41774:7;41770:1;41746:36;;41755:5;41746:36;;;;;;;;;;;;41795:47;41815:5;41830:1;41834:7;41795:19;:47::i;:::-;41479:371;41430:420;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;768:957::-;874:5;899:91;915:74;982:6;915:74;:::i;:::-;899:91;:::i;:::-;890:100;;1010:5;1039:6;1032:5;1025:21;1073:4;1066:5;1062:16;1055:23;;1099:6;1149:3;1141:4;1133:6;1129:17;1124:3;1120:27;1117:36;1114:143;;;1168:79;;:::i;:::-;1114:143;1281:1;1266:453;1291:6;1288:1;1285:13;1266:453;;;1373:3;1360:17;1409:18;1396:11;1393:35;1390:122;;;1431:79;;:::i;:::-;1390:122;1555:11;1547:6;1543:24;1593:47;1636:3;1624:10;1593:47;:::i;:::-;1588:3;1581:60;1670:4;1665:3;1661:14;1654:21;;1704:4;1699:3;1695:14;1688:21;;1326:393;;1313:1;1310;1306:9;1301:14;;1266:453;;;1270:14;880:845;;768:957;;;;;:::o;1731:410::-;1808:5;1833:65;1849:48;1890:6;1849:48;:::i;:::-;1833:65;:::i;:::-;1824:74;;1921:6;1914:5;1907:21;1959:4;1952:5;1948:16;1997:3;1988:6;1983:3;1979:16;1976:25;1973:112;;;2004:79;;:::i;:::-;1973:112;2094:41;2128:6;2123:3;2118;2094:41;:::i;:::-;1814:327;1731:410;;;;;:::o;2147:412::-;2225:5;2250:66;2266:49;2308:6;2266:49;:::i;:::-;2250:66;:::i;:::-;2241:75;;2339:6;2332:5;2325:21;2377:4;2370:5;2366:16;2415:3;2406:6;2401:3;2397:16;2394:25;2391:112;;;2422:79;;:::i;:::-;2391:112;2512:41;2546:6;2541:3;2536;2512:41;:::i;:::-;2231:328;2147:412;;;;;:::o;2565:139::-;2611:5;2649:6;2636:20;2627:29;;2665:33;2692:5;2665:33;:::i;:::-;2565:139;;;;:::o;2727:370::-;2798:5;2847:3;2840:4;2832:6;2828:17;2824:27;2814:122;;2855:79;;:::i;:::-;2814:122;2972:6;2959:20;2997:94;3087:3;3079:6;3072:4;3064:6;3060:17;2997:94;:::i;:::-;2988:103;;2804:293;2727:370;;;;:::o;3119:390::-;3200:5;3249:3;3242:4;3234:6;3230:17;3226:27;3216:122;;3257:79;;:::i;:::-;3216:122;3374:6;3361:20;3399:104;3499:3;3491:6;3484:4;3476:6;3472:17;3399:104;:::i;:::-;3390:113;;3206:303;3119:390;;;;:::o;3515:133::-;3558:5;3596:6;3583:20;3574:29;;3612:30;3636:5;3612:30;:::i;:::-;3515:133;;;;:::o;3654:139::-;3700:5;3738:6;3725:20;3716:29;;3754:33;3781:5;3754:33;:::i;:::-;3654:139;;;;:::o;3799:137::-;3844:5;3882:6;3869:20;3860:29;;3898:32;3924:5;3898:32;:::i;:::-;3799:137;;;;:::o;3942:141::-;3998:5;4029:6;4023:13;4014:22;;4045:32;4071:5;4045:32;:::i;:::-;3942:141;;;;:::o;4102:338::-;4157:5;4206:3;4199:4;4191:6;4187:17;4183:27;4173:122;;4214:79;;:::i;:::-;4173:122;4331:6;4318:20;4356:78;4430:3;4422:6;4415:4;4407:6;4403:17;4356:78;:::i;:::-;4347:87;;4163:277;4102:338;;;;:::o;4460:340::-;4516:5;4565:3;4558:4;4550:6;4546:17;4542:27;4532:122;;4573:79;;:::i;:::-;4532:122;4690:6;4677:20;4715:79;4790:3;4782:6;4775:4;4767:6;4763:17;4715:79;:::i;:::-;4706:88;;4522:278;4460:340;;;;:::o;4806:139::-;4852:5;4890:6;4877:20;4868:29;;4906:33;4933:5;4906:33;:::i;:::-;4806:139;;;;:::o;4951:137::-;4996:5;5034:6;5021:20;5012:29;;5050:32;5076:5;5050:32;:::i;:::-;4951:137;;;;:::o;5094:329::-;5153:6;5202:2;5190:9;5181:7;5177:23;5173:32;5170:119;;;5208:79;;:::i;:::-;5170:119;5328:1;5353:53;5398:7;5389:6;5378:9;5374:22;5353:53;:::i;:::-;5343:63;;5299:117;5094:329;;;;:::o;5429:474::-;5497:6;5505;5554:2;5542:9;5533:7;5529:23;5525:32;5522:119;;;5560:79;;:::i;:::-;5522:119;5680:1;5705:53;5750:7;5741:6;5730:9;5726:22;5705:53;:::i;:::-;5695:63;;5651:117;5807:2;5833:53;5878:7;5869:6;5858:9;5854:22;5833:53;:::i;:::-;5823:63;;5778:118;5429:474;;;;;:::o;5909:619::-;5986:6;5994;6002;6051:2;6039:9;6030:7;6026:23;6022:32;6019:119;;;6057:79;;:::i;:::-;6019:119;6177:1;6202:53;6247:7;6238:6;6227:9;6223:22;6202:53;:::i;:::-;6192:63;;6148:117;6304:2;6330:53;6375:7;6366:6;6355:9;6351:22;6330:53;:::i;:::-;6320:63;;6275:118;6432:2;6458:53;6503:7;6494:6;6483:9;6479:22;6458:53;:::i;:::-;6448:63;;6403:118;5909:619;;;;;:::o;6534:943::-;6629:6;6637;6645;6653;6702:3;6690:9;6681:7;6677:23;6673:33;6670:120;;;6709:79;;:::i;:::-;6670:120;6829:1;6854:53;6899:7;6890:6;6879:9;6875:22;6854:53;:::i;:::-;6844:63;;6800:117;6956:2;6982:53;7027:7;7018:6;7007:9;7003:22;6982:53;:::i;:::-;6972:63;;6927:118;7084:2;7110:53;7155:7;7146:6;7135:9;7131:22;7110:53;:::i;:::-;7100:63;;7055:118;7240:2;7229:9;7225:18;7212:32;7271:18;7263:6;7260:30;7257:117;;;7293:79;;:::i;:::-;7257:117;7398:62;7452:7;7443:6;7432:9;7428:22;7398:62;:::i;:::-;7388:72;;7183:287;6534:943;;;;;;;:::o;7483:468::-;7548:6;7556;7605:2;7593:9;7584:7;7580:23;7576:32;7573:119;;;7611:79;;:::i;:::-;7573:119;7731:1;7756:53;7801:7;7792:6;7781:9;7777:22;7756:53;:::i;:::-;7746:63;;7702:117;7858:2;7884:50;7926:7;7917:6;7906:9;7902:22;7884:50;:::i;:::-;7874:60;;7829:115;7483:468;;;;;:::o;7957:474::-;8025:6;8033;8082:2;8070:9;8061:7;8057:23;8053:32;8050:119;;;8088:79;;:::i;:::-;8050:119;8208:1;8233:53;8278:7;8269:6;8258:9;8254:22;8233:53;:::i;:::-;8223:63;;8179:117;8335:2;8361:53;8406:7;8397:6;8386:9;8382:22;8361:53;:::i;:::-;8351:63;;8306:118;7957:474;;;;;:::o;8437:472::-;8504:6;8512;8561:2;8549:9;8540:7;8536:23;8532:32;8529:119;;;8567:79;;:::i;:::-;8529:119;8687:1;8712:53;8757:7;8748:6;8737:9;8733:22;8712:53;:::i;:::-;8702:63;;8658:117;8814:2;8840:52;8884:7;8875:6;8864:9;8860:22;8840:52;:::i;:::-;8830:62;;8785:117;8437:472;;;;;:::o;8915:1435::-;9096:6;9104;9112;9120;9169:3;9157:9;9148:7;9144:23;9140:33;9137:120;;;9176:79;;:::i;:::-;9137:120;9324:1;9313:9;9309:17;9296:31;9354:18;9346:6;9343:30;9340:117;;;9376:79;;:::i;:::-;9340:117;9481:88;9561:7;9552:6;9541:9;9537:22;9481:88;:::i;:::-;9471:98;;9267:312;9646:2;9635:9;9631:18;9618:32;9677:18;9669:6;9666:30;9663:117;;;9699:79;;:::i;:::-;9663:117;9804:78;9874:7;9865:6;9854:9;9850:22;9804:78;:::i;:::-;9794:88;;9589:303;9959:2;9948:9;9944:18;9931:32;9990:18;9982:6;9979:30;9976:117;;;10012:79;;:::i;:::-;9976:117;10117:88;10197:7;10188:6;10177:9;10173:22;10117:88;:::i;:::-;10107:98;;9902:313;10254:2;10280:53;10325:7;10316:6;10305:9;10301:22;10280:53;:::i;:::-;10270:63;;10225:118;8915:1435;;;;;;;:::o;10356:652::-;10433:6;10441;10490:2;10478:9;10469:7;10465:23;10461:32;10458:119;;;10496:79;;:::i;:::-;10458:119;10616:1;10641:53;10686:7;10677:6;10666:9;10662:22;10641:53;:::i;:::-;10631:63;;10587:117;10771:2;10760:9;10756:18;10743:32;10802:18;10794:6;10791:30;10788:117;;;10824:79;;:::i;:::-;10788:117;10929:62;10983:7;10974:6;10963:9;10959:22;10929:62;:::i;:::-;10919:72;;10714:287;10356:652;;;;;:::o;11014:327::-;11072:6;11121:2;11109:9;11100:7;11096:23;11092:32;11089:119;;;11127:79;;:::i;:::-;11089:119;11247:1;11272:52;11316:7;11307:6;11296:9;11292:22;11272:52;:::i;:::-;11262:62;;11218:116;11014:327;;;;:::o;11347:349::-;11416:6;11465:2;11453:9;11444:7;11440:23;11436:32;11433:119;;;11471:79;;:::i;:::-;11433:119;11591:1;11616:63;11671:7;11662:6;11651:9;11647:22;11616:63;:::i;:::-;11606:73;;11562:127;11347:349;;;;:::o;11702:979::-;11799:6;11807;11815;11864:2;11852:9;11843:7;11839:23;11835:32;11832:119;;;11870:79;;:::i;:::-;11832:119;12018:1;12007:9;12003:17;11990:31;12048:18;12040:6;12037:30;12034:117;;;12070:79;;:::i;:::-;12034:117;12175:63;12230:7;12221:6;12210:9;12206:22;12175:63;:::i;:::-;12165:73;;11961:287;12287:2;12313:53;12358:7;12349:6;12338:9;12334:22;12313:53;:::i;:::-;12303:63;;12258:118;12443:2;12432:9;12428:18;12415:32;12474:18;12466:6;12463:30;12460:117;;;12496:79;;:::i;:::-;12460:117;12601:63;12656:7;12647:6;12636:9;12632:22;12601:63;:::i;:::-;12591:73;;12386:288;11702:979;;;;;:::o;12687:1157::-;12793:6;12801;12809;12858:2;12846:9;12837:7;12833:23;12829:32;12826:119;;;12864:79;;:::i;:::-;12826:119;13012:1;13001:9;12997:17;12984:31;13042:18;13034:6;13031:30;13028:117;;;13064:79;;:::i;:::-;13028:117;13169:63;13224:7;13215:6;13204:9;13200:22;13169:63;:::i;:::-;13159:73;;12955:287;13309:2;13298:9;13294:18;13281:32;13340:18;13332:6;13329:30;13326:117;;;13362:79;;:::i;:::-;13326:117;13467:62;13521:7;13512:6;13501:9;13497:22;13467:62;:::i;:::-;13457:72;;13252:287;13606:2;13595:9;13591:18;13578:32;13637:18;13629:6;13626:30;13623:117;;;13659:79;;:::i;:::-;13623:117;13764:63;13819:7;13810:6;13799:9;13795:22;13764:63;:::i;:::-;13754:73;;13549:288;12687:1157;;;;;:::o;13850:329::-;13909:6;13958:2;13946:9;13937:7;13933:23;13929:32;13926:119;;;13964:79;;:::i;:::-;13926:119;14084:1;14109:53;14154:7;14145:6;14134:9;14130:22;14109:53;:::i;:::-;14099:63;;14055:117;13850:329;;;;:::o;14185:474::-;14253:6;14261;14310:2;14298:9;14289:7;14285:23;14281:32;14278:119;;;14316:79;;:::i;:::-;14278:119;14436:1;14461:53;14506:7;14497:6;14486:9;14482:22;14461:53;:::i;:::-;14451:63;;14407:117;14563:2;14589:53;14634:7;14625:6;14614:9;14610:22;14589:53;:::i;:::-;14579:63;;14534:118;14185:474;;;;;:::o;14665:118::-;14752:24;14770:5;14752:24;:::i;:::-;14747:3;14740:37;14665:118;;:::o;14789:109::-;14870:21;14885:5;14870:21;:::i;:::-;14865:3;14858:34;14789:109;;:::o;14904:118::-;14991:24;15009:5;14991:24;:::i;:::-;14986:3;14979:37;14904:118;;:::o;15028:157::-;15133:45;15153:24;15171:5;15153:24;:::i;:::-;15133:45;:::i;:::-;15128:3;15121:58;15028:157;;:::o;15191:360::-;15277:3;15305:38;15337:5;15305:38;:::i;:::-;15359:70;15422:6;15417:3;15359:70;:::i;:::-;15352:77;;15438:52;15483:6;15478:3;15471:4;15464:5;15460:16;15438:52;:::i;:::-;15515:29;15537:6;15515:29;:::i;:::-;15510:3;15506:39;15499:46;;15281:270;15191:360;;;;:::o;15557:364::-;15645:3;15673:39;15706:5;15673:39;:::i;:::-;15728:71;15792:6;15787:3;15728:71;:::i;:::-;15721:78;;15808:52;15853:6;15848:3;15841:4;15834:5;15830:16;15808:52;:::i;:::-;15885:29;15907:6;15885:29;:::i;:::-;15880:3;15876:39;15869:46;;15649:272;15557:364;;;;:::o;15927:377::-;16033:3;16061:39;16094:5;16061:39;:::i;:::-;16116:89;16198:6;16193:3;16116:89;:::i;:::-;16109:96;;16214:52;16259:6;16254:3;16247:4;16240:5;16236:16;16214:52;:::i;:::-;16291:6;16286:3;16282:16;16275:23;;16037:267;15927:377;;;;:::o;16310:366::-;16452:3;16473:67;16537:2;16532:3;16473:67;:::i;:::-;16466:74;;16549:93;16638:3;16549:93;:::i;:::-;16667:2;16662:3;16658:12;16651:19;;16310:366;;;:::o;16682:::-;16824:3;16845:67;16909:2;16904:3;16845:67;:::i;:::-;16838:74;;16921:93;17010:3;16921:93;:::i;:::-;17039:2;17034:3;17030:12;17023:19;;16682:366;;;:::o;17054:402::-;17214:3;17235:85;17317:2;17312:3;17235:85;:::i;:::-;17228:92;;17329:93;17418:3;17329:93;:::i;:::-;17447:2;17442:3;17438:12;17431:19;;17054:402;;;:::o;17462:366::-;17604:3;17625:67;17689:2;17684:3;17625:67;:::i;:::-;17618:74;;17701:93;17790:3;17701:93;:::i;:::-;17819:2;17814:3;17810:12;17803:19;;17462:366;;;:::o;17834:::-;17976:3;17997:67;18061:2;18056:3;17997:67;:::i;:::-;17990:74;;18073:93;18162:3;18073:93;:::i;:::-;18191:2;18186:3;18182:12;18175:19;;17834:366;;;:::o;18206:::-;18348:3;18369:67;18433:2;18428:3;18369:67;:::i;:::-;18362:74;;18445:93;18534:3;18445:93;:::i;:::-;18563:2;18558:3;18554:12;18547:19;;18206:366;;;:::o;18578:::-;18720:3;18741:67;18805:2;18800:3;18741:67;:::i;:::-;18734:74;;18817:93;18906:3;18817:93;:::i;:::-;18935:2;18930:3;18926:12;18919:19;;18578:366;;;:::o;18950:::-;19092:3;19113:67;19177:2;19172:3;19113:67;:::i;:::-;19106:74;;19189:93;19278:3;19189:93;:::i;:::-;19307:2;19302:3;19298:12;19291:19;;18950:366;;;:::o;19322:::-;19464:3;19485:67;19549:2;19544:3;19485:67;:::i;:::-;19478:74;;19561:93;19650:3;19561:93;:::i;:::-;19679:2;19674:3;19670:12;19663:19;;19322:366;;;:::o;19694:::-;19836:3;19857:67;19921:2;19916:3;19857:67;:::i;:::-;19850:74;;19933:93;20022:3;19933:93;:::i;:::-;20051:2;20046:3;20042:12;20035:19;;19694:366;;;:::o;20066:::-;20208:3;20229:67;20293:2;20288:3;20229:67;:::i;:::-;20222:74;;20305:93;20394:3;20305:93;:::i;:::-;20423:2;20418:3;20414:12;20407:19;;20066:366;;;:::o;20438:::-;20580:3;20601:67;20665:2;20660:3;20601:67;:::i;:::-;20594:74;;20677:93;20766:3;20677:93;:::i;:::-;20795:2;20790:3;20786:12;20779:19;;20438:366;;;:::o;20810:::-;20952:3;20973:67;21037:2;21032:3;20973:67;:::i;:::-;20966:74;;21049:93;21138:3;21049:93;:::i;:::-;21167:2;21162:3;21158:12;21151:19;;20810:366;;;:::o;21182:::-;21324:3;21345:67;21409:2;21404:3;21345:67;:::i;:::-;21338:74;;21421:93;21510:3;21421:93;:::i;:::-;21539:2;21534:3;21530:12;21523:19;;21182:366;;;:::o;21554:::-;21696:3;21717:67;21781:2;21776:3;21717:67;:::i;:::-;21710:74;;21793:93;21882:3;21793:93;:::i;:::-;21911:2;21906:3;21902:12;21895:19;;21554:366;;;:::o;21926:::-;22068:3;22089:67;22153:2;22148:3;22089:67;:::i;:::-;22082:74;;22165:93;22254:3;22165:93;:::i;:::-;22283:2;22278:3;22274:12;22267:19;;21926:366;;;:::o;22298:::-;22440:3;22461:67;22525:2;22520:3;22461:67;:::i;:::-;22454:74;;22537:93;22626:3;22537:93;:::i;:::-;22655:2;22650:3;22646:12;22639:19;;22298:366;;;:::o;22670:::-;22812:3;22833:67;22897:2;22892:3;22833:67;:::i;:::-;22826:74;;22909:93;22998:3;22909:93;:::i;:::-;23027:2;23022:3;23018:12;23011:19;;22670:366;;;:::o;23042:::-;23184:3;23205:67;23269:2;23264:3;23205:67;:::i;:::-;23198:74;;23281:93;23370:3;23281:93;:::i;:::-;23399:2;23394:3;23390:12;23383:19;;23042:366;;;:::o;23414:::-;23556:3;23577:67;23641:2;23636:3;23577:67;:::i;:::-;23570:74;;23653:93;23742:3;23653:93;:::i;:::-;23771:2;23766:3;23762:12;23755:19;;23414:366;;;:::o;23786:::-;23928:3;23949:67;24013:2;24008:3;23949:67;:::i;:::-;23942:74;;24025:93;24114:3;24025:93;:::i;:::-;24143:2;24138:3;24134:12;24127:19;;23786:366;;;:::o;24158:::-;24300:3;24321:67;24385:2;24380:3;24321:67;:::i;:::-;24314:74;;24397:93;24486:3;24397:93;:::i;:::-;24515:2;24510:3;24506:12;24499:19;;24158:366;;;:::o;24530:::-;24672:3;24693:67;24757:2;24752:3;24693:67;:::i;:::-;24686:74;;24769:93;24858:3;24769:93;:::i;:::-;24887:2;24882:3;24878:12;24871:19;;24530:366;;;:::o;24902:::-;25044:3;25065:67;25129:2;25124:3;25065:67;:::i;:::-;25058:74;;25141:93;25230:3;25141:93;:::i;:::-;25259:2;25254:3;25250:12;25243:19;;24902:366;;;:::o;25274:398::-;25433:3;25454:83;25535:1;25530:3;25454:83;:::i;:::-;25447:90;;25546:93;25635:3;25546:93;:::i;:::-;25664:1;25659:3;25655:11;25648:18;;25274:398;;;:::o;25678:366::-;25820:3;25841:67;25905:2;25900:3;25841:67;:::i;:::-;25834:74;;25917:93;26006:3;25917:93;:::i;:::-;26035:2;26030:3;26026:12;26019:19;;25678:366;;;:::o;26050:::-;26192:3;26213:67;26277:2;26272:3;26213:67;:::i;:::-;26206:74;;26289:93;26378:3;26289:93;:::i;:::-;26407:2;26402:3;26398:12;26391:19;;26050:366;;;:::o;26422:::-;26564:3;26585:67;26649:2;26644:3;26585:67;:::i;:::-;26578:74;;26661:93;26750:3;26661:93;:::i;:::-;26779:2;26774:3;26770:12;26763:19;;26422:366;;;:::o;26794:::-;26936:3;26957:67;27021:2;27016:3;26957:67;:::i;:::-;26950:74;;27033:93;27122:3;27033:93;:::i;:::-;27151:2;27146:3;27142:12;27135:19;;26794:366;;;:::o;27166:::-;27308:3;27329:67;27393:2;27388:3;27329:67;:::i;:::-;27322:74;;27405:93;27494:3;27405:93;:::i;:::-;27523:2;27518:3;27514:12;27507:19;;27166:366;;;:::o;27538:::-;27680:3;27701:67;27765:2;27760:3;27701:67;:::i;:::-;27694:74;;27777:93;27866:3;27777:93;:::i;:::-;27895:2;27890:3;27886:12;27879:19;;27538:366;;;:::o;27910:::-;28052:3;28073:67;28137:2;28132:3;28073:67;:::i;:::-;28066:74;;28149:93;28238:3;28149:93;:::i;:::-;28267:2;28262:3;28258:12;28251:19;;27910:366;;;:::o;28282:::-;28424:3;28445:67;28509:2;28504:3;28445:67;:::i;:::-;28438:74;;28521:93;28610:3;28521:93;:::i;:::-;28639:2;28634:3;28630:12;28623:19;;28282:366;;;:::o;28654:118::-;28741:24;28759:5;28741:24;:::i;:::-;28736:3;28729:37;28654:118;;:::o;28778:112::-;28861:22;28877:5;28861:22;:::i;:::-;28856:3;28849:35;28778:112;;:::o;28896:275::-;29028:3;29050:95;29141:3;29132:6;29050:95;:::i;:::-;29043:102;;29162:3;29155:10;;28896:275;;;;:::o;29177:435::-;29357:3;29379:95;29470:3;29461:6;29379:95;:::i;:::-;29372:102;;29491:95;29582:3;29573:6;29491:95;:::i;:::-;29484:102;;29603:3;29596:10;;29177:435;;;;;:::o;29618:522::-;29831:3;29853:148;29997:3;29853:148;:::i;:::-;29846:155;;30011:75;30082:3;30073:6;30011:75;:::i;:::-;30111:2;30106:3;30102:12;30095:19;;30131:3;30124:10;;29618:522;;;;:::o;30146:379::-;30330:3;30352:147;30495:3;30352:147;:::i;:::-;30345:154;;30516:3;30509:10;;30146:379;;;:::o;30531:222::-;30624:4;30662:2;30651:9;30647:18;30639:26;;30675:71;30743:1;30732:9;30728:17;30719:6;30675:71;:::i;:::-;30531:222;;;;:::o;30759:640::-;30954:4;30992:3;30981:9;30977:19;30969:27;;31006:71;31074:1;31063:9;31059:17;31050:6;31006:71;:::i;:::-;31087:72;31155:2;31144:9;31140:18;31131:6;31087:72;:::i;:::-;31169;31237:2;31226:9;31222:18;31213:6;31169:72;:::i;:::-;31288:9;31282:4;31278:20;31273:2;31262:9;31258:18;31251:48;31316:76;31387:4;31378:6;31316:76;:::i;:::-;31308:84;;30759:640;;;;;;;:::o;31405:332::-;31526:4;31564:2;31553:9;31549:18;31541:26;;31577:71;31645:1;31634:9;31630:17;31621:6;31577:71;:::i;:::-;31658:72;31726:2;31715:9;31711:18;31702:6;31658:72;:::i;:::-;31405:332;;;;;:::o;31743:210::-;31830:4;31868:2;31857:9;31853:18;31845:26;;31881:65;31943:1;31932:9;31928:17;31919:6;31881:65;:::i;:::-;31743:210;;;;:::o;31959:545::-;32132:4;32170:3;32159:9;32155:19;32147:27;;32184:71;32252:1;32241:9;32237:17;32228:6;32184:71;:::i;:::-;32265:68;32329:2;32318:9;32314:18;32305:6;32265:68;:::i;:::-;32343:72;32411:2;32400:9;32396:18;32387:6;32343:72;:::i;:::-;32425;32493:2;32482:9;32478:18;32469:6;32425:72;:::i;:::-;31959:545;;;;;;;:::o;32510:313::-;32623:4;32661:2;32650:9;32646:18;32638:26;;32710:9;32704:4;32700:20;32696:1;32685:9;32681:17;32674:47;32738:78;32811:4;32802:6;32738:78;:::i;:::-;32730:86;;32510:313;;;;:::o;32829:624::-;33018:4;33056:2;33045:9;33041:18;33033:26;;33105:9;33099:4;33095:20;33091:1;33080:9;33076:17;33069:47;33133:78;33206:4;33197:6;33133:78;:::i;:::-;33125:86;;33221:72;33289:2;33278:9;33274:18;33265:6;33221:72;:::i;:::-;33340:9;33334:4;33330:20;33325:2;33314:9;33310:18;33303:48;33368:78;33441:4;33432:6;33368:78;:::i;:::-;33360:86;;32829:624;;;;;;:::o;33459:419::-;33625:4;33663:2;33652:9;33648:18;33640:26;;33712:9;33706:4;33702:20;33698:1;33687:9;33683:17;33676:47;33740:131;33866:4;33740:131;:::i;:::-;33732:139;;33459:419;;;:::o;33884:::-;34050:4;34088:2;34077:9;34073:18;34065:26;;34137:9;34131:4;34127:20;34123:1;34112:9;34108:17;34101:47;34165:131;34291:4;34165:131;:::i;:::-;34157:139;;33884:419;;;:::o;34309:::-;34475:4;34513:2;34502:9;34498:18;34490:26;;34562:9;34556:4;34552:20;34548:1;34537:9;34533:17;34526:47;34590:131;34716:4;34590:131;:::i;:::-;34582:139;;34309:419;;;:::o;34734:::-;34900:4;34938:2;34927:9;34923:18;34915:26;;34987:9;34981:4;34977:20;34973:1;34962:9;34958:17;34951:47;35015:131;35141:4;35015:131;:::i;:::-;35007:139;;34734:419;;;:::o;35159:::-;35325:4;35363:2;35352:9;35348:18;35340:26;;35412:9;35406:4;35402:20;35398:1;35387:9;35383:17;35376:47;35440:131;35566:4;35440:131;:::i;:::-;35432:139;;35159:419;;;:::o;35584:::-;35750:4;35788:2;35777:9;35773:18;35765:26;;35837:9;35831:4;35827:20;35823:1;35812:9;35808:17;35801:47;35865:131;35991:4;35865:131;:::i;:::-;35857:139;;35584:419;;;:::o;36009:::-;36175:4;36213:2;36202:9;36198:18;36190:26;;36262:9;36256:4;36252:20;36248:1;36237:9;36233:17;36226:47;36290:131;36416:4;36290:131;:::i;:::-;36282:139;;36009:419;;;:::o;36434:::-;36600:4;36638:2;36627:9;36623:18;36615:26;;36687:9;36681:4;36677:20;36673:1;36662:9;36658:17;36651:47;36715:131;36841:4;36715:131;:::i;:::-;36707:139;;36434:419;;;:::o;36859:::-;37025:4;37063:2;37052:9;37048:18;37040:26;;37112:9;37106:4;37102:20;37098:1;37087:9;37083:17;37076:47;37140:131;37266:4;37140:131;:::i;:::-;37132:139;;36859:419;;;:::o;37284:::-;37450:4;37488:2;37477:9;37473:18;37465:26;;37537:9;37531:4;37527:20;37523:1;37512:9;37508:17;37501:47;37565:131;37691:4;37565:131;:::i;:::-;37557:139;;37284:419;;;:::o;37709:::-;37875:4;37913:2;37902:9;37898:18;37890:26;;37962:9;37956:4;37952:20;37948:1;37937:9;37933:17;37926:47;37990:131;38116:4;37990:131;:::i;:::-;37982:139;;37709:419;;;:::o;38134:::-;38300:4;38338:2;38327:9;38323:18;38315:26;;38387:9;38381:4;38377:20;38373:1;38362:9;38358:17;38351:47;38415:131;38541:4;38415:131;:::i;:::-;38407:139;;38134:419;;;:::o;38559:::-;38725:4;38763:2;38752:9;38748:18;38740:26;;38812:9;38806:4;38802:20;38798:1;38787:9;38783:17;38776:47;38840:131;38966:4;38840:131;:::i;:::-;38832:139;;38559:419;;;:::o;38984:::-;39150:4;39188:2;39177:9;39173:18;39165:26;;39237:9;39231:4;39227:20;39223:1;39212:9;39208:17;39201:47;39265:131;39391:4;39265:131;:::i;:::-;39257:139;;38984:419;;;:::o;39409:::-;39575:4;39613:2;39602:9;39598:18;39590:26;;39662:9;39656:4;39652:20;39648:1;39637:9;39633:17;39626:47;39690:131;39816:4;39690:131;:::i;:::-;39682:139;;39409:419;;;:::o;39834:::-;40000:4;40038:2;40027:9;40023:18;40015:26;;40087:9;40081:4;40077:20;40073:1;40062:9;40058:17;40051:47;40115:131;40241:4;40115:131;:::i;:::-;40107:139;;39834:419;;;:::o;40259:::-;40425:4;40463:2;40452:9;40448:18;40440:26;;40512:9;40506:4;40502:20;40498:1;40487:9;40483:17;40476:47;40540:131;40666:4;40540:131;:::i;:::-;40532:139;;40259:419;;;:::o;40684:::-;40850:4;40888:2;40877:9;40873:18;40865:26;;40937:9;40931:4;40927:20;40923:1;40912:9;40908:17;40901:47;40965:131;41091:4;40965:131;:::i;:::-;40957:139;;40684:419;;;:::o;41109:::-;41275:4;41313:2;41302:9;41298:18;41290:26;;41362:9;41356:4;41352:20;41348:1;41337:9;41333:17;41326:47;41390:131;41516:4;41390:131;:::i;:::-;41382:139;;41109:419;;;:::o;41534:::-;41700:4;41738:2;41727:9;41723:18;41715:26;;41787:9;41781:4;41777:20;41773:1;41762:9;41758:17;41751:47;41815:131;41941:4;41815:131;:::i;:::-;41807:139;;41534:419;;;:::o;41959:::-;42125:4;42163:2;42152:9;42148:18;42140:26;;42212:9;42206:4;42202:20;42198:1;42187:9;42183:17;42176:47;42240:131;42366:4;42240:131;:::i;:::-;42232:139;;41959:419;;;:::o;42384:::-;42550:4;42588:2;42577:9;42573:18;42565:26;;42637:9;42631:4;42627:20;42623:1;42612:9;42608:17;42601:47;42665:131;42791:4;42665:131;:::i;:::-;42657:139;;42384:419;;;:::o;42809:::-;42975:4;43013:2;43002:9;42998:18;42990:26;;43062:9;43056:4;43052:20;43048:1;43037:9;43033:17;43026:47;43090:131;43216:4;43090:131;:::i;:::-;43082:139;;42809:419;;;:::o;43234:::-;43400:4;43438:2;43427:9;43423:18;43415:26;;43487:9;43481:4;43477:20;43473:1;43462:9;43458:17;43451:47;43515:131;43641:4;43515:131;:::i;:::-;43507:139;;43234:419;;;:::o;43659:::-;43825:4;43863:2;43852:9;43848:18;43840:26;;43912:9;43906:4;43902:20;43898:1;43887:9;43883:17;43876:47;43940:131;44066:4;43940:131;:::i;:::-;43932:139;;43659:419;;;:::o;44084:::-;44250:4;44288:2;44277:9;44273:18;44265:26;;44337:9;44331:4;44327:20;44323:1;44312:9;44308:17;44301:47;44365:131;44491:4;44365:131;:::i;:::-;44357:139;;44084:419;;;:::o;44509:::-;44675:4;44713:2;44702:9;44698:18;44690:26;;44762:9;44756:4;44752:20;44748:1;44737:9;44733:17;44726:47;44790:131;44916:4;44790:131;:::i;:::-;44782:139;;44509:419;;;:::o;44934:::-;45100:4;45138:2;45127:9;45123:18;45115:26;;45187:9;45181:4;45177:20;45173:1;45162:9;45158:17;45151:47;45215:131;45341:4;45215:131;:::i;:::-;45207:139;;44934:419;;;:::o;45359:::-;45525:4;45563:2;45552:9;45548:18;45540:26;;45612:9;45606:4;45602:20;45598:1;45587:9;45583:17;45576:47;45640:131;45766:4;45640:131;:::i;:::-;45632:139;;45359:419;;;:::o;45784:::-;45950:4;45988:2;45977:9;45973:18;45965:26;;46037:9;46031:4;46027:20;46023:1;46012:9;46008:17;46001:47;46065:131;46191:4;46065:131;:::i;:::-;46057:139;;45784:419;;;:::o;46209:::-;46375:4;46413:2;46402:9;46398:18;46390:26;;46462:9;46456:4;46452:20;46448:1;46437:9;46433:17;46426:47;46490:131;46616:4;46490:131;:::i;:::-;46482:139;;46209:419;;;:::o;46634:222::-;46727:4;46765:2;46754:9;46750:18;46742:26;;46778:71;46846:1;46835:9;46831:17;46822:6;46778:71;:::i;:::-;46634:222;;;;:::o;46862:129::-;46896:6;46923:20;;:::i;:::-;46913:30;;46952:33;46980:4;46972:6;46952:33;:::i;:::-;46862:129;;;:::o;46997:75::-;47030:6;47063:2;47057:9;47047:19;;46997:75;:::o;47078:311::-;47155:4;47245:18;47237:6;47234:30;47231:56;;;47267:18;;:::i;:::-;47231:56;47317:4;47309:6;47305:17;47297:25;;47377:4;47371;47367:15;47359:23;;47078:311;;;:::o;47395:321::-;47482:4;47572:18;47564:6;47561:30;47558:56;;;47594:18;;:::i;:::-;47558:56;47644:4;47636:6;47632:17;47624:25;;47704:4;47698;47694:15;47686:23;;47395:321;;;:::o;47722:307::-;47783:4;47873:18;47865:6;47862:30;47859:56;;;47895:18;;:::i;:::-;47859:56;47933:29;47955:6;47933:29;:::i;:::-;47925:37;;48017:4;48011;48007:15;47999:23;;47722:307;;;:::o;48035:308::-;48097:4;48187:18;48179:6;48176:30;48173:56;;;48209:18;;:::i;:::-;48173:56;48247:29;48269:6;48247:29;:::i;:::-;48239:37;;48331:4;48325;48321:15;48313:23;;48035:308;;;:::o;48349:98::-;48400:6;48434:5;48428:12;48418:22;;48349:98;;;:::o;48453:99::-;48505:6;48539:5;48533:12;48523:22;;48453:99;;;:::o;48558:168::-;48641:11;48675:6;48670:3;48663:19;48715:4;48710:3;48706:14;48691:29;;48558:168;;;;:::o;48732:147::-;48833:11;48870:3;48855:18;;48732:147;;;;:::o;48885:169::-;48969:11;49003:6;48998:3;48991:19;49043:4;49038:3;49034:14;49019:29;;48885:169;;;;:::o;49060:148::-;49162:11;49199:3;49184:18;;49060:148;;;;:::o;49214:305::-;49254:3;49273:20;49291:1;49273:20;:::i;:::-;49268:25;;49307:20;49325:1;49307:20;:::i;:::-;49302:25;;49461:1;49393:66;49389:74;49386:1;49383:81;49380:107;;;49467:18;;:::i;:::-;49380:107;49511:1;49508;49504:9;49497:16;;49214:305;;;;:::o;49525:185::-;49565:1;49582:20;49600:1;49582:20;:::i;:::-;49577:25;;49616:20;49634:1;49616:20;:::i;:::-;49611:25;;49655:1;49645:35;;49660:18;;:::i;:::-;49645:35;49702:1;49699;49695:9;49690:14;;49525:185;;;;:::o;49716:348::-;49756:7;49779:20;49797:1;49779:20;:::i;:::-;49774:25;;49813:20;49831:1;49813:20;:::i;:::-;49808:25;;50001:1;49933:66;49929:74;49926:1;49923:81;49918:1;49911:9;49904:17;49900:105;49897:131;;;50008:18;;:::i;:::-;49897:131;50056:1;50053;50049:9;50038:20;;49716:348;;;;:::o;50070:191::-;50110:4;50130:20;50148:1;50130:20;:::i;:::-;50125:25;;50164:20;50182:1;50164:20;:::i;:::-;50159:25;;50203:1;50200;50197:8;50194:34;;;50208:18;;:::i;:::-;50194:34;50253:1;50250;50246:9;50238:17;;50070:191;;;;:::o;50267:96::-;50304:7;50333:24;50351:5;50333:24;:::i;:::-;50322:35;;50267:96;;;:::o;50369:90::-;50403:7;50446:5;50439:13;50432:21;50421:32;;50369:90;;;:::o;50465:77::-;50502:7;50531:5;50520:16;;50465:77;;;:::o;50548:149::-;50584:7;50624:66;50617:5;50613:78;50602:89;;50548:149;;;:::o;50703:126::-;50740:7;50780:42;50773:5;50769:54;50758:65;;50703:126;;;:::o;50835:77::-;50872:7;50901:5;50890:16;;50835:77;;;:::o;50918:86::-;50953:7;50993:4;50986:5;50982:16;50971:27;;50918:86;;;:::o;51010:109::-;51046:7;51086:26;51079:5;51075:38;51064:49;;51010:109;;;:::o;51125:154::-;51209:6;51204:3;51199;51186:30;51271:1;51262:6;51257:3;51253:16;51246:27;51125:154;;;:::o;51285:307::-;51353:1;51363:113;51377:6;51374:1;51371:13;51363:113;;;51462:1;51457:3;51453:11;51447:18;51443:1;51438:3;51434:11;51427:39;51399:2;51396:1;51392:10;51387:15;;51363:113;;;51494:6;51491:1;51488:13;51485:101;;;51574:1;51565:6;51560:3;51556:16;51549:27;51485:101;51334:258;51285:307;;;:::o;51598:320::-;51642:6;51679:1;51673:4;51669:12;51659:22;;51726:1;51720:4;51716:12;51747:18;51737:81;;51803:4;51795:6;51791:17;51781:27;;51737:81;51865:2;51857:6;51854:14;51834:18;51831:38;51828:84;;;51884:18;;:::i;:::-;51828:84;51649:269;51598:320;;;:::o;51924:281::-;52007:27;52029:4;52007:27;:::i;:::-;51999:6;51995:40;52137:6;52125:10;52122:22;52101:18;52089:10;52086:34;52083:62;52080:88;;;52148:18;;:::i;:::-;52080:88;52188:10;52184:2;52177:22;51967:238;51924:281;;:::o;52211:233::-;52250:3;52273:24;52291:5;52273:24;:::i;:::-;52264:33;;52319:66;52312:5;52309:77;52306:103;;;52389:18;;:::i;:::-;52306:103;52436:1;52429:5;52425:13;52418:20;;52211:233;;;:::o;52450:79::-;52489:7;52518:5;52507:16;;52450:79;;;:::o;52535:176::-;52567:1;52584:20;52602:1;52584:20;:::i;:::-;52579:25;;52618:20;52636:1;52618:20;:::i;:::-;52613:25;;52657:1;52647:35;;52662:18;;:::i;:::-;52647:35;52703:1;52700;52696:9;52691:14;;52535:176;;;;:::o;52717:180::-;52765:77;52762:1;52755:88;52862:4;52859:1;52852:15;52886:4;52883:1;52876:15;52903:180;52951:77;52948:1;52941:88;53048:4;53045:1;53038:15;53072:4;53069:1;53062:15;53089:180;53137:77;53134:1;53127:88;53234:4;53231:1;53224:15;53258:4;53255:1;53248:15;53275:180;53323:77;53320:1;53313:88;53420:4;53417:1;53410:15;53444:4;53441:1;53434:15;53461:180;53509:77;53506:1;53499:88;53606:4;53603:1;53596:15;53630:4;53627:1;53620:15;53647:117;53756:1;53753;53746:12;53770:117;53879:1;53876;53869:12;53893:117;54002:1;53999;53992:12;54016:117;54125:1;54122;54115:12;54139:117;54248:1;54245;54238:12;54262:102;54303:6;54354:2;54350:7;54345:2;54338:5;54334:14;54330:28;54320:38;;54262:102;;;:::o;54370:222::-;54510:34;54506:1;54498:6;54494:14;54487:58;54579:5;54574:2;54566:6;54562:15;54555:30;54370:222;:::o;54598:170::-;54738:22;54734:1;54726:6;54722:14;54715:46;54598:170;:::o;54774:214::-;54914:66;54910:1;54902:6;54898:14;54891:90;54774:214;:::o;54994:237::-;55134:34;55130:1;55122:6;55118:14;55111:58;55203:20;55198:2;55190:6;55186:15;55179:45;54994:237;:::o;55237:225::-;55377:34;55373:1;55365:6;55361:14;55354:58;55446:8;55441:2;55433:6;55429:15;55422:33;55237:225;:::o;55468:224::-;55608:34;55604:1;55596:6;55592:14;55585:58;55677:7;55672:2;55664:6;55660:15;55653:32;55468:224;:::o;55698:178::-;55838:30;55834:1;55826:6;55822:14;55815:54;55698:178;:::o;55882:223::-;56022:34;56018:1;56010:6;56006:14;55999:58;56091:6;56086:2;56078:6;56074:15;56067:31;55882:223;:::o;56111:175::-;56251:27;56247:1;56239:6;56235:14;56228:51;56111:175;:::o;56292:231::-;56432:34;56428:1;56420:6;56416:14;56409:58;56501:14;56496:2;56488:6;56484:15;56477:39;56292:231;:::o;56529:227::-;56669:34;56665:1;56657:6;56653:14;56646:58;56738:10;56733:2;56725:6;56721:15;56714:35;56529:227;:::o;56762:166::-;56902:18;56898:1;56890:6;56886:14;56879:42;56762:166;:::o;56934:229::-;57074:34;57070:1;57062:6;57058:14;57051:58;57143:12;57138:2;57130:6;57126:15;57119:37;56934:229;:::o;57169:243::-;57309:34;57305:1;57297:6;57293:14;57286:58;57378:26;57373:2;57365:6;57361:15;57354:51;57169:243;:::o;57418:229::-;57558:34;57554:1;57546:6;57542:14;57535:58;57627:12;57622:2;57614:6;57610:15;57603:37;57418:229;:::o;57653:228::-;57793:34;57789:1;57781:6;57777:14;57770:58;57862:11;57857:2;57849:6;57845:15;57838:36;57653:228;:::o;57887:233::-;58027:34;58023:1;58015:6;58011:14;58004:58;58096:16;58091:2;58083:6;58079:15;58072:41;57887:233;:::o;58126:182::-;58266:34;58262:1;58254:6;58250:14;58243:58;58126:182;:::o;58314:236::-;58454:34;58450:1;58442:6;58438:14;58431:58;58523:19;58518:2;58510:6;58506:15;58499:44;58314:236;:::o;58556:231::-;58696:34;58692:1;58684:6;58680:14;58673:58;58765:14;58760:2;58752:6;58748:15;58741:39;58556:231;:::o;58793:182::-;58933:34;58929:1;58921:6;58917:14;58910:58;58793:182;:::o;58981:169::-;59121:21;59117:1;59109:6;59105:14;59098:45;58981:169;:::o;59156:234::-;59296:34;59292:1;59284:6;59280:14;59273:58;59365:17;59360:2;59352:6;59348:15;59341:42;59156:234;:::o;59396:220::-;59536:34;59532:1;59524:6;59520:14;59513:58;59605:3;59600:2;59592:6;59588:15;59581:28;59396:220;:::o;59622:114::-;;:::o;59742:221::-;59882:34;59878:1;59870:6;59866:14;59859:58;59951:4;59946:2;59938:6;59934:15;59927:29;59742:221;:::o;59969:236::-;60109:34;60105:1;60097:6;60093:14;60086:58;60178:19;60173:2;60165:6;60161:15;60154:44;59969:236;:::o;60211:229::-;60351:34;60347:1;60339:6;60335:14;60328:58;60420:12;60415:2;60407:6;60403:15;60396:37;60211:229;:::o;60446:174::-;60586:26;60582:1;60574:6;60570:14;60563:50;60446:174;:::o;60626:221::-;60766:34;60762:1;60754:6;60750:14;60743:58;60835:4;60830:2;60822:6;60818:15;60811:29;60626:221;:::o;60853:235::-;60993:34;60989:1;60981:6;60977:14;60970:58;61062:18;61057:2;61049:6;61045:15;61038:43;60853:235;:::o;61094:170::-;61234:22;61230:1;61222:6;61218:14;61211:46;61094:170;:::o;61270:175::-;61410:27;61406:1;61398:6;61394:14;61387:51;61270:175;:::o;61451:122::-;61524:24;61542:5;61524:24;:::i;:::-;61517:5;61514:35;61504:63;;61563:1;61560;61553:12;61504:63;61451:122;:::o;61579:116::-;61649:21;61664:5;61649:21;:::i;:::-;61642:5;61639:32;61629:60;;61685:1;61682;61675:12;61629:60;61579:116;:::o;61701:122::-;61774:24;61792:5;61774:24;:::i;:::-;61767:5;61764:35;61754:63;;61813:1;61810;61803:12;61754:63;61701:122;:::o;61829:120::-;61901:23;61918:5;61901:23;:::i;:::-;61894:5;61891:34;61881:62;;61939:1;61936;61929:12;61881:62;61829:120;:::o;61955:122::-;62028:24;62046:5;62028:24;:::i;:::-;62021:5;62018:35;62008:63;;62067:1;62064;62057:12;62008:63;61955:122;:::o;62083:120::-;62155:23;62172:5;62155:23;:::i;:::-;62148:5;62145:34;62135:62;;62193:1;62190;62183:12;62135:62;62083:120;:::o

Swarm Source

ipfs://59466b4f0b90f6df67833eede15768911332b143ec3a449968caeafd05fa9a58
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.