ETH Price: $3,276.28 (+0.94%)
Gas: 2 Gwei

Token

WORLDX Passports (WXP)
 

Overview

Max Total Supply

355 WXP

Holders

335

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 WXP
0x50b356dc59e1f2a9d46ce24afebe037b7ef9ff5b
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:
WORLDXPassport

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-30
*/

// SPDX-License-Identifier: MIT
// 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/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.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/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/ERC721Enumerable.sol


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @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/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/WORLDx.sol


pragma solidity ^0.8.4;









contract WORLDXPassport is ERC721, Pausable, Ownable, ERC721URIStorage, ERC721Burnable, ERC721Enumerable, ERC721Royalty {
    using Counters for Counters.Counter;
    using Strings for uint256;

    Counters.Counter private _tokenIdCounter;
    string baseURI = "ipfs://QmaezJr4gu4eHtGP55auYdwFE3oye3AnM7WR4N62D6CBtK/";
    address private _recipient = 0xD4AC2EFF8A0Cc043A0d77C0A85276551829be9E6;
    uint256 public constant maxSupply = 200000; // Total token qty supply
    uint96 private royaltyPercentage = 700; // Royalty percentage
    uint256 public mintPrice = 0; // Price for mint the token (wei)
    uint256 public mintedQty = 0; // Current minted token qty
    mapping(address => bool) public whitelistAddress;

    constructor() ERC721("WORLDX Passports", "WXP") {
        _setDefaultRoyalty(_recipient, royaltyPercentage);
        _tokenIdCounter.increment();
    }
    
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    //to set after deployed if want to update new metadata
    function setbaseURI(string memory uri) external onlyOwner {
        baseURI = uri;
    }

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

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

    // The following functions are overrides required by Solidity.
    function _burn(uint256 tokenId)
        internal
        override(ERC721, ERC721URIStorage, ERC721Royalty)
    {
        super._burn(tokenId);
    }

    function setMintPrice(uint256 newMintPrice) public onlyOwner {
        mintPrice = newMintPrice;
    }

    function mint() public payable {
        uint256 tokenQty = 1;
        require(
            mintedQty + tokenQty <= maxSupply,
            "Sale would exceed max supply"
        );
        require(tokenQty * mintPrice <= msg.value, "Not enough ether sent");
        if (msg.sender != owner()) {
            require(whitelistAddress[msg.sender] == true, "Not in whitelist");
            require(
                balanceOf(msg.sender) == 0,
                "One wallet address can only mint 1 NFT"
            );
        }

        mintedQty += 1;
        safeMint();
    }
    
    function safeMint() internal  {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(msg.sender, tokenId);
        _setTokenURI(tokenId, string(abi.encodePacked(tokenId.toString(), ".json")));
        _removeWhitelistUser(msg.sender);
    }

    function whitelistUser(address _user) public onlyOwner {
        whitelistAddress[_user] = true;
    }

    function whitelistUserByBatch(address[] memory users) public onlyOwner {
        for (uint256 i = 0; i < users.length; i++) {
            whitelistAddress[users[i]] = true;
        }
    }

    function removeWhitelistUser(address _user) public onlyOwner {
        _removeWhitelistUser(_user);
    }

    function _removeWhitelistUser(address _user) internal {
        whitelistAddress[_user] = false;
    }

    function updateRoyaltyPercentage(uint96 newRoyaltyPercentage) public onlyOwner {
        _setDefaultRoyalty(_recipient, newRoyaltyPercentage);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721, ERC721Royalty, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"removeWhitelistUser","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":"uint256","name":"newMintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setbaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"newRoyaltyPercentage","type":"uint96"}],"name":"updateRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"whitelistUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"whitelistUserByBatch","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180606001604052806036815260200162005a7c60369139600f908051906020019062000035929190620004ad565b5073d4ac2eff8a0cc043a0d77c0a85276551829be9e6601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506102bc601060146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060006011556000601255348015620000d557600080fd5b506040518060400160405280601081526020017f574f524c44582050617373706f727473000000000000000000000000000000008152506040518060400160405280600381526020017f575850000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200015a929190620004ad565b50806003908051906020019062000173929190620004ad565b5050506000600860006101000a81548160ff021916908315150217905550620001b1620001a56200021c60201b60201c565b6200022460201b60201c565b620001ff601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601060149054906101000a90046bffffffffffffffffffffffff16620002ea60201b60201c565b62000216600e6200048d60201b62001ad71760201c565b620006dd565b600033905090565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002fa620004a360201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156200035b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200035290620005ab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003ce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c590620005cd565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6001816000016000828254019250508190555050565b6000612710905090565b828054620004bb9062000600565b90600052602060002090601f016020900481019282620004df57600085556200052b565b82601f10620004fa57805160ff19168380011785556200052b565b828001600101855582156200052b579182015b828111156200052a5782518255916020019190600101906200050d565b5b5090506200053a91906200053e565b5090565b5b80821115620005595760008160009055506001016200053f565b5090565b60006200056c602a83620005ef565b9150620005798262000665565b604082019050919050565b600062000593601983620005ef565b9150620005a082620006b4565b602082019050919050565b60006020820190508181036000830152620005c6816200055d565b9050919050565b60006020820190508181036000830152620005e88162000584565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200061957607f821691505b6020821081141562000630576200062f62000636565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b61538f80620006ed6000396000f3fe6080604052600436106102045760003560e01c80634a4c560d116101185780638da5cb5b116100a0578063c87b56dd1161006f578063c87b56dd14610731578063d5abeb011461076e578063e985e9c514610799578063f2fde38b146107d6578063f4a0a528146107ff57610204565b80638da5cb5b1461068957806395d89b41146106b4578063a22cb465146106df578063b88d4fde1461070857610204565b80636817c76c116100e75780636817c76c146105ca57806370a08231146105f5578063715018a6146106325780638080e8a3146106495780638456cb591461067257610204565b80634a4c560d146104fc5780634f6ccce7146105255780635c975abb146105625780636352211e1461058d57610204565b80632a55205a1161019b5780633f5632b01161016a5780633f5632b014610419578063415665851461044457806342842e0e1461048157806342966c68146104aa5780634a44f379146104d357610204565b80632a55205a1461035e5780632f745c591461039c57806330cc7ae0146103d95780633f4ba83a1461040257610204565b80630cc54d5a116101d75780630cc54d5a146102d75780631249c58b1461030057806318160ddd1461030a57806323b872dd1461033557610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613bea565b610828565b60405161023d91906142cb565b60405180910390f35b34801561025257600080fd5b5061025b61083a565b60405161026891906142e6565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613c7d565b6108cc565b6040516102a5919061423b565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613b6d565b610951565b005b3480156102e357600080fd5b506102fe60048036038101906102f99190613ce2565b610a69565b005b610308610b14565b005b34801561031657600080fd5b5061031f610cfb565b60405161032c91906146a8565b60405180910390f35b34801561034157600080fd5b5061035c60048036038101906103579190613a67565b610d08565b005b34801561036a57600080fd5b5061038560048036038101906103809190613ca6565b610d68565b6040516103939291906142a2565b60405180910390f35b3480156103a857600080fd5b506103c360048036038101906103be9190613b6d565b610f53565b6040516103d091906146a8565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190613a02565b610ff8565b005b34801561040e57600080fd5b50610417611080565b005b34801561042557600080fd5b5061042e611106565b60405161043b91906146a8565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190613a02565b61110c565b60405161047891906142cb565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190613a67565b61112c565b005b3480156104b657600080fd5b506104d160048036038101906104cc9190613c7d565b61114c565b005b3480156104df57600080fd5b506104fa60048036038101906104f59190613c3c565b6111a8565b005b34801561050857600080fd5b50610523600480360381019061051e9190613a02565b61123e565b005b34801561053157600080fd5b5061054c60048036038101906105479190613c7d565b611315565b60405161055991906146a8565b60405180910390f35b34801561056e57600080fd5b506105776113ac565b60405161058491906142cb565b60405180910390f35b34801561059957600080fd5b506105b460048036038101906105af9190613c7d565b6113c3565b6040516105c1919061423b565b60405180910390f35b3480156105d657600080fd5b506105df611475565b6040516105ec91906146a8565b60405180910390f35b34801561060157600080fd5b5061061c60048036038101906106179190613a02565b61147b565b60405161062991906146a8565b60405180910390f35b34801561063e57600080fd5b50610647611533565b005b34801561065557600080fd5b50610670600480360381019061066b9190613ba9565b6115bb565b005b34801561067e57600080fd5b506106876116f2565b005b34801561069557600080fd5b5061069e611778565b6040516106ab919061423b565b60405180910390f35b3480156106c057600080fd5b506106c96117a2565b6040516106d691906142e6565b60405180910390f35b3480156106eb57600080fd5b5061070660048036038101906107019190613b31565b611834565b005b34801561071457600080fd5b5061072f600480360381019061072a9190613ab6565b61184a565b005b34801561073d57600080fd5b5061075860048036038101906107539190613c7d565b6118ac565b60405161076591906142e6565b60405180910390f35b34801561077a57600080fd5b506107836118be565b60405161079091906146a8565b60405180910390f35b3480156107a557600080fd5b506107c060048036038101906107bb9190613a2b565b6118c5565b6040516107cd91906142cb565b60405180910390f35b3480156107e257600080fd5b506107fd60048036038101906107f89190613a02565b611959565b005b34801561080b57600080fd5b5061082660048036038101906108219190613c7d565b611a51565b005b600061083382611aed565b9050919050565b6060600280546108499061499c565b80601f01602080910402602001604051908101604052809291908181526020018280546108759061499c565b80156108c25780601f10610897576101008083540402835291602001916108c2565b820191906000526020600020905b8154815290600101906020018083116108a557829003601f168201915b5050505050905090565b60006108d782611aff565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90614568565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095c826113c3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c4906145c8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ec611b6b565b73ffffffffffffffffffffffffffffffffffffffff161480610a1b5750610a1a81610a15611b6b565b6118c5565b5b610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5190614488565b60405180910390fd5b610a648383611b73565b505050565b610a71611b6b565b73ffffffffffffffffffffffffffffffffffffffff16610a8f611778565b73ffffffffffffffffffffffffffffffffffffffff1614610ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adc90614588565b60405180910390fd5b610b11601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611c2c565b50565b60006001905062030d4081601254610b2c91906147b9565b1115610b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b64906143c8565b60405180910390fd5b3460115482610b7c9190614840565b1115610bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb490614628565b60405180910390fd5b610bc5611778565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cd65760011515601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8190614448565b60405180910390fd5b6000610c953361147b565b14610cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccc906144a8565b60405180910390fd5b5b600160126000828254610ce991906147b9565b92505081905550610cf8611dc1565b50565b6000600c80549050905090565b610d19610d13611b6b565b82611e20565b610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f906145e8565b60405180910390fd5b610d63838383611efe565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610efe5760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610f08612165565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610f349190614840565b610f3e919061480f565b90508160000151819350935050509250929050565b6000610f5e8361147b565b8210610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690614328565b60405180910390fd5b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611000611b6b565b73ffffffffffffffffffffffffffffffffffffffff1661101e611778565b73ffffffffffffffffffffffffffffffffffffffff1614611074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106b90614588565b60405180910390fd5b61107d8161216f565b50565b611088611b6b565b73ffffffffffffffffffffffffffffffffffffffff166110a6611778565b73ffffffffffffffffffffffffffffffffffffffff16146110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614588565b60405180910390fd5b6111046121ca565b565b60125481565b60136020528060005260406000206000915054906101000a900460ff1681565b6111478383836040518060200160405280600081525061184a565b505050565b61115d611157611b6b565b82611e20565b61119c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119390614668565b60405180910390fd5b6111a58161226c565b50565b6111b0611b6b565b73ffffffffffffffffffffffffffffffffffffffff166111ce611778565b73ffffffffffffffffffffffffffffffffffffffff1614611224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121b90614588565b60405180910390fd5b80600f908051906020019061123a92919061373b565b5050565b611246611b6b565b73ffffffffffffffffffffffffffffffffffffffff16611264611778565b73ffffffffffffffffffffffffffffffffffffffff16146112ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b190614588565b60405180910390fd5b6001601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600061131f610cfb565b8210611360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135790614608565b60405180910390fd5b600c828154811061139a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000600860009054906101000a900460ff16905090565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561146c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611463906144e8565b60405180910390fd5b80915050919050565b60115481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e3906144c8565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61153b611b6b565b73ffffffffffffffffffffffffffffffffffffffff16611559611778565b73ffffffffffffffffffffffffffffffffffffffff16146115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a690614588565b60405180910390fd5b6115b96000612278565b565b6115c3611b6b565b73ffffffffffffffffffffffffffffffffffffffff166115e1611778565b73ffffffffffffffffffffffffffffffffffffffff1614611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e90614588565b60405180910390fd5b60005b81518110156116ee57600160136000848481518110611682577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806116e6906149ff565b91505061163a565b5050565b6116fa611b6b565b73ffffffffffffffffffffffffffffffffffffffff16611718611778565b73ffffffffffffffffffffffffffffffffffffffff161461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176590614588565b60405180910390fd5b61177661233e565b565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546117b19061499c565b80601f01602080910402602001604051908101604052809291908181526020018280546117dd9061499c565b801561182a5780601f106117ff5761010080835404028352916020019161182a565b820191906000526020600020905b81548152906001019060200180831161180d57829003601f168201915b5050505050905090565b61184661183f611b6b565b83836123e1565b5050565b61185b611855611b6b565b83611e20565b61189a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611891906145e8565b60405180910390fd5b6118a68484848461254e565b50505050565b60606118b7826125aa565b9050919050565b62030d4081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611961611b6b565b73ffffffffffffffffffffffffffffffffffffffff1661197f611778565b73ffffffffffffffffffffffffffffffffffffffff16146119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc90614588565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3c90614368565b60405180910390fd5b611a4e81612278565b50565b611a59611b6b565b73ffffffffffffffffffffffffffffffffffffffff16611a77611778565b73ffffffffffffffffffffffffffffffffffffffff1614611acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac490614588565b60405180910390fd5b8060118190555050565b6001816000016000828254019250508190555050565b6000611af8826126fc565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611be6836113c3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611c34612165565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8990614648565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf990614688565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000611dcd600e612776565b9050611dd9600e611ad7565b611de33382612784565b611e1481611df0836127a2565b604051602001611e009190614219565b60405160208183030381529060405261294f565b611e1d3361216f565b50565b6000611e2b82611aff565b611e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6190614428565b60405180910390fd5b6000611e75836113c3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611eb75750611eb681856118c5565b5b80611ef557508373ffffffffffffffffffffffffffffffffffffffff16611edd846108cc565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f1e826113c3565b73ffffffffffffffffffffffffffffffffffffffff1614611f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6b90614388565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdb906143e8565b60405180910390fd5b611fef8383836129c3565b611ffa600082611b73565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204a919061489a565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a191906147b9565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121608383836129d3565b505050565b6000612710905090565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6121d26113ac565b612211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220890614308565b60405180910390fd5b6000600860006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612255611b6b565b604051612262919061423b565b60405180910390a1565b612275816129d8565b50565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123466113ac565b15612386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237d90614468565b60405180910390fd5b6001600860006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123ca611b6b565b6040516123d7919061423b565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244790614408565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161254191906142cb565b60405180910390a3505050565b612559848484611efe565b612565848484846129ed565b6125a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259b90614348565b60405180910390fd5b50505050565b60606125b582611aff565b6125f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125eb90614548565b60405180910390fd5b60006009600084815260200190815260200160002080546126149061499c565b80601f01602080910402602001604051908101604052809291908181526020018280546126409061499c565b801561268d5780601f106126625761010080835404028352916020019161268d565b820191906000526020600020905b81548152906001019060200180831161267057829003601f168201915b50505050509050600061269e612b84565b90506000815114156126b45781925050506126f7565b6000825111156126e95780826040516020016126d19291906141f5565b604051602081830303815290604052925050506126f7565b6126f284612c16565b925050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061276f575061276e82612cbd565b5b9050919050565b600081600001549050919050565b61279e828260405180602001604052806000815250612d9f565b5050565b606060008214156127ea576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061294a565b600082905060005b6000821461281c578080612805906149ff565b915050600a82612815919061480f565b91506127f2565b60008167ffffffffffffffff81111561285e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128905781602001600182028036833780820191505090505b5090505b60008514612943576001826128a9919061489a565b9150600a856128b89190614a48565b60306128c491906147b9565b60f81b818381518110612900577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561293c919061480f565b9450612894565b8093505050505b919050565b61295882611aff565b612997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298e90614508565b60405180910390fd5b806009600084815260200190815260200160002090805190602001906129be92919061373b565b505050565b6129ce838383612dfa565b505050565b505050565b6129e181612f0e565b6129ea81612f61565b50565b6000612a0e8473ffffffffffffffffffffffffffffffffffffffff16612fc0565b15612b77578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a37611b6b565b8786866040518563ffffffff1660e01b8152600401612a599493929190614256565b602060405180830381600087803b158015612a7357600080fd5b505af1925050508015612aa457506040513d601f19601f82011682018060405250810190612aa19190613c13565b60015b612b27573d8060008114612ad4576040519150601f19603f3d011682016040523d82523d6000602084013e612ad9565b606091505b50600081511415612b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1690614348565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b7c565b600190505b949350505050565b6060600f8054612b939061499c565b80601f0160208091040260200160405190810160405280929190818152602001828054612bbf9061499c565b8015612c0c5780601f10612be157610100808354040283529160200191612c0c565b820191906000526020600020905b815481529060010190602001808311612bef57829003601f168201915b5050505050905090565b6060612c2182611aff565b612c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c57906145a8565b60405180910390fd5b6000612c6a612b84565b90506000815111612c8a5760405180602001604052806000815250612cb5565b80612c94846127a2565b604051602001612ca59291906141f5565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d8857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d985750612d9782612fe3565b5b9050919050565b612da9838361305d565b612db660008484846129ed565b612df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dec90614348565b60405180910390fd5b505050565b612e05838383613237565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e4857612e438161323c565b612e87565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e8657612e858382613285565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eca57612ec5816133f2565b612f09565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612f0857612f078282613535565b5b5b505050565b612f17816135b4565b6000600960008381526020019081526020016000208054612f379061499c565b905014612f5e57600960008281526020019081526020016000206000612f5d91906137c1565b5b50565b60016000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806130565750613055826136d1565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c490614528565b60405180910390fd5b6130d681611aff565b15613116576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310d906143a8565b60405180910390fd5b613122600083836129c3565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461317291906147b9565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613233600083836129d3565b5050565b505050565b600c80549050600d600083815260200190815260200160002081905550600c81908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016132928461147b565b61329c919061489a565b90506000600b6000848152602001908152602001600020549050818114613381576000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555081600b600083815260200190815260200160002081905550505b600b600084815260200190815260200160002060009055600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600c80549050613406919061489a565b90506000600d60008481526020019081526020016000205490506000600c838154811061345c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600c83815481106134a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600d600083815260200190815260200160002081905550600d600085815260200190815260200160002060009055600c805480613519577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006135408361147b565b905081600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000208190555080600b600084815260200190815260200160002081905550505050565b60006135bf826113c3565b90506135cd816000846129c3565b6135d8600083611b73565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613628919061489a565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136cd816000846129d3565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8280546137479061499c565b90600052602060002090601f01602090048101928261376957600085556137b0565b82601f1061378257805160ff19168380011785556137b0565b828001600101855582156137b0579182015b828111156137af578251825591602001919060010190613794565b5b5090506137bd9190613801565b5090565b5080546137cd9061499c565b6000825580601f106137df57506137fe565b601f0160209004906000526020600020908101906137fd9190613801565b5b50565b5b8082111561381a576000816000905550600101613802565b5090565b600061383161382c846146e8565b6146c3565b9050808382526020820190508285602086028201111561385057600080fd5b60005b8581101561388057816138668882613906565b845260208401935060208301925050600181019050613853565b5050509392505050565b600061389d61389884614714565b6146c3565b9050828152602081018484840111156138b557600080fd5b6138c084828561495a565b509392505050565b60006138db6138d684614745565b6146c3565b9050828152602081018484840111156138f357600080fd5b6138fe84828561495a565b509392505050565b600081359050613915816152e6565b92915050565b600082601f83011261392c57600080fd5b813561393c84826020860161381e565b91505092915050565b600081359050613954816152fd565b92915050565b60008135905061396981615314565b92915050565b60008151905061397e81615314565b92915050565b600082601f83011261399557600080fd5b81356139a584826020860161388a565b91505092915050565b600082601f8301126139bf57600080fd5b81356139cf8482602086016138c8565b91505092915050565b6000813590506139e78161532b565b92915050565b6000813590506139fc81615342565b92915050565b600060208284031215613a1457600080fd5b6000613a2284828501613906565b91505092915050565b60008060408385031215613a3e57600080fd5b6000613a4c85828601613906565b9250506020613a5d85828601613906565b9150509250929050565b600080600060608486031215613a7c57600080fd5b6000613a8a86828701613906565b9350506020613a9b86828701613906565b9250506040613aac868287016139d8565b9150509250925092565b60008060008060808587031215613acc57600080fd5b6000613ada87828801613906565b9450506020613aeb87828801613906565b9350506040613afc878288016139d8565b925050606085013567ffffffffffffffff811115613b1957600080fd5b613b2587828801613984565b91505092959194509250565b60008060408385031215613b4457600080fd5b6000613b5285828601613906565b9250506020613b6385828601613945565b9150509250929050565b60008060408385031215613b8057600080fd5b6000613b8e85828601613906565b9250506020613b9f858286016139d8565b9150509250929050565b600060208284031215613bbb57600080fd5b600082013567ffffffffffffffff811115613bd557600080fd5b613be18482850161391b565b91505092915050565b600060208284031215613bfc57600080fd5b6000613c0a8482850161395a565b91505092915050565b600060208284031215613c2557600080fd5b6000613c338482850161396f565b91505092915050565b600060208284031215613c4e57600080fd5b600082013567ffffffffffffffff811115613c6857600080fd5b613c74848285016139ae565b91505092915050565b600060208284031215613c8f57600080fd5b6000613c9d848285016139d8565b91505092915050565b60008060408385031215613cb957600080fd5b6000613cc7858286016139d8565b9250506020613cd8858286016139d8565b9150509250929050565b600060208284031215613cf457600080fd5b6000613d02848285016139ed565b91505092915050565b613d14816148ce565b82525050565b613d23816148e0565b82525050565b6000613d3482614776565b613d3e818561478c565b9350613d4e818560208601614969565b613d5781614b35565b840191505092915050565b6000613d6d82614781565b613d77818561479d565b9350613d87818560208601614969565b613d9081614b35565b840191505092915050565b6000613da682614781565b613db081856147ae565b9350613dc0818560208601614969565b80840191505092915050565b6000613dd960148361479d565b9150613de482614b46565b602082019050919050565b6000613dfc602b8361479d565b9150613e0782614b6f565b604082019050919050565b6000613e1f60328361479d565b9150613e2a82614bbe565b604082019050919050565b6000613e4260268361479d565b9150613e4d82614c0d565b604082019050919050565b6000613e6560258361479d565b9150613e7082614c5c565b604082019050919050565b6000613e88601c8361479d565b9150613e9382614cab565b602082019050919050565b6000613eab601c8361479d565b9150613eb682614cd4565b602082019050919050565b6000613ece60248361479d565b9150613ed982614cfd565b604082019050919050565b6000613ef160198361479d565b9150613efc82614d4c565b602082019050919050565b6000613f14602c8361479d565b9150613f1f82614d75565b604082019050919050565b6000613f3760108361479d565b9150613f4282614dc4565b602082019050919050565b6000613f5a60108361479d565b9150613f6582614ded565b602082019050919050565b6000613f7d60388361479d565b9150613f8882614e16565b604082019050919050565b6000613fa060268361479d565b9150613fab82614e65565b604082019050919050565b6000613fc3602a8361479d565b9150613fce82614eb4565b604082019050919050565b6000613fe660298361479d565b9150613ff182614f03565b604082019050919050565b6000614009602e8361479d565b915061401482614f52565b604082019050919050565b600061402c60208361479d565b915061403782614fa1565b602082019050919050565b600061404f60318361479d565b915061405a82614fca565b604082019050919050565b6000614072602c8361479d565b915061407d82615019565b604082019050919050565b60006140956005836147ae565b91506140a082615068565b600582019050919050565b60006140b860208361479d565b91506140c382615091565b602082019050919050565b60006140db602f8361479d565b91506140e6826150ba565b604082019050919050565b60006140fe60218361479d565b915061410982615109565b604082019050919050565b600061412160318361479d565b915061412c82615158565b604082019050919050565b6000614144602c8361479d565b915061414f826151a7565b604082019050919050565b600061416760158361479d565b9150614172826151f6565b602082019050919050565b600061418a602a8361479d565b91506141958261521f565b604082019050919050565b60006141ad60308361479d565b91506141b88261526e565b604082019050919050565b60006141d060198361479d565b91506141db826152bd565b602082019050919050565b6141ef81614938565b82525050565b60006142018285613d9b565b915061420d8284613d9b565b91508190509392505050565b60006142258284613d9b565b915061423082614088565b915081905092915050565b60006020820190506142506000830184613d0b565b92915050565b600060808201905061426b6000830187613d0b565b6142786020830186613d0b565b61428560408301856141e6565b81810360608301526142978184613d29565b905095945050505050565b60006040820190506142b76000830185613d0b565b6142c460208301846141e6565b9392505050565b60006020820190506142e06000830184613d1a565b92915050565b600060208201905081810360008301526143008184613d62565b905092915050565b6000602082019050818103600083015261432181613dcc565b9050919050565b6000602082019050818103600083015261434181613def565b9050919050565b6000602082019050818103600083015261436181613e12565b9050919050565b6000602082019050818103600083015261438181613e35565b9050919050565b600060208201905081810360008301526143a181613e58565b9050919050565b600060208201905081810360008301526143c181613e7b565b9050919050565b600060208201905081810360008301526143e181613e9e565b9050919050565b6000602082019050818103600083015261440181613ec1565b9050919050565b6000602082019050818103600083015261442181613ee4565b9050919050565b6000602082019050818103600083015261444181613f07565b9050919050565b6000602082019050818103600083015261446181613f2a565b9050919050565b6000602082019050818103600083015261448181613f4d565b9050919050565b600060208201905081810360008301526144a181613f70565b9050919050565b600060208201905081810360008301526144c181613f93565b9050919050565b600060208201905081810360008301526144e181613fb6565b9050919050565b6000602082019050818103600083015261450181613fd9565b9050919050565b6000602082019050818103600083015261452181613ffc565b9050919050565b600060208201905081810360008301526145418161401f565b9050919050565b6000602082019050818103600083015261456181614042565b9050919050565b6000602082019050818103600083015261458181614065565b9050919050565b600060208201905081810360008301526145a1816140ab565b9050919050565b600060208201905081810360008301526145c1816140ce565b9050919050565b600060208201905081810360008301526145e1816140f1565b9050919050565b6000602082019050818103600083015261460181614114565b9050919050565b6000602082019050818103600083015261462181614137565b9050919050565b600060208201905081810360008301526146418161415a565b9050919050565b600060208201905081810360008301526146618161417d565b9050919050565b60006020820190508181036000830152614681816141a0565b9050919050565b600060208201905081810360008301526146a1816141c3565b9050919050565b60006020820190506146bd60008301846141e6565b92915050565b60006146cd6146de565b90506146d982826149ce565b919050565b6000604051905090565b600067ffffffffffffffff82111561470357614702614b06565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561472f5761472e614b06565b5b61473882614b35565b9050602081019050919050565b600067ffffffffffffffff8211156147605761475f614b06565b5b61476982614b35565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006147c482614938565b91506147cf83614938565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561480457614803614a79565b5b828201905092915050565b600061481a82614938565b915061482583614938565b92508261483557614834614aa8565b5b828204905092915050565b600061484b82614938565b915061485683614938565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561488f5761488e614a79565b5b828202905092915050565b60006148a582614938565b91506148b083614938565b9250828210156148c3576148c2614a79565b5b828203905092915050565b60006148d982614918565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561498757808201518184015260208101905061496c565b83811115614996576000848401525b50505050565b600060028204905060018216806149b457607f821691505b602082108114156149c8576149c7614ad7565b5b50919050565b6149d782614b35565b810181811067ffffffffffffffff821117156149f6576149f5614b06565b5b80604052505050565b6000614a0a82614938565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a3d57614a3c614a79565b5b600182019050919050565b6000614a5382614938565b9150614a5e83614938565b925082614a6e57614a6d614aa8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53616c6520776f756c6420657863656564206d617820737570706c7900000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6f7420696e2077686974656c69737400000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4f6e652077616c6c657420616464726573732063616e206f6e6c79206d696e7460008201527f2031204e46540000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6152ef816148ce565b81146152fa57600080fd5b50565b615306816148e0565b811461531157600080fd5b50565b61531d816148ec565b811461532857600080fd5b50565b61533481614938565b811461533f57600080fd5b50565b61534b81614942565b811461535657600080fd5b5056fea2646970667358221220072e8b595eb5765f48834f4350c029cb67a60e694ebd07f47cabe5d5a5fc349664736f6c63430008040033697066733a2f2f516d61657a4a72346775346548744750353561755964774645336f796533416e4d375752344e363244364342744b2f

Deployed Bytecode

0x6080604052600436106102045760003560e01c80634a4c560d116101185780638da5cb5b116100a0578063c87b56dd1161006f578063c87b56dd14610731578063d5abeb011461076e578063e985e9c514610799578063f2fde38b146107d6578063f4a0a528146107ff57610204565b80638da5cb5b1461068957806395d89b41146106b4578063a22cb465146106df578063b88d4fde1461070857610204565b80636817c76c116100e75780636817c76c146105ca57806370a08231146105f5578063715018a6146106325780638080e8a3146106495780638456cb591461067257610204565b80634a4c560d146104fc5780634f6ccce7146105255780635c975abb146105625780636352211e1461058d57610204565b80632a55205a1161019b5780633f5632b01161016a5780633f5632b014610419578063415665851461044457806342842e0e1461048157806342966c68146104aa5780634a44f379146104d357610204565b80632a55205a1461035e5780632f745c591461039c57806330cc7ae0146103d95780633f4ba83a1461040257610204565b80630cc54d5a116101d75780630cc54d5a146102d75780631249c58b1461030057806318160ddd1461030a57806323b872dd1461033557610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613bea565b610828565b60405161023d91906142cb565b60405180910390f35b34801561025257600080fd5b5061025b61083a565b60405161026891906142e6565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613c7d565b6108cc565b6040516102a5919061423b565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613b6d565b610951565b005b3480156102e357600080fd5b506102fe60048036038101906102f99190613ce2565b610a69565b005b610308610b14565b005b34801561031657600080fd5b5061031f610cfb565b60405161032c91906146a8565b60405180910390f35b34801561034157600080fd5b5061035c60048036038101906103579190613a67565b610d08565b005b34801561036a57600080fd5b5061038560048036038101906103809190613ca6565b610d68565b6040516103939291906142a2565b60405180910390f35b3480156103a857600080fd5b506103c360048036038101906103be9190613b6d565b610f53565b6040516103d091906146a8565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190613a02565b610ff8565b005b34801561040e57600080fd5b50610417611080565b005b34801561042557600080fd5b5061042e611106565b60405161043b91906146a8565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190613a02565b61110c565b60405161047891906142cb565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190613a67565b61112c565b005b3480156104b657600080fd5b506104d160048036038101906104cc9190613c7d565b61114c565b005b3480156104df57600080fd5b506104fa60048036038101906104f59190613c3c565b6111a8565b005b34801561050857600080fd5b50610523600480360381019061051e9190613a02565b61123e565b005b34801561053157600080fd5b5061054c60048036038101906105479190613c7d565b611315565b60405161055991906146a8565b60405180910390f35b34801561056e57600080fd5b506105776113ac565b60405161058491906142cb565b60405180910390f35b34801561059957600080fd5b506105b460048036038101906105af9190613c7d565b6113c3565b6040516105c1919061423b565b60405180910390f35b3480156105d657600080fd5b506105df611475565b6040516105ec91906146a8565b60405180910390f35b34801561060157600080fd5b5061061c60048036038101906106179190613a02565b61147b565b60405161062991906146a8565b60405180910390f35b34801561063e57600080fd5b50610647611533565b005b34801561065557600080fd5b50610670600480360381019061066b9190613ba9565b6115bb565b005b34801561067e57600080fd5b506106876116f2565b005b34801561069557600080fd5b5061069e611778565b6040516106ab919061423b565b60405180910390f35b3480156106c057600080fd5b506106c96117a2565b6040516106d691906142e6565b60405180910390f35b3480156106eb57600080fd5b5061070660048036038101906107019190613b31565b611834565b005b34801561071457600080fd5b5061072f600480360381019061072a9190613ab6565b61184a565b005b34801561073d57600080fd5b5061075860048036038101906107539190613c7d565b6118ac565b60405161076591906142e6565b60405180910390f35b34801561077a57600080fd5b506107836118be565b60405161079091906146a8565b60405180910390f35b3480156107a557600080fd5b506107c060048036038101906107bb9190613a2b565b6118c5565b6040516107cd91906142cb565b60405180910390f35b3480156107e257600080fd5b506107fd60048036038101906107f89190613a02565b611959565b005b34801561080b57600080fd5b5061082660048036038101906108219190613c7d565b611a51565b005b600061083382611aed565b9050919050565b6060600280546108499061499c565b80601f01602080910402602001604051908101604052809291908181526020018280546108759061499c565b80156108c25780601f10610897576101008083540402835291602001916108c2565b820191906000526020600020905b8154815290600101906020018083116108a557829003601f168201915b5050505050905090565b60006108d782611aff565b610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90614568565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095c826113c3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c4906145c8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ec611b6b565b73ffffffffffffffffffffffffffffffffffffffff161480610a1b5750610a1a81610a15611b6b565b6118c5565b5b610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5190614488565b60405180910390fd5b610a648383611b73565b505050565b610a71611b6b565b73ffffffffffffffffffffffffffffffffffffffff16610a8f611778565b73ffffffffffffffffffffffffffffffffffffffff1614610ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adc90614588565b60405180910390fd5b610b11601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611c2c565b50565b60006001905062030d4081601254610b2c91906147b9565b1115610b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b64906143c8565b60405180910390fd5b3460115482610b7c9190614840565b1115610bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb490614628565b60405180910390fd5b610bc5611778565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cd65760011515601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8190614448565b60405180910390fd5b6000610c953361147b565b14610cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccc906144a8565b60405180910390fd5b5b600160126000828254610ce991906147b9565b92505081905550610cf8611dc1565b50565b6000600c80549050905090565b610d19610d13611b6b565b82611e20565b610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f906145e8565b60405180910390fd5b610d63838383611efe565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610efe5760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610f08612165565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610f349190614840565b610f3e919061480f565b90508160000151819350935050509250929050565b6000610f5e8361147b565b8210610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690614328565b60405180910390fd5b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611000611b6b565b73ffffffffffffffffffffffffffffffffffffffff1661101e611778565b73ffffffffffffffffffffffffffffffffffffffff1614611074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106b90614588565b60405180910390fd5b61107d8161216f565b50565b611088611b6b565b73ffffffffffffffffffffffffffffffffffffffff166110a6611778565b73ffffffffffffffffffffffffffffffffffffffff16146110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614588565b60405180910390fd5b6111046121ca565b565b60125481565b60136020528060005260406000206000915054906101000a900460ff1681565b6111478383836040518060200160405280600081525061184a565b505050565b61115d611157611b6b565b82611e20565b61119c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119390614668565b60405180910390fd5b6111a58161226c565b50565b6111b0611b6b565b73ffffffffffffffffffffffffffffffffffffffff166111ce611778565b73ffffffffffffffffffffffffffffffffffffffff1614611224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121b90614588565b60405180910390fd5b80600f908051906020019061123a92919061373b565b5050565b611246611b6b565b73ffffffffffffffffffffffffffffffffffffffff16611264611778565b73ffffffffffffffffffffffffffffffffffffffff16146112ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b190614588565b60405180910390fd5b6001601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600061131f610cfb565b8210611360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135790614608565b60405180910390fd5b600c828154811061139a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000600860009054906101000a900460ff16905090565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561146c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611463906144e8565b60405180910390fd5b80915050919050565b60115481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e3906144c8565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61153b611b6b565b73ffffffffffffffffffffffffffffffffffffffff16611559611778565b73ffffffffffffffffffffffffffffffffffffffff16146115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a690614588565b60405180910390fd5b6115b96000612278565b565b6115c3611b6b565b73ffffffffffffffffffffffffffffffffffffffff166115e1611778565b73ffffffffffffffffffffffffffffffffffffffff1614611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e90614588565b60405180910390fd5b60005b81518110156116ee57600160136000848481518110611682577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806116e6906149ff565b91505061163a565b5050565b6116fa611b6b565b73ffffffffffffffffffffffffffffffffffffffff16611718611778565b73ffffffffffffffffffffffffffffffffffffffff161461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176590614588565b60405180910390fd5b61177661233e565b565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546117b19061499c565b80601f01602080910402602001604051908101604052809291908181526020018280546117dd9061499c565b801561182a5780601f106117ff5761010080835404028352916020019161182a565b820191906000526020600020905b81548152906001019060200180831161180d57829003601f168201915b5050505050905090565b61184661183f611b6b565b83836123e1565b5050565b61185b611855611b6b565b83611e20565b61189a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611891906145e8565b60405180910390fd5b6118a68484848461254e565b50505050565b60606118b7826125aa565b9050919050565b62030d4081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611961611b6b565b73ffffffffffffffffffffffffffffffffffffffff1661197f611778565b73ffffffffffffffffffffffffffffffffffffffff16146119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc90614588565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3c90614368565b60405180910390fd5b611a4e81612278565b50565b611a59611b6b565b73ffffffffffffffffffffffffffffffffffffffff16611a77611778565b73ffffffffffffffffffffffffffffffffffffffff1614611acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac490614588565b60405180910390fd5b8060118190555050565b6001816000016000828254019250508190555050565b6000611af8826126fc565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611be6836113c3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611c34612165565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8990614648565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf990614688565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000611dcd600e612776565b9050611dd9600e611ad7565b611de33382612784565b611e1481611df0836127a2565b604051602001611e009190614219565b60405160208183030381529060405261294f565b611e1d3361216f565b50565b6000611e2b82611aff565b611e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6190614428565b60405180910390fd5b6000611e75836113c3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611eb75750611eb681856118c5565b5b80611ef557508373ffffffffffffffffffffffffffffffffffffffff16611edd846108cc565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f1e826113c3565b73ffffffffffffffffffffffffffffffffffffffff1614611f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6b90614388565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdb906143e8565b60405180910390fd5b611fef8383836129c3565b611ffa600082611b73565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204a919061489a565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a191906147b9565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121608383836129d3565b505050565b6000612710905090565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6121d26113ac565b612211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220890614308565b60405180910390fd5b6000600860006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612255611b6b565b604051612262919061423b565b60405180910390a1565b612275816129d8565b50565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123466113ac565b15612386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237d90614468565b60405180910390fd5b6001600860006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123ca611b6b565b6040516123d7919061423b565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244790614408565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161254191906142cb565b60405180910390a3505050565b612559848484611efe565b612565848484846129ed565b6125a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259b90614348565b60405180910390fd5b50505050565b60606125b582611aff565b6125f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125eb90614548565b60405180910390fd5b60006009600084815260200190815260200160002080546126149061499c565b80601f01602080910402602001604051908101604052809291908181526020018280546126409061499c565b801561268d5780601f106126625761010080835404028352916020019161268d565b820191906000526020600020905b81548152906001019060200180831161267057829003601f168201915b50505050509050600061269e612b84565b90506000815114156126b45781925050506126f7565b6000825111156126e95780826040516020016126d19291906141f5565b604051602081830303815290604052925050506126f7565b6126f284612c16565b925050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061276f575061276e82612cbd565b5b9050919050565b600081600001549050919050565b61279e828260405180602001604052806000815250612d9f565b5050565b606060008214156127ea576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061294a565b600082905060005b6000821461281c578080612805906149ff565b915050600a82612815919061480f565b91506127f2565b60008167ffffffffffffffff81111561285e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128905781602001600182028036833780820191505090505b5090505b60008514612943576001826128a9919061489a565b9150600a856128b89190614a48565b60306128c491906147b9565b60f81b818381518110612900577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561293c919061480f565b9450612894565b8093505050505b919050565b61295882611aff565b612997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298e90614508565b60405180910390fd5b806009600084815260200190815260200160002090805190602001906129be92919061373b565b505050565b6129ce838383612dfa565b505050565b505050565b6129e181612f0e565b6129ea81612f61565b50565b6000612a0e8473ffffffffffffffffffffffffffffffffffffffff16612fc0565b15612b77578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a37611b6b565b8786866040518563ffffffff1660e01b8152600401612a599493929190614256565b602060405180830381600087803b158015612a7357600080fd5b505af1925050508015612aa457506040513d601f19601f82011682018060405250810190612aa19190613c13565b60015b612b27573d8060008114612ad4576040519150601f19603f3d011682016040523d82523d6000602084013e612ad9565b606091505b50600081511415612b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1690614348565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b7c565b600190505b949350505050565b6060600f8054612b939061499c565b80601f0160208091040260200160405190810160405280929190818152602001828054612bbf9061499c565b8015612c0c5780601f10612be157610100808354040283529160200191612c0c565b820191906000526020600020905b815481529060010190602001808311612bef57829003601f168201915b5050505050905090565b6060612c2182611aff565b612c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c57906145a8565b60405180910390fd5b6000612c6a612b84565b90506000815111612c8a5760405180602001604052806000815250612cb5565b80612c94846127a2565b604051602001612ca59291906141f5565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d8857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d985750612d9782612fe3565b5b9050919050565b612da9838361305d565b612db660008484846129ed565b612df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dec90614348565b60405180910390fd5b505050565b612e05838383613237565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e4857612e438161323c565b612e87565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e8657612e858382613285565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eca57612ec5816133f2565b612f09565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612f0857612f078282613535565b5b5b505050565b612f17816135b4565b6000600960008381526020019081526020016000208054612f379061499c565b905014612f5e57600960008281526020019081526020016000206000612f5d91906137c1565b5b50565b60016000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806130565750613055826136d1565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c490614528565b60405180910390fd5b6130d681611aff565b15613116576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310d906143a8565b60405180910390fd5b613122600083836129c3565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461317291906147b9565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613233600083836129d3565b5050565b505050565b600c80549050600d600083815260200190815260200160002081905550600c81908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016132928461147b565b61329c919061489a565b90506000600b6000848152602001908152602001600020549050818114613381576000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555081600b600083815260200190815260200160002081905550505b600b600084815260200190815260200160002060009055600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600c80549050613406919061489a565b90506000600d60008481526020019081526020016000205490506000600c838154811061345c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600c83815481106134a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600d600083815260200190815260200160002081905550600d600085815260200190815260200160002060009055600c805480613519577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006135408361147b565b905081600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000208190555080600b600084815260200190815260200160002081905550505050565b60006135bf826113c3565b90506135cd816000846129c3565b6135d8600083611b73565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613628919061489a565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136cd816000846129d3565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8280546137479061499c565b90600052602060002090601f01602090048101928261376957600085556137b0565b82601f1061378257805160ff19168380011785556137b0565b828001600101855582156137b0579182015b828111156137af578251825591602001919060010190613794565b5b5090506137bd9190613801565b5090565b5080546137cd9061499c565b6000825580601f106137df57506137fe565b601f0160209004906000526020600020908101906137fd9190613801565b5b50565b5b8082111561381a576000816000905550600101613802565b5090565b600061383161382c846146e8565b6146c3565b9050808382526020820190508285602086028201111561385057600080fd5b60005b8581101561388057816138668882613906565b845260208401935060208301925050600181019050613853565b5050509392505050565b600061389d61389884614714565b6146c3565b9050828152602081018484840111156138b557600080fd5b6138c084828561495a565b509392505050565b60006138db6138d684614745565b6146c3565b9050828152602081018484840111156138f357600080fd5b6138fe84828561495a565b509392505050565b600081359050613915816152e6565b92915050565b600082601f83011261392c57600080fd5b813561393c84826020860161381e565b91505092915050565b600081359050613954816152fd565b92915050565b60008135905061396981615314565b92915050565b60008151905061397e81615314565b92915050565b600082601f83011261399557600080fd5b81356139a584826020860161388a565b91505092915050565b600082601f8301126139bf57600080fd5b81356139cf8482602086016138c8565b91505092915050565b6000813590506139e78161532b565b92915050565b6000813590506139fc81615342565b92915050565b600060208284031215613a1457600080fd5b6000613a2284828501613906565b91505092915050565b60008060408385031215613a3e57600080fd5b6000613a4c85828601613906565b9250506020613a5d85828601613906565b9150509250929050565b600080600060608486031215613a7c57600080fd5b6000613a8a86828701613906565b9350506020613a9b86828701613906565b9250506040613aac868287016139d8565b9150509250925092565b60008060008060808587031215613acc57600080fd5b6000613ada87828801613906565b9450506020613aeb87828801613906565b9350506040613afc878288016139d8565b925050606085013567ffffffffffffffff811115613b1957600080fd5b613b2587828801613984565b91505092959194509250565b60008060408385031215613b4457600080fd5b6000613b5285828601613906565b9250506020613b6385828601613945565b9150509250929050565b60008060408385031215613b8057600080fd5b6000613b8e85828601613906565b9250506020613b9f858286016139d8565b9150509250929050565b600060208284031215613bbb57600080fd5b600082013567ffffffffffffffff811115613bd557600080fd5b613be18482850161391b565b91505092915050565b600060208284031215613bfc57600080fd5b6000613c0a8482850161395a565b91505092915050565b600060208284031215613c2557600080fd5b6000613c338482850161396f565b91505092915050565b600060208284031215613c4e57600080fd5b600082013567ffffffffffffffff811115613c6857600080fd5b613c74848285016139ae565b91505092915050565b600060208284031215613c8f57600080fd5b6000613c9d848285016139d8565b91505092915050565b60008060408385031215613cb957600080fd5b6000613cc7858286016139d8565b9250506020613cd8858286016139d8565b9150509250929050565b600060208284031215613cf457600080fd5b6000613d02848285016139ed565b91505092915050565b613d14816148ce565b82525050565b613d23816148e0565b82525050565b6000613d3482614776565b613d3e818561478c565b9350613d4e818560208601614969565b613d5781614b35565b840191505092915050565b6000613d6d82614781565b613d77818561479d565b9350613d87818560208601614969565b613d9081614b35565b840191505092915050565b6000613da682614781565b613db081856147ae565b9350613dc0818560208601614969565b80840191505092915050565b6000613dd960148361479d565b9150613de482614b46565b602082019050919050565b6000613dfc602b8361479d565b9150613e0782614b6f565b604082019050919050565b6000613e1f60328361479d565b9150613e2a82614bbe565b604082019050919050565b6000613e4260268361479d565b9150613e4d82614c0d565b604082019050919050565b6000613e6560258361479d565b9150613e7082614c5c565b604082019050919050565b6000613e88601c8361479d565b9150613e9382614cab565b602082019050919050565b6000613eab601c8361479d565b9150613eb682614cd4565b602082019050919050565b6000613ece60248361479d565b9150613ed982614cfd565b604082019050919050565b6000613ef160198361479d565b9150613efc82614d4c565b602082019050919050565b6000613f14602c8361479d565b9150613f1f82614d75565b604082019050919050565b6000613f3760108361479d565b9150613f4282614dc4565b602082019050919050565b6000613f5a60108361479d565b9150613f6582614ded565b602082019050919050565b6000613f7d60388361479d565b9150613f8882614e16565b604082019050919050565b6000613fa060268361479d565b9150613fab82614e65565b604082019050919050565b6000613fc3602a8361479d565b9150613fce82614eb4565b604082019050919050565b6000613fe660298361479d565b9150613ff182614f03565b604082019050919050565b6000614009602e8361479d565b915061401482614f52565b604082019050919050565b600061402c60208361479d565b915061403782614fa1565b602082019050919050565b600061404f60318361479d565b915061405a82614fca565b604082019050919050565b6000614072602c8361479d565b915061407d82615019565b604082019050919050565b60006140956005836147ae565b91506140a082615068565b600582019050919050565b60006140b860208361479d565b91506140c382615091565b602082019050919050565b60006140db602f8361479d565b91506140e6826150ba565b604082019050919050565b60006140fe60218361479d565b915061410982615109565b604082019050919050565b600061412160318361479d565b915061412c82615158565b604082019050919050565b6000614144602c8361479d565b915061414f826151a7565b604082019050919050565b600061416760158361479d565b9150614172826151f6565b602082019050919050565b600061418a602a8361479d565b91506141958261521f565b604082019050919050565b60006141ad60308361479d565b91506141b88261526e565b604082019050919050565b60006141d060198361479d565b91506141db826152bd565b602082019050919050565b6141ef81614938565b82525050565b60006142018285613d9b565b915061420d8284613d9b565b91508190509392505050565b60006142258284613d9b565b915061423082614088565b915081905092915050565b60006020820190506142506000830184613d0b565b92915050565b600060808201905061426b6000830187613d0b565b6142786020830186613d0b565b61428560408301856141e6565b81810360608301526142978184613d29565b905095945050505050565b60006040820190506142b76000830185613d0b565b6142c460208301846141e6565b9392505050565b60006020820190506142e06000830184613d1a565b92915050565b600060208201905081810360008301526143008184613d62565b905092915050565b6000602082019050818103600083015261432181613dcc565b9050919050565b6000602082019050818103600083015261434181613def565b9050919050565b6000602082019050818103600083015261436181613e12565b9050919050565b6000602082019050818103600083015261438181613e35565b9050919050565b600060208201905081810360008301526143a181613e58565b9050919050565b600060208201905081810360008301526143c181613e7b565b9050919050565b600060208201905081810360008301526143e181613e9e565b9050919050565b6000602082019050818103600083015261440181613ec1565b9050919050565b6000602082019050818103600083015261442181613ee4565b9050919050565b6000602082019050818103600083015261444181613f07565b9050919050565b6000602082019050818103600083015261446181613f2a565b9050919050565b6000602082019050818103600083015261448181613f4d565b9050919050565b600060208201905081810360008301526144a181613f70565b9050919050565b600060208201905081810360008301526144c181613f93565b9050919050565b600060208201905081810360008301526144e181613fb6565b9050919050565b6000602082019050818103600083015261450181613fd9565b9050919050565b6000602082019050818103600083015261452181613ffc565b9050919050565b600060208201905081810360008301526145418161401f565b9050919050565b6000602082019050818103600083015261456181614042565b9050919050565b6000602082019050818103600083015261458181614065565b9050919050565b600060208201905081810360008301526145a1816140ab565b9050919050565b600060208201905081810360008301526145c1816140ce565b9050919050565b600060208201905081810360008301526145e1816140f1565b9050919050565b6000602082019050818103600083015261460181614114565b9050919050565b6000602082019050818103600083015261462181614137565b9050919050565b600060208201905081810360008301526146418161415a565b9050919050565b600060208201905081810360008301526146618161417d565b9050919050565b60006020820190508181036000830152614681816141a0565b9050919050565b600060208201905081810360008301526146a1816141c3565b9050919050565b60006020820190506146bd60008301846141e6565b92915050565b60006146cd6146de565b90506146d982826149ce565b919050565b6000604051905090565b600067ffffffffffffffff82111561470357614702614b06565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561472f5761472e614b06565b5b61473882614b35565b9050602081019050919050565b600067ffffffffffffffff8211156147605761475f614b06565b5b61476982614b35565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006147c482614938565b91506147cf83614938565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561480457614803614a79565b5b828201905092915050565b600061481a82614938565b915061482583614938565b92508261483557614834614aa8565b5b828204905092915050565b600061484b82614938565b915061485683614938565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561488f5761488e614a79565b5b828202905092915050565b60006148a582614938565b91506148b083614938565b9250828210156148c3576148c2614a79565b5b828203905092915050565b60006148d982614918565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561498757808201518184015260208101905061496c565b83811115614996576000848401525b50505050565b600060028204905060018216806149b457607f821691505b602082108114156149c8576149c7614ad7565b5b50919050565b6149d782614b35565b810181811067ffffffffffffffff821117156149f6576149f5614b06565b5b80604052505050565b6000614a0a82614938565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a3d57614a3c614a79565b5b600182019050919050565b6000614a5382614938565b9150614a5e83614938565b925082614a6e57614a6d614aa8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f53616c6520776f756c6420657863656564206d617820737570706c7900000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6f7420696e2077686974656c69737400000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4f6e652077616c6c657420616464726573732063616e206f6e6c79206d696e7460008201527f2031204e46540000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6152ef816148ce565b81146152fa57600080fd5b50565b615306816148e0565b811461531157600080fd5b50565b61531d816148ec565b811461532857600080fd5b50565b61533481614938565b811461533f57600080fd5b50565b61534b81614942565b811461535657600080fd5b5056fea2646970667358221220072e8b595eb5765f48834f4350c029cb67a60e694ebd07f47cabe5d5a5fc349664736f6c63430008040033

Deployed Bytecode Sourcemap

58791:3942:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62486:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35083:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36643:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36166:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61893:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60445:588;;;:::i;:::-;;50412:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37393:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23420:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;50080:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61666:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60031:65;;;;;;;;;;;;;:::i;:::-;;59410:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59473:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37803:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56456:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59864:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61354:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50602:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8177:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34777:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59341:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34507:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6228:103;;;;;;;;;;;;;:::i;:::-;;61466:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59962:61;;;;;;;;;;;;;:::i;:::-;;5577:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35252:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36936:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38059:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62282:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59199:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37162:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6486:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60333:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62486:244;62657:4;62686:36;62710:11;62686:23;:36::i;:::-;62679:43;;62486:244;;;:::o;35083:100::-;35137:13;35170:5;35163:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35083:100;:::o;36643:221::-;36719:7;36747:16;36755:7;36747;:16::i;:::-;36739:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36832:15;:24;36848:7;36832:24;;;;;;;;;;;;;;;;;;;;;36825:31;;36643:221;;;:::o;36166:411::-;36247:13;36263:23;36278:7;36263:14;:23::i;:::-;36247:39;;36311:5;36305:11;;:2;:11;;;;36297:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;36405:5;36389:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;36414:37;36431:5;36438:12;:10;:12::i;:::-;36414:16;:37::i;:::-;36389:62;36367:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;36548:21;36557:2;36561:7;36548:8;:21::i;:::-;36166:411;;;:::o;61893:150::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61983:52:::1;62002:10;;;;;;;;;;;62014:20;61983:18;:52::i;:::-;61893:150:::0;:::o;60445:588::-;60487:16;60506:1;60487:20;;59235:6;60552:8;60540:9;;:20;;;;:::i;:::-;:33;;60518:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;60672:9;60659;;60648:8;:20;;;;:::i;:::-;:33;;60640:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;60736:7;:5;:7::i;:::-;60722:21;;:10;:21;;;60718:260;;60800:4;60768:36;;:16;:28;60785:10;60768:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;60760:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;60891:1;60866:21;60876:10;60866:9;:21::i;:::-;:26;60840:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;60718:260;61003:1;60990:9;;:14;;;;;;;:::i;:::-;;;;;;;;61015:10;:8;:10::i;:::-;60445:588;:::o;50412:113::-;50473:7;50500:10;:17;;;;50493:24;;50412:113;:::o;37393:339::-;37588:41;37607:12;:10;:12::i;:::-;37621:7;37588:18;:41::i;:::-;37580:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37696:28;37706:4;37712:2;37716:7;37696:9;:28::i;:::-;37393:339;;;:::o;23420:442::-;23517:7;23526;23546:26;23575:17;:27;23593:8;23575:27;;;;;;;;;;;23546:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23647:1;23619:30;;:7;:16;;;:30;;;23615:92;;;23676:19;23666:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23615:92;23719:21;23784:17;:15;:17::i;:::-;23743:58;;23757:7;:23;;;23744:36;;:10;:36;;;;:::i;:::-;23743:58;;;;:::i;:::-;23719:82;;23822:7;:16;;;23840:13;23814:40;;;;;;23420:442;;;;;:::o;50080:256::-;50177:7;50213:23;50230:5;50213:16;:23::i;:::-;50205:5;:31;50197:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;50302:12;:19;50315:5;50302:19;;;;;;;;;;;;;;;:26;50322:5;50302:26;;;;;;;;;;;;50295:33;;50080:256;;;;:::o;61666:107::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61738:27:::1;61759:5;61738:20;:27::i;:::-;61666:107:::0;:::o;60031:65::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60078:10:::1;:8;:10::i;:::-;60031:65::o:0;59410:28::-;;;;:::o;59473:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;37803:185::-;37941:39;37958:4;37964:2;37968:7;37941:39;;;;;;;;;;;;:16;:39::i;:::-;37803:185;;;:::o;56456:245::-;56574:41;56593:12;:10;:12::i;:::-;56607:7;56574:18;:41::i;:::-;56566:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;56679:14;56685:7;56679:5;:14::i;:::-;56456:245;:::o;59864:90::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59943:3:::1;59933:7;:13;;;;;;;;;;;;:::i;:::-;;59864:90:::0;:::o;61354:104::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61446:4:::1;61420:16;:23;61437:5;61420:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;61354:104:::0;:::o;50602:233::-;50677:7;50713:30;:28;:30::i;:::-;50705:5;:38;50697:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;50810:10;50821:5;50810:17;;;;;;;;;;;;;;;;;;;;;;;;50803:24;;50602:233;;;:::o;8177:86::-;8224:4;8248:7;;;;;;;;;;;8241:14;;8177:86;:::o;34777:239::-;34849:7;34869:13;34885:7;:16;34893:7;34885:16;;;;;;;;;;;;;;;;;;;;;34869:32;;34937:1;34920:19;;:5;:19;;;;34912:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35003:5;34996:12;;;34777:239;;;:::o;59341:28::-;;;;:::o;34507:208::-;34579:7;34624:1;34607:19;;:5;:19;;;;34599:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34691:9;:16;34701:5;34691:16;;;;;;;;;;;;;;;;34684:23;;34507:208;;;:::o;6228:103::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6293:30:::1;6320:1;6293:18;:30::i;:::-;6228:103::o:0;61466:192::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61553:9:::1;61548:103;61572:5;:12;61568:1;:16;61548:103;;;61635:4;61606:16;:26;61623:5;61629:1;61623:8;;;;;;;;;;;;;;;;;;;;;;61606:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;61586:3;;;;;:::i;:::-;;;;61548:103;;;;61466:192:::0;:::o;59962:61::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60007:8:::1;:6;:8::i;:::-;59962:61::o:0;5577:87::-;5623:7;5650:6;;;;;;;;;;;5643:13;;5577:87;:::o;35252:104::-;35308:13;35341:7;35334:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35252:104;:::o;36936:155::-;37031:52;37050:12;:10;:12::i;:::-;37064:8;37074;37031:18;:52::i;:::-;36936:155;;:::o;38059:328::-;38234:41;38253:12;:10;:12::i;:::-;38267:7;38234:18;:41::i;:::-;38226:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38340:39;38354:4;38360:2;38364:7;38373:5;38340:13;:39::i;:::-;38059:328;;;;:::o;62282:196::-;62409:13;62447:23;62462:7;62447:14;:23::i;:::-;62440:30;;62282:196;;;:::o;59199:42::-;59235:6;59199:42;:::o;37162:164::-;37259:4;37283:18;:25;37302:5;37283:25;;;;;;;;;;;;;;;:35;37309:8;37283:35;;;;;;;;;;;;;;;;;;;;;;;;;37276:42;;37162:164;;;;:::o;6486:201::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6595:1:::1;6575:22;;:8;:22;;;;6567:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6651:28;6670:8;6651:18;:28::i;:::-;6486:201:::0;:::o;60333:104::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60417:12:::1;60405:9;:24;;;;60333:104:::0;:::o;1027:127::-;1134:1;1116:7;:14;;;:19;;;;;;;;;;;1027:127;:::o;48317:170::-;48419:4;48443:36;48467:11;48443:23;:36::i;:::-;48436:43;;48317:170;;;:::o;39897:127::-;39962:4;40014:1;39986:30;;:7;:16;39994:7;39986:16;;;;;;;;;;;;;;;;;;;;;:30;;;;39979:37;;39897:127;;;:::o;4301:98::-;4354:7;4381:10;4374:17;;4301:98;:::o;44043:174::-;44145:2;44118:15;:24;44134:7;44118:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44201:7;44197:2;44163:46;;44172:23;44187:7;44172:14;:23::i;:::-;44163:46;;;;;;;;;;;;44043:174;;:::o;24512:332::-;24631:17;:15;:17::i;:::-;24615:33;;:12;:33;;;;24607:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;24734:1;24714:22;;:8;:22;;;;24706:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;24801:35;;;;;;;;24813:8;24801:35;;;;;;24823:12;24801:35;;;;;24779:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24512:332;;:::o;61045:301::-;61086:15;61104:25;:15;:23;:25::i;:::-;61086:43;;61140:27;:15;:25;:27::i;:::-;61178:30;61188:10;61200:7;61178:9;:30::i;:::-;61219:76;61232:7;61265:18;:7;:16;:18::i;:::-;61248:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;61219:12;:76::i;:::-;61306:32;61327:10;61306:20;:32::i;:::-;61045:301;:::o;40191:348::-;40284:4;40309:16;40317:7;40309;:16::i;:::-;40301:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40385:13;40401:23;40416:7;40401:14;:23::i;:::-;40385:39;;40454:5;40443:16;;:7;:16;;;:52;;;;40463:32;40480:5;40487:7;40463:16;:32::i;:::-;40443:52;:87;;;;40523:7;40499:31;;:20;40511:7;40499:11;:20::i;:::-;:31;;;40443:87;40435:96;;;40191:348;;;;:::o;43300:625::-;43459:4;43432:31;;:23;43447:7;43432:14;:23::i;:::-;:31;;;43424:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;43538:1;43524:16;;:2;:16;;;;43516:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43594:39;43615:4;43621:2;43625:7;43594:20;:39::i;:::-;43698:29;43715:1;43719:7;43698:8;:29::i;:::-;43759:1;43740:9;:15;43750:4;43740:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43788:1;43771:9;:13;43781:2;43771:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43819:2;43800:7;:16;43808:7;43800:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43858:7;43854:2;43839:27;;43848:4;43839:27;;;;;;;;;;;;43879:38;43899:4;43905:2;43909:7;43879:19;:38::i;:::-;43300:625;;;:::o;24144:97::-;24202:6;24228:5;24221:12;;24144:97;:::o;61781:104::-;61872:5;61846:16;:23;61863:5;61846:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;61781:104;:::o;9236:120::-;8780:8;:6;:8::i;:::-;8772:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;9305:5:::1;9295:7;;:15;;;;;;;;;;;;;;;;;;9326:22;9335:12;:10;:12::i;:::-;9326:22;;;;;;:::i;:::-;;;;;;;;9236:120::o:0;60172:153::-;60297:20;60309:7;60297:11;:20::i;:::-;60172:153;:::o;6847:191::-;6921:16;6940:6;;;;;;;;;;;6921:25;;6966:8;6957:6;;:17;;;;;;;;;;;;;;;;;;7021:8;6990:40;;7011:8;6990:40;;;;;;;;;;;;6847:191;;:::o;8977:118::-;8503:8;:6;:8::i;:::-;8502:9;8494:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;9047:4:::1;9037:7;;:14;;;;;;;;;;;;;;;;;;9067:20;9074:12;:10;:12::i;:::-;9067:20;;;;;;:::i;:::-;;;;;;;;8977:118::o:0;44359:315::-;44514:8;44505:17;;:5;:17;;;;44497:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;44601:8;44563:18;:25;44582:5;44563:25;;;;;;;;;;;;;;;:35;44589:8;44563:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;44647:8;44625:41;;44640:5;44625:41;;;44657:8;44625:41;;;;;;:::i;:::-;;;;;;;;44359:315;;;:::o;39269:::-;39426:28;39436:4;39442:2;39446:7;39426:9;:28::i;:::-;39473:48;39496:4;39502:2;39506:7;39515:5;39473:22;:48::i;:::-;39465:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;39269:315;;;;:::o;57219:679::-;57292:13;57326:16;57334:7;57326;:16::i;:::-;57318:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;57409:23;57435:10;:19;57446:7;57435:19;;;;;;;;;;;57409:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57465:18;57486:10;:8;:10::i;:::-;57465:31;;57594:1;57578:4;57572:18;:23;57568:72;;;57619:9;57612:16;;;;;;57568:72;57770:1;57750:9;57744:23;:27;57740:108;;;57819:4;57825:9;57802:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57788:48;;;;;;57740:108;57867:23;57882:7;57867:14;:23::i;:::-;57860:30;;;;57219:679;;;;:::o;49772:224::-;49874:4;49913:35;49898:50;;;:11;:50;;;;:90;;;;49952:36;49976:11;49952:23;:36::i;:::-;49898:90;49891:97;;49772:224;;;:::o;905:114::-;970:7;997;:14;;;990:21;;905:114;;;:::o;40881:110::-;40957:26;40967:2;40971:7;40957:26;;;;;;;;;;;;:9;:26::i;:::-;40881:110;;:::o;1863:723::-;1919:13;2149:1;2140:5;:10;2136:53;;;2167:10;;;;;;;;;;;;;;;;;;;;;2136:53;2199:12;2214:5;2199:20;;2230:14;2255:78;2270:1;2262:4;:9;2255:78;;2288:8;;;;;:::i;:::-;;;;2319:2;2311:10;;;;;:::i;:::-;;;2255:78;;;2343:19;2375:6;2365:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2343:39;;2393:154;2409:1;2400:5;:10;2393:154;;2437:1;2427:11;;;;;:::i;:::-;;;2504:2;2496:5;:10;;;;:::i;:::-;2483:2;:24;;;;:::i;:::-;2470:39;;2453:6;2460;2453:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;2533:2;2524:11;;;;;:::i;:::-;;;2393:154;;;2571:6;2557:21;;;;;1863:723;;;;:::o;58054:217::-;58154:16;58162:7;58154;:16::i;:::-;58146:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;58254:9;58232:10;:19;58243:7;58232:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;58054:217;;:::o;62051:223::-;62221:45;62248:4;62254:2;62258:7;62221:26;:45::i;:::-;62051:223;;;:::o;47121:125::-;;;;:::o;48619:135::-;48688:20;48700:7;48688:11;:20::i;:::-;48719:27;48738:7;48719:18;:27::i;:::-;48619:135;:::o;45239:799::-;45394:4;45415:15;:2;:13;;;:15::i;:::-;45411:620;;;45467:2;45451:36;;;45488:12;:10;:12::i;:::-;45502:4;45508:7;45517:5;45451:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45447:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45710:1;45693:6;:13;:18;45689:272;;;45736:60;;;;;;;;;;:::i;:::-;;;;;;;;45689:272;45911:6;45905:13;45896:6;45892:2;45888:15;45881:38;45447:529;45584:41;;;45574:51;;;:6;:51;;;;45567:58;;;;;45411:620;46015:4;46008:11;;45239:799;;;;;;;:::o;59696:100::-;59748:13;59781:7;59774:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59696:100;:::o;35427:334::-;35500:13;35534:16;35542:7;35534;:16::i;:::-;35526:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;35615:21;35639:10;:8;:10::i;:::-;35615:34;;35691:1;35673:7;35667:21;:25;:86;;;;;;;;;;;;;;;;;35719:7;35728:18;:7;:16;:18::i;:::-;35702:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35667:86;35660:93;;;35427:334;;;:::o;34138:305::-;34240:4;34292:25;34277:40;;;:11;:40;;;;:105;;;;34349:33;34334:48;;;:11;:48;;;;34277:105;:158;;;;34399:36;34423:11;34399:23;:36::i;:::-;34277:158;34257:178;;34138:305;;;:::o;41218:321::-;41348:18;41354:2;41358:7;41348:5;:18::i;:::-;41399:54;41430:1;41434:2;41438:7;41447:5;41399:22;:54::i;:::-;41377:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;41218:321;;;:::o;51448:589::-;51592:45;51619:4;51625:2;51629:7;51592:26;:45::i;:::-;51670:1;51654:18;;:4;:18;;;51650:187;;;51689:40;51721:7;51689:31;:40::i;:::-;51650:187;;;51759:2;51751:10;;:4;:10;;;51747:90;;51778:47;51811:4;51817:7;51778:32;:47::i;:::-;51747:90;51650:187;51865:1;51851:16;;:2;:16;;;51847:183;;;51884:45;51921:7;51884:36;:45::i;:::-;51847:183;;;51957:4;51951:10;;:2;:10;;;51947:83;;51978:40;52006:2;52010:7;51978:27;:40::i;:::-;51947:83;51847:183;51448:589;;;:::o;58500:206::-;58569:20;58581:7;58569:11;:20::i;:::-;58643:1;58612:10;:19;58623:7;58612:19;;;;;;;;;;;58606:33;;;;;:::i;:::-;;;:38;58602:97;;58668:10;:19;58679:7;58668:19;;;;;;;;;;;;58661:26;;;;:::i;:::-;58602:97;58500:206;:::o;25840:114::-;25920:17;:26;25938:7;25920:26;;;;;;;;;;;;25913:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25840:114;:::o;10596:326::-;10656:4;10913:1;10891:7;:19;;;:23;10884:30;;10596:326;;;:::o;23150:215::-;23252:4;23291:26;23276:41;;;:11;:41;;;;:81;;;;23321:36;23345:11;23321:23;:36::i;:::-;23276:81;23269:88;;23150:215;;;:::o;41875:439::-;41969:1;41955:16;;:2;:16;;;;41947:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42028:16;42036:7;42028;:16::i;:::-;42027:17;42019:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42090:45;42119:1;42123:2;42127:7;42090:20;:45::i;:::-;42165:1;42148:9;:13;42158:2;42148:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42196:2;42177:7;:16;42185:7;42177:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42241:7;42237:2;42216:33;;42233:1;42216:33;;;;;;;;;;;;42262:44;42290:1;42294:2;42298:7;42262:19;:44::i;:::-;41875:439;;:::o;46610:126::-;;;;:::o;52760:164::-;52864:10;:17;;;;52837:15;:24;52853:7;52837:24;;;;;;;;;;;:44;;;;52892:10;52908:7;52892:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52760:164;:::o;53551:988::-;53817:22;53867:1;53842:22;53859:4;53842:16;:22::i;:::-;:26;;;;:::i;:::-;53817:51;;53879:18;53900:17;:26;53918:7;53900:26;;;;;;;;;;;;53879:47;;54047:14;54033:10;:28;54029:328;;54078:19;54100:12;:18;54113:4;54100:18;;;;;;;;;;;;;;;:34;54119:14;54100:34;;;;;;;;;;;;54078:56;;54184:11;54151:12;:18;54164:4;54151:18;;;;;;;;;;;;;;;:30;54170:10;54151:30;;;;;;;;;;;:44;;;;54301:10;54268:17;:30;54286:11;54268:30;;;;;;;;;;;:43;;;;54029:328;;54453:17;:26;54471:7;54453:26;;;;;;;;;;;54446:33;;;54497:12;:18;54510:4;54497:18;;;;;;;;;;;;;;;:34;54516:14;54497:34;;;;;;;;;;;54490:41;;;53551:988;;;;:::o;54834:1079::-;55087:22;55132:1;55112:10;:17;;;;:21;;;;:::i;:::-;55087:46;;55144:18;55165:15;:24;55181:7;55165:24;;;;;;;;;;;;55144:45;;55516:19;55538:10;55549:14;55538:26;;;;;;;;;;;;;;;;;;;;;;;;55516:48;;55602:11;55577:10;55588;55577:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;55713:10;55682:15;:28;55698:11;55682:28;;;;;;;;;;;:41;;;;55854:15;:24;55870:7;55854:24;;;;;;;;;;;55847:31;;;55889:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54834:1079;;;;:::o;52338:221::-;52423:14;52440:20;52457:2;52440:16;:20::i;:::-;52423:37;;52498:7;52471:12;:16;52484:2;52471:16;;;;;;;;;;;;;;;:24;52488:6;52471:24;;;;;;;;;;;:34;;;;52545:6;52516:17;:26;52534:7;52516:26;;;;;;;;;;;:35;;;;52338:221;;;:::o;42543:420::-;42603:13;42619:23;42634:7;42619:14;:23::i;:::-;42603:39;;42655:48;42676:5;42691:1;42695:7;42655:20;:48::i;:::-;42744:29;42761:1;42765:7;42744:8;:29::i;:::-;42806:1;42786:9;:16;42796:5;42786:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;42825:7;:16;42833:7;42825:16;;;;;;;;;;;;42818:23;;;;;;;;;;;42887:7;42883:1;42859:36;;42868:5;42859:36;;;;;;;;;;;;42908:47;42928:5;42943:1;42947:7;42908:19;:47::i;:::-;42543:420;;:::o;21600:157::-;21685:4;21724:25;21709:40;;;:11;:40;;;;21702:47;;21600:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655: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:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:345::-;1112:5;1137:66;1153:49;1195:6;1153:49;:::i;:::-;1137:66;:::i;:::-;1128:75;;1226:6;1219:5;1212:21;1264:4;1257:5;1253:16;1302:3;1293:6;1288:3;1284:16;1281:25;1278:2;;;1319:1;1316;1309:12;1278:2;1332:41;1366:6;1361:3;1356;1332:41;:::i;:::-;1118:261;;;;;;:::o;1385:139::-;1431:5;1469:6;1456:20;1447:29;;1485:33;1512:5;1485:33;:::i;:::-;1437:87;;;;:::o;1547:303::-;1618:5;1667:3;1660:4;1652:6;1648:17;1644:27;1634:2;;1685:1;1682;1675:12;1634:2;1725:6;1712:20;1750:94;1840:3;1832:6;1825:4;1817:6;1813:17;1750:94;:::i;:::-;1741:103;;1624:226;;;;;:::o;1856:133::-;1899:5;1937:6;1924:20;1915:29;;1953:30;1977:5;1953:30;:::i;:::-;1905:84;;;;:::o;1995:137::-;2040:5;2078:6;2065:20;2056:29;;2094:32;2120:5;2094:32;:::i;:::-;2046:86;;;;:::o;2138:141::-;2194:5;2225:6;2219:13;2210:22;;2241:32;2267:5;2241:32;:::i;:::-;2200:79;;;;:::o;2298:271::-;2353:5;2402:3;2395:4;2387:6;2383:17;2379:27;2369:2;;2420:1;2417;2410:12;2369:2;2460:6;2447:20;2485:78;2559:3;2551:6;2544:4;2536:6;2532:17;2485:78;:::i;:::-;2476:87;;2359:210;;;;;:::o;2589:273::-;2645:5;2694:3;2687:4;2679:6;2675:17;2671:27;2661:2;;2712:1;2709;2702:12;2661:2;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2651:211;;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2920:87;;;;:::o;3013:137::-;3058:5;3096:6;3083:20;3074:29;;3112:32;3138:5;3112:32;:::i;:::-;3064:86;;;;:::o;3156:262::-;3215:6;3264:2;3252:9;3243:7;3239:23;3235:32;3232:2;;;3280:1;3277;3270:12;3232:2;3323:1;3348:53;3393:7;3384:6;3373:9;3369:22;3348:53;:::i;:::-;3338:63;;3294:117;3222:196;;;;:::o;3424:407::-;3492:6;3500;3549:2;3537:9;3528:7;3524:23;3520:32;3517:2;;;3565:1;3562;3555:12;3517:2;3608:1;3633:53;3678:7;3669:6;3658:9;3654:22;3633:53;:::i;:::-;3623:63;;3579:117;3735:2;3761:53;3806:7;3797:6;3786:9;3782:22;3761:53;:::i;:::-;3751:63;;3706:118;3507:324;;;;;:::o;3837:552::-;3914:6;3922;3930;3979:2;3967:9;3958:7;3954:23;3950:32;3947:2;;;3995:1;3992;3985:12;3947:2;4038:1;4063:53;4108:7;4099:6;4088:9;4084:22;4063:53;:::i;:::-;4053:63;;4009:117;4165:2;4191:53;4236:7;4227:6;4216:9;4212:22;4191:53;:::i;:::-;4181:63;;4136:118;4293:2;4319:53;4364:7;4355:6;4344:9;4340:22;4319:53;:::i;:::-;4309:63;;4264:118;3937:452;;;;;:::o;4395:809::-;4490:6;4498;4506;4514;4563:3;4551:9;4542:7;4538:23;4534:33;4531:2;;;4580:1;4577;4570:12;4531:2;4623:1;4648:53;4693:7;4684:6;4673:9;4669:22;4648:53;:::i;:::-;4638:63;;4594:117;4750:2;4776:53;4821:7;4812:6;4801:9;4797:22;4776:53;:::i;:::-;4766:63;;4721:118;4878:2;4904:53;4949:7;4940:6;4929:9;4925:22;4904:53;:::i;:::-;4894:63;;4849:118;5034:2;5023:9;5019:18;5006:32;5065:18;5057:6;5054:30;5051:2;;;5097:1;5094;5087:12;5051:2;5125:62;5179:7;5170:6;5159:9;5155:22;5125:62;:::i;:::-;5115:72;;4977:220;4521:683;;;;;;;:::o;5210:401::-;5275:6;5283;5332:2;5320:9;5311:7;5307:23;5303:32;5300:2;;;5348:1;5345;5338:12;5300:2;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:50;5586:7;5577:6;5566:9;5562:22;5544:50;:::i;:::-;5534:60;;5489:115;5290:321;;;;;:::o;5617:407::-;5685:6;5693;5742:2;5730:9;5721:7;5717:23;5713:32;5710:2;;;5758:1;5755;5748:12;5710:2;5801:1;5826:53;5871:7;5862:6;5851:9;5847:22;5826:53;:::i;:::-;5816:63;;5772:117;5928:2;5954:53;5999:7;5990:6;5979:9;5975:22;5954:53;:::i;:::-;5944:63;;5899:118;5700:324;;;;;:::o;6030:405::-;6114:6;6163:2;6151:9;6142:7;6138:23;6134:32;6131:2;;;6179:1;6176;6169:12;6131:2;6250:1;6239:9;6235:17;6222:31;6280:18;6272:6;6269:30;6266:2;;;6312:1;6309;6302:12;6266:2;6340:78;6410:7;6401:6;6390:9;6386:22;6340:78;:::i;:::-;6330:88;;6193:235;6121:314;;;;:::o;6441:260::-;6499:6;6548:2;6536:9;6527:7;6523:23;6519:32;6516:2;;;6564:1;6561;6554:12;6516:2;6607:1;6632:52;6676:7;6667:6;6656:9;6652:22;6632:52;:::i;:::-;6622:62;;6578:116;6506:195;;;;:::o;6707:282::-;6776:6;6825:2;6813:9;6804:7;6800:23;6796:32;6793:2;;;6841:1;6838;6831:12;6793:2;6884:1;6909:63;6964:7;6955:6;6944:9;6940:22;6909:63;:::i;:::-;6899:73;;6855:127;6783:206;;;;:::o;6995:375::-;7064:6;7113:2;7101:9;7092:7;7088:23;7084:32;7081:2;;;7129:1;7126;7119:12;7081:2;7200:1;7189:9;7185:17;7172:31;7230:18;7222:6;7219:30;7216:2;;;7262:1;7259;7252:12;7216:2;7290:63;7345:7;7336:6;7325:9;7321:22;7290:63;:::i;:::-;7280:73;;7143:220;7071:299;;;;:::o;7376:262::-;7435:6;7484:2;7472:9;7463:7;7459:23;7455:32;7452:2;;;7500:1;7497;7490:12;7452:2;7543:1;7568:53;7613:7;7604:6;7593:9;7589:22;7568:53;:::i;:::-;7558:63;;7514:117;7442:196;;;;:::o;7644:407::-;7712:6;7720;7769:2;7757:9;7748:7;7744:23;7740:32;7737:2;;;7785:1;7782;7775:12;7737:2;7828:1;7853:53;7898:7;7889:6;7878:9;7874:22;7853:53;:::i;:::-;7843:63;;7799:117;7955:2;7981:53;8026:7;8017:6;8006:9;8002:22;7981:53;:::i;:::-;7971:63;;7926:118;7727:324;;;;;:::o;8057:260::-;8115:6;8164:2;8152:9;8143:7;8139:23;8135:32;8132:2;;;8180:1;8177;8170:12;8132:2;8223:1;8248:52;8292:7;8283:6;8272:9;8268:22;8248:52;:::i;:::-;8238:62;;8194:116;8122:195;;;;:::o;8323:118::-;8410:24;8428:5;8410:24;:::i;:::-;8405:3;8398:37;8388:53;;:::o;8447:109::-;8528:21;8543:5;8528:21;:::i;:::-;8523:3;8516:34;8506:50;;:::o;8562:360::-;8648:3;8676:38;8708:5;8676:38;:::i;:::-;8730:70;8793:6;8788:3;8730:70;:::i;:::-;8723:77;;8809:52;8854:6;8849:3;8842:4;8835:5;8831:16;8809:52;:::i;:::-;8886:29;8908:6;8886:29;:::i;:::-;8881:3;8877:39;8870:46;;8652:270;;;;;:::o;8928:364::-;9016:3;9044:39;9077:5;9044:39;:::i;:::-;9099:71;9163:6;9158:3;9099:71;:::i;:::-;9092:78;;9179:52;9224:6;9219:3;9212:4;9205:5;9201:16;9179:52;:::i;:::-;9256:29;9278:6;9256:29;:::i;:::-;9251:3;9247:39;9240:46;;9020:272;;;;;:::o;9298:377::-;9404:3;9432:39;9465:5;9432:39;:::i;:::-;9487:89;9569:6;9564:3;9487:89;:::i;:::-;9480:96;;9585:52;9630:6;9625:3;9618:4;9611:5;9607:16;9585:52;:::i;:::-;9662:6;9657:3;9653:16;9646:23;;9408:267;;;;;:::o;9681:366::-;9823:3;9844:67;9908:2;9903:3;9844:67;:::i;:::-;9837:74;;9920:93;10009:3;9920:93;:::i;:::-;10038:2;10033:3;10029:12;10022:19;;9827:220;;;:::o;10053:366::-;10195:3;10216:67;10280:2;10275:3;10216:67;:::i;:::-;10209:74;;10292:93;10381:3;10292:93;:::i;:::-;10410:2;10405:3;10401:12;10394:19;;10199:220;;;:::o;10425:366::-;10567:3;10588:67;10652:2;10647:3;10588:67;:::i;:::-;10581:74;;10664:93;10753:3;10664:93;:::i;:::-;10782:2;10777:3;10773:12;10766:19;;10571:220;;;:::o;10797:366::-;10939:3;10960:67;11024:2;11019:3;10960:67;:::i;:::-;10953:74;;11036:93;11125:3;11036:93;:::i;:::-;11154:2;11149:3;11145:12;11138:19;;10943:220;;;:::o;11169:366::-;11311:3;11332:67;11396:2;11391:3;11332:67;:::i;:::-;11325:74;;11408:93;11497:3;11408:93;:::i;:::-;11526:2;11521:3;11517:12;11510:19;;11315:220;;;:::o;11541:366::-;11683:3;11704:67;11768:2;11763:3;11704:67;:::i;:::-;11697:74;;11780:93;11869:3;11780:93;:::i;:::-;11898:2;11893:3;11889:12;11882:19;;11687:220;;;:::o;11913:366::-;12055:3;12076:67;12140:2;12135:3;12076:67;:::i;:::-;12069:74;;12152:93;12241:3;12152:93;:::i;:::-;12270:2;12265:3;12261:12;12254:19;;12059:220;;;:::o;12285:366::-;12427:3;12448:67;12512:2;12507:3;12448:67;:::i;:::-;12441:74;;12524:93;12613:3;12524:93;:::i;:::-;12642:2;12637:3;12633:12;12626:19;;12431:220;;;:::o;12657:366::-;12799:3;12820:67;12884:2;12879:3;12820:67;:::i;:::-;12813:74;;12896:93;12985:3;12896:93;:::i;:::-;13014:2;13009:3;13005:12;12998:19;;12803:220;;;:::o;13029:366::-;13171:3;13192:67;13256:2;13251:3;13192:67;:::i;:::-;13185:74;;13268:93;13357:3;13268:93;:::i;:::-;13386:2;13381:3;13377:12;13370:19;;13175:220;;;:::o;13401:366::-;13543:3;13564:67;13628:2;13623:3;13564:67;:::i;:::-;13557:74;;13640:93;13729:3;13640:93;:::i;:::-;13758:2;13753:3;13749:12;13742:19;;13547:220;;;:::o;13773:366::-;13915:3;13936:67;14000:2;13995:3;13936:67;:::i;:::-;13929:74;;14012:93;14101:3;14012:93;:::i;:::-;14130:2;14125:3;14121:12;14114:19;;13919:220;;;:::o;14145:366::-;14287:3;14308:67;14372:2;14367:3;14308:67;:::i;:::-;14301:74;;14384:93;14473:3;14384:93;:::i;:::-;14502:2;14497:3;14493:12;14486:19;;14291:220;;;:::o;14517:366::-;14659:3;14680:67;14744:2;14739:3;14680:67;:::i;:::-;14673:74;;14756:93;14845:3;14756:93;:::i;:::-;14874:2;14869:3;14865:12;14858:19;;14663:220;;;:::o;14889:366::-;15031:3;15052:67;15116:2;15111:3;15052:67;:::i;:::-;15045:74;;15128:93;15217:3;15128:93;:::i;:::-;15246:2;15241:3;15237:12;15230:19;;15035:220;;;:::o;15261:366::-;15403:3;15424:67;15488:2;15483:3;15424:67;:::i;:::-;15417:74;;15500:93;15589:3;15500:93;:::i;:::-;15618:2;15613:3;15609:12;15602:19;;15407:220;;;:::o;15633:366::-;15775:3;15796:67;15860:2;15855:3;15796:67;:::i;:::-;15789:74;;15872:93;15961:3;15872:93;:::i;:::-;15990:2;15985:3;15981:12;15974:19;;15779:220;;;:::o;16005:366::-;16147:3;16168:67;16232:2;16227:3;16168:67;:::i;:::-;16161:74;;16244:93;16333:3;16244:93;:::i;:::-;16362:2;16357:3;16353:12;16346:19;;16151:220;;;:::o;16377:366::-;16519:3;16540:67;16604:2;16599:3;16540:67;:::i;:::-;16533:74;;16616:93;16705:3;16616:93;:::i;:::-;16734:2;16729:3;16725:12;16718:19;;16523:220;;;:::o;16749:366::-;16891:3;16912:67;16976:2;16971:3;16912:67;:::i;:::-;16905:74;;16988:93;17077:3;16988:93;:::i;:::-;17106:2;17101:3;17097:12;17090:19;;16895:220;;;:::o;17121:400::-;17281:3;17302:84;17384:1;17379:3;17302:84;:::i;:::-;17295:91;;17395:93;17484:3;17395:93;:::i;:::-;17513:1;17508:3;17504:11;17497:18;;17285:236;;;:::o;17527:366::-;17669:3;17690:67;17754:2;17749:3;17690:67;:::i;:::-;17683:74;;17766:93;17855:3;17766:93;:::i;:::-;17884:2;17879:3;17875:12;17868:19;;17673:220;;;:::o;17899:366::-;18041:3;18062:67;18126:2;18121:3;18062:67;:::i;:::-;18055:74;;18138:93;18227:3;18138:93;:::i;:::-;18256:2;18251:3;18247:12;18240:19;;18045:220;;;:::o;18271:366::-;18413:3;18434:67;18498:2;18493:3;18434:67;:::i;:::-;18427:74;;18510:93;18599:3;18510:93;:::i;:::-;18628:2;18623:3;18619:12;18612:19;;18417:220;;;:::o;18643:366::-;18785:3;18806:67;18870:2;18865:3;18806:67;:::i;:::-;18799:74;;18882:93;18971:3;18882:93;:::i;:::-;19000:2;18995:3;18991:12;18984:19;;18789:220;;;:::o;19015:366::-;19157:3;19178:67;19242:2;19237:3;19178:67;:::i;:::-;19171:74;;19254:93;19343:3;19254:93;:::i;:::-;19372:2;19367:3;19363:12;19356:19;;19161:220;;;:::o;19387:366::-;19529:3;19550:67;19614:2;19609:3;19550:67;:::i;:::-;19543:74;;19626:93;19715:3;19626:93;:::i;:::-;19744:2;19739:3;19735:12;19728:19;;19533:220;;;:::o;19759:366::-;19901:3;19922:67;19986:2;19981:3;19922:67;:::i;:::-;19915:74;;19998:93;20087:3;19998:93;:::i;:::-;20116:2;20111:3;20107:12;20100:19;;19905:220;;;:::o;20131:366::-;20273:3;20294:67;20358:2;20353:3;20294:67;:::i;:::-;20287:74;;20370:93;20459:3;20370:93;:::i;:::-;20488:2;20483:3;20479:12;20472:19;;20277:220;;;:::o;20503:366::-;20645:3;20666:67;20730:2;20725:3;20666:67;:::i;:::-;20659:74;;20742:93;20831:3;20742:93;:::i;:::-;20860:2;20855:3;20851:12;20844:19;;20649:220;;;:::o;20875:118::-;20962:24;20980:5;20962:24;:::i;:::-;20957:3;20950:37;20940:53;;:::o;20999:435::-;21179:3;21201:95;21292:3;21283:6;21201:95;:::i;:::-;21194:102;;21313:95;21404:3;21395:6;21313:95;:::i;:::-;21306:102;;21425:3;21418:10;;21183:251;;;;;:::o;21440:541::-;21673:3;21695:95;21786:3;21777:6;21695:95;:::i;:::-;21688:102;;21807:148;21951:3;21807:148;:::i;:::-;21800:155;;21972:3;21965:10;;21677:304;;;;:::o;21987:222::-;22080:4;22118:2;22107:9;22103:18;22095:26;;22131:71;22199:1;22188:9;22184:17;22175:6;22131:71;:::i;:::-;22085:124;;;;:::o;22215:640::-;22410:4;22448:3;22437:9;22433:19;22425:27;;22462:71;22530:1;22519:9;22515:17;22506:6;22462:71;:::i;:::-;22543:72;22611:2;22600:9;22596:18;22587:6;22543:72;:::i;:::-;22625;22693:2;22682:9;22678:18;22669:6;22625:72;:::i;:::-;22744:9;22738:4;22734:20;22729:2;22718:9;22714:18;22707:48;22772:76;22843:4;22834:6;22772:76;:::i;:::-;22764:84;;22415:440;;;;;;;:::o;22861:332::-;22982:4;23020:2;23009:9;23005:18;22997:26;;23033:71;23101:1;23090:9;23086:17;23077:6;23033:71;:::i;:::-;23114:72;23182:2;23171:9;23167:18;23158:6;23114:72;:::i;:::-;22987:206;;;;;:::o;23199:210::-;23286:4;23324:2;23313:9;23309:18;23301:26;;23337:65;23399:1;23388:9;23384:17;23375:6;23337:65;:::i;:::-;23291:118;;;;:::o;23415:313::-;23528:4;23566:2;23555:9;23551:18;23543:26;;23615:9;23609:4;23605:20;23601:1;23590:9;23586:17;23579:47;23643:78;23716:4;23707:6;23643:78;:::i;:::-;23635:86;;23533:195;;;;:::o;23734:419::-;23900:4;23938:2;23927:9;23923:18;23915:26;;23987:9;23981:4;23977:20;23973:1;23962:9;23958:17;23951:47;24015:131;24141:4;24015:131;:::i;:::-;24007:139;;23905:248;;;:::o;24159:419::-;24325:4;24363:2;24352:9;24348:18;24340:26;;24412:9;24406:4;24402:20;24398:1;24387:9;24383:17;24376:47;24440:131;24566:4;24440:131;:::i;:::-;24432:139;;24330:248;;;:::o;24584:419::-;24750:4;24788:2;24777:9;24773:18;24765:26;;24837:9;24831:4;24827:20;24823:1;24812:9;24808:17;24801:47;24865:131;24991:4;24865:131;:::i;:::-;24857:139;;24755:248;;;:::o;25009:419::-;25175:4;25213:2;25202:9;25198:18;25190:26;;25262:9;25256:4;25252:20;25248:1;25237:9;25233:17;25226:47;25290:131;25416:4;25290:131;:::i;:::-;25282:139;;25180:248;;;:::o;25434:419::-;25600:4;25638:2;25627:9;25623:18;25615:26;;25687:9;25681:4;25677:20;25673:1;25662:9;25658:17;25651:47;25715:131;25841:4;25715:131;:::i;:::-;25707:139;;25605:248;;;:::o;25859:419::-;26025:4;26063:2;26052:9;26048:18;26040:26;;26112:9;26106:4;26102:20;26098:1;26087:9;26083:17;26076:47;26140:131;26266:4;26140:131;:::i;:::-;26132:139;;26030:248;;;:::o;26284:419::-;26450:4;26488:2;26477:9;26473:18;26465:26;;26537:9;26531:4;26527:20;26523:1;26512:9;26508:17;26501:47;26565:131;26691:4;26565:131;:::i;:::-;26557:139;;26455:248;;;:::o;26709:419::-;26875:4;26913:2;26902:9;26898:18;26890:26;;26962:9;26956:4;26952:20;26948:1;26937:9;26933:17;26926:47;26990:131;27116:4;26990:131;:::i;:::-;26982:139;;26880:248;;;:::o;27134:419::-;27300:4;27338:2;27327:9;27323:18;27315:26;;27387:9;27381:4;27377:20;27373:1;27362:9;27358:17;27351:47;27415:131;27541:4;27415:131;:::i;:::-;27407:139;;27305:248;;;:::o;27559:419::-;27725:4;27763:2;27752:9;27748:18;27740:26;;27812:9;27806:4;27802:20;27798:1;27787:9;27783:17;27776:47;27840:131;27966:4;27840:131;:::i;:::-;27832:139;;27730:248;;;:::o;27984:419::-;28150:4;28188:2;28177:9;28173:18;28165:26;;28237:9;28231:4;28227:20;28223:1;28212:9;28208:17;28201:47;28265:131;28391:4;28265:131;:::i;:::-;28257:139;;28155:248;;;:::o;28409:419::-;28575:4;28613:2;28602:9;28598:18;28590:26;;28662:9;28656:4;28652:20;28648:1;28637:9;28633:17;28626:47;28690:131;28816:4;28690:131;:::i;:::-;28682:139;;28580:248;;;:::o;28834:419::-;29000:4;29038:2;29027:9;29023:18;29015:26;;29087:9;29081:4;29077:20;29073:1;29062:9;29058:17;29051:47;29115:131;29241:4;29115:131;:::i;:::-;29107:139;;29005:248;;;:::o;29259:419::-;29425:4;29463:2;29452:9;29448:18;29440:26;;29512:9;29506:4;29502:20;29498:1;29487:9;29483:17;29476:47;29540:131;29666:4;29540:131;:::i;:::-;29532:139;;29430:248;;;:::o;29684:419::-;29850:4;29888:2;29877:9;29873:18;29865:26;;29937:9;29931:4;29927:20;29923:1;29912:9;29908:17;29901:47;29965:131;30091:4;29965:131;:::i;:::-;29957:139;;29855:248;;;:::o;30109:419::-;30275:4;30313:2;30302:9;30298:18;30290:26;;30362:9;30356:4;30352:20;30348:1;30337:9;30333:17;30326:47;30390:131;30516:4;30390:131;:::i;:::-;30382:139;;30280:248;;;:::o;30534:419::-;30700:4;30738:2;30727:9;30723:18;30715:26;;30787:9;30781:4;30777:20;30773:1;30762:9;30758:17;30751:47;30815:131;30941:4;30815:131;:::i;:::-;30807:139;;30705:248;;;:::o;30959:419::-;31125:4;31163:2;31152:9;31148:18;31140:26;;31212:9;31206:4;31202:20;31198:1;31187:9;31183:17;31176:47;31240:131;31366:4;31240:131;:::i;:::-;31232:139;;31130:248;;;:::o;31384:419::-;31550:4;31588:2;31577:9;31573:18;31565:26;;31637:9;31631:4;31627:20;31623:1;31612:9;31608:17;31601:47;31665:131;31791:4;31665:131;:::i;:::-;31657:139;;31555:248;;;:::o;31809:419::-;31975:4;32013:2;32002:9;31998:18;31990:26;;32062:9;32056:4;32052:20;32048:1;32037:9;32033:17;32026:47;32090:131;32216:4;32090:131;:::i;:::-;32082:139;;31980:248;;;:::o;32234:419::-;32400:4;32438:2;32427:9;32423:18;32415:26;;32487:9;32481:4;32477:20;32473:1;32462:9;32458:17;32451:47;32515:131;32641:4;32515:131;:::i;:::-;32507:139;;32405:248;;;:::o;32659:419::-;32825:4;32863:2;32852:9;32848:18;32840:26;;32912:9;32906:4;32902:20;32898:1;32887:9;32883:17;32876:47;32940:131;33066:4;32940:131;:::i;:::-;32932:139;;32830:248;;;:::o;33084:419::-;33250:4;33288:2;33277:9;33273:18;33265:26;;33337:9;33331:4;33327:20;33323:1;33312:9;33308:17;33301:47;33365:131;33491:4;33365:131;:::i;:::-;33357:139;;33255:248;;;:::o;33509:419::-;33675:4;33713:2;33702:9;33698:18;33690:26;;33762:9;33756:4;33752:20;33748:1;33737:9;33733:17;33726:47;33790:131;33916:4;33790:131;:::i;:::-;33782:139;;33680:248;;;:::o;33934:419::-;34100:4;34138:2;34127:9;34123:18;34115:26;;34187:9;34181:4;34177:20;34173:1;34162:9;34158:17;34151:47;34215:131;34341:4;34215:131;:::i;:::-;34207:139;;34105:248;;;:::o;34359:419::-;34525:4;34563:2;34552:9;34548:18;34540:26;;34612:9;34606:4;34602:20;34598:1;34587:9;34583:17;34576:47;34640:131;34766:4;34640:131;:::i;:::-;34632:139;;34530:248;;;:::o;34784:419::-;34950:4;34988:2;34977:9;34973:18;34965:26;;35037:9;35031:4;35027:20;35023:1;35012:9;35008:17;35001:47;35065:131;35191:4;35065:131;:::i;:::-;35057:139;;34955:248;;;:::o;35209:419::-;35375:4;35413:2;35402:9;35398:18;35390:26;;35462:9;35456:4;35452:20;35448:1;35437:9;35433:17;35426:47;35490:131;35616:4;35490:131;:::i;:::-;35482:139;;35380:248;;;:::o;35634:419::-;35800:4;35838:2;35827:9;35823:18;35815:26;;35887:9;35881:4;35877:20;35873:1;35862:9;35858:17;35851:47;35915:131;36041:4;35915:131;:::i;:::-;35907:139;;35805:248;;;:::o;36059:222::-;36152:4;36190:2;36179:9;36175:18;36167:26;;36203:71;36271:1;36260:9;36256:17;36247:6;36203:71;:::i;:::-;36157:124;;;;:::o;36287:129::-;36321:6;36348:20;;:::i;:::-;36338:30;;36377:33;36405:4;36397:6;36377:33;:::i;:::-;36328:88;;;:::o;36422:75::-;36455:6;36488:2;36482:9;36472:19;;36462:35;:::o;36503:311::-;36580:4;36670:18;36662:6;36659:30;36656:2;;;36692:18;;:::i;:::-;36656:2;36742:4;36734:6;36730:17;36722:25;;36802:4;36796;36792:15;36784:23;;36585:229;;;:::o;36820:307::-;36881:4;36971:18;36963:6;36960:30;36957:2;;;36993:18;;:::i;:::-;36957:2;37031:29;37053:6;37031:29;:::i;:::-;37023:37;;37115:4;37109;37105:15;37097:23;;36886:241;;;:::o;37133:308::-;37195:4;37285:18;37277:6;37274:30;37271:2;;;37307:18;;:::i;:::-;37271:2;37345:29;37367:6;37345:29;:::i;:::-;37337:37;;37429:4;37423;37419:15;37411:23;;37200:241;;;:::o;37447:98::-;37498:6;37532:5;37526:12;37516:22;;37505:40;;;:::o;37551:99::-;37603:6;37637:5;37631:12;37621:22;;37610:40;;;:::o;37656:168::-;37739:11;37773:6;37768:3;37761:19;37813:4;37808:3;37804:14;37789:29;;37751:73;;;;:::o;37830:169::-;37914:11;37948:6;37943:3;37936:19;37988:4;37983:3;37979:14;37964:29;;37926:73;;;;:::o;38005:148::-;38107:11;38144:3;38129:18;;38119:34;;;;:::o;38159:305::-;38199:3;38218:20;38236:1;38218:20;:::i;:::-;38213:25;;38252:20;38270:1;38252:20;:::i;:::-;38247:25;;38406:1;38338:66;38334:74;38331:1;38328:81;38325:2;;;38412:18;;:::i;:::-;38325:2;38456:1;38453;38449:9;38442:16;;38203:261;;;;:::o;38470:185::-;38510:1;38527:20;38545:1;38527:20;:::i;:::-;38522:25;;38561:20;38579:1;38561:20;:::i;:::-;38556:25;;38600:1;38590:2;;38605:18;;:::i;:::-;38590:2;38647:1;38644;38640:9;38635:14;;38512:143;;;;:::o;38661:348::-;38701:7;38724:20;38742:1;38724:20;:::i;:::-;38719:25;;38758:20;38776:1;38758:20;:::i;:::-;38753:25;;38946:1;38878:66;38874:74;38871:1;38868:81;38863:1;38856:9;38849:17;38845:105;38842:2;;;38953:18;;:::i;:::-;38842:2;39001:1;38998;38994:9;38983:20;;38709:300;;;;:::o;39015:191::-;39055:4;39075:20;39093:1;39075:20;:::i;:::-;39070:25;;39109:20;39127:1;39109:20;:::i;:::-;39104:25;;39148:1;39145;39142:8;39139:2;;;39153:18;;:::i;:::-;39139:2;39198:1;39195;39191:9;39183:17;;39060:146;;;;:::o;39212:96::-;39249:7;39278:24;39296:5;39278:24;:::i;:::-;39267:35;;39257:51;;;:::o;39314:90::-;39348:7;39391:5;39384:13;39377:21;39366:32;;39356:48;;;:::o;39410:149::-;39446:7;39486:66;39479:5;39475:78;39464:89;;39454:105;;;:::o;39565:126::-;39602:7;39642:42;39635:5;39631:54;39620:65;;39610:81;;;:::o;39697:77::-;39734:7;39763:5;39752:16;;39742:32;;;:::o;39780:109::-;39816:7;39856:26;39849:5;39845:38;39834:49;;39824:65;;;:::o;39895:154::-;39979:6;39974:3;39969;39956:30;40041:1;40032:6;40027:3;40023:16;40016:27;39946:103;;;:::o;40055:307::-;40123:1;40133:113;40147:6;40144:1;40141:13;40133:113;;;40232:1;40227:3;40223:11;40217:18;40213:1;40208:3;40204:11;40197:39;40169:2;40166:1;40162:10;40157:15;;40133:113;;;40264:6;40261:1;40258:13;40255:2;;;40344:1;40335:6;40330:3;40326:16;40319:27;40255:2;40104:258;;;;:::o;40368:320::-;40412:6;40449:1;40443:4;40439:12;40429:22;;40496:1;40490:4;40486:12;40517:18;40507:2;;40573:4;40565:6;40561:17;40551:27;;40507:2;40635;40627:6;40624:14;40604:18;40601:38;40598:2;;;40654:18;;:::i;:::-;40598:2;40419:269;;;;:::o;40694:281::-;40777:27;40799:4;40777:27;:::i;:::-;40769:6;40765:40;40907:6;40895:10;40892:22;40871:18;40859:10;40856:34;40853:62;40850:2;;;40918:18;;:::i;:::-;40850:2;40958:10;40954:2;40947:22;40737:238;;;:::o;40981:233::-;41020:3;41043:24;41061:5;41043:24;:::i;:::-;41034:33;;41089:66;41082:5;41079:77;41076:2;;;41159:18;;:::i;:::-;41076:2;41206:1;41199:5;41195:13;41188:20;;41024:190;;;:::o;41220:176::-;41252:1;41269:20;41287:1;41269:20;:::i;:::-;41264:25;;41303:20;41321:1;41303:20;:::i;:::-;41298:25;;41342:1;41332:2;;41347:18;;:::i;:::-;41332:2;41388:1;41385;41381:9;41376:14;;41254:142;;;;:::o;41402:180::-;41450:77;41447:1;41440:88;41547:4;41544:1;41537:15;41571:4;41568:1;41561:15;41588:180;41636:77;41633:1;41626:88;41733:4;41730:1;41723:15;41757:4;41754:1;41747:15;41774:180;41822:77;41819:1;41812:88;41919:4;41916:1;41909:15;41943:4;41940:1;41933:15;41960:180;42008:77;42005:1;41998:88;42105:4;42102:1;42095:15;42129:4;42126:1;42119:15;42146:102;42187:6;42238:2;42234:7;42229:2;42222:5;42218:14;42214:28;42204:38;;42194:54;;;:::o;42254:170::-;42394:22;42390:1;42382:6;42378:14;42371:46;42360:64;:::o;42430:230::-;42570:34;42566:1;42558:6;42554:14;42547:58;42639:13;42634:2;42626:6;42622:15;42615:38;42536:124;:::o;42666:237::-;42806:34;42802:1;42794:6;42790:14;42783:58;42875:20;42870:2;42862:6;42858:15;42851:45;42772:131;:::o;42909:225::-;43049:34;43045:1;43037:6;43033:14;43026:58;43118:8;43113:2;43105:6;43101:15;43094:33;43015:119;:::o;43140:224::-;43280:34;43276:1;43268:6;43264:14;43257:58;43349:7;43344:2;43336:6;43332:15;43325:32;43246:118;:::o;43370:178::-;43510:30;43506:1;43498:6;43494:14;43487:54;43476:72;:::o;43554:178::-;43694:30;43690:1;43682:6;43678:14;43671:54;43660:72;:::o;43738:223::-;43878:34;43874:1;43866:6;43862:14;43855:58;43947:6;43942:2;43934:6;43930:15;43923:31;43844:117;:::o;43967:175::-;44107:27;44103:1;44095:6;44091:14;44084:51;44073:69;:::o;44148:231::-;44288:34;44284:1;44276:6;44272:14;44265:58;44357:14;44352:2;44344:6;44340:15;44333:39;44254:125;:::o;44385:166::-;44525:18;44521:1;44513:6;44509:14;44502:42;44491:60;:::o;44557:166::-;44697:18;44693:1;44685:6;44681:14;44674:42;44663:60;:::o;44729:243::-;44869:34;44865:1;44857:6;44853:14;44846:58;44938:26;44933:2;44925:6;44921:15;44914:51;44835:137;:::o;44978:225::-;45118:34;45114:1;45106:6;45102:14;45095:58;45187:8;45182:2;45174:6;45170:15;45163:33;45084:119;:::o;45209:229::-;45349:34;45345:1;45337:6;45333:14;45326:58;45418:12;45413:2;45405:6;45401:15;45394:37;45315:123;:::o;45444:228::-;45584:34;45580:1;45572:6;45568:14;45561:58;45653:11;45648:2;45640:6;45636:15;45629:36;45550:122;:::o;45678:233::-;45818:34;45814:1;45806:6;45802:14;45795:58;45887:16;45882:2;45874:6;45870:15;45863:41;45784:127;:::o;45917:182::-;46057:34;46053:1;46045:6;46041:14;46034:58;46023:76;:::o;46105:236::-;46245:34;46241:1;46233:6;46229:14;46222:58;46314:19;46309:2;46301:6;46297:15;46290:44;46211:130;:::o;46347:231::-;46487:34;46483:1;46475:6;46471:14;46464:58;46556:14;46551:2;46543:6;46539:15;46532:39;46453:125;:::o;46584:155::-;46724:7;46720:1;46712:6;46708:14;46701:31;46690:49;:::o;46745:182::-;46885:34;46881:1;46873:6;46869:14;46862:58;46851:76;:::o;46933:234::-;47073:34;47069:1;47061:6;47057:14;47050:58;47142:17;47137:2;47129:6;47125:15;47118:42;47039:128;:::o;47173:220::-;47313:34;47309:1;47301:6;47297:14;47290:58;47382:3;47377:2;47369:6;47365:15;47358:28;47279:114;:::o;47399:236::-;47539:34;47535:1;47527:6;47523:14;47516:58;47608:19;47603:2;47595:6;47591:15;47584:44;47505:130;:::o;47641:231::-;47781:34;47777:1;47769:6;47765:14;47758:58;47850:14;47845:2;47837:6;47833:15;47826:39;47747:125;:::o;47878:171::-;48018:23;48014:1;48006:6;48002:14;47995:47;47984:65;:::o;48055:229::-;48195:34;48191:1;48183:6;48179:14;48172:58;48264:12;48259:2;48251:6;48247:15;48240:37;48161:123;:::o;48290:235::-;48430:34;48426:1;48418:6;48414:14;48407:58;48499:18;48494:2;48486:6;48482:15;48475:43;48396:129;:::o;48531:175::-;48671:27;48667:1;48659:6;48655:14;48648:51;48637:69;:::o;48712:122::-;48785:24;48803:5;48785:24;:::i;:::-;48778:5;48775:35;48765:2;;48824:1;48821;48814:12;48765:2;48755:79;:::o;48840:116::-;48910:21;48925:5;48910:21;:::i;:::-;48903:5;48900:32;48890:2;;48946:1;48943;48936:12;48890:2;48880:76;:::o;48962:120::-;49034:23;49051:5;49034:23;:::i;:::-;49027:5;49024:34;49014:2;;49072:1;49069;49062:12;49014:2;49004:78;:::o;49088:122::-;49161:24;49179:5;49161:24;:::i;:::-;49154:5;49151:35;49141:2;;49200:1;49197;49190:12;49141:2;49131:79;:::o;49216:120::-;49288:23;49305:5;49288:23;:::i;:::-;49281:5;49278:34;49268:2;;49326:1;49323;49316:12;49268:2;49258:78;:::o

Swarm Source

ipfs://072e8b595eb5765f48834f4350c029cb67a60e694ebd07f47cabe5d5a5fc3496
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.