Token

Overview ERC1155

Total Supply:
0 N/A

Holders:
5 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
TeamNFT

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-19
*/

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

    /**
     * @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);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/contracts/utils/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 (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// 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.7.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:
     *
     * - `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/ERC1155/IERC1155Receiver.sol


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

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// 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: contracts/nftContract.sol


pragma solidity ^0.8.9;







contract TeamNFT is ERC1155, ERC2981, Ownable, ReentrancyGuard {
    using Counters for Counters.Counter;
    struct CountryStruct {
        uint256 value;
        uint256 max;
        bool active;
    }
    bool public mintingAllowed = false;
    uint256 public constant MINT_FEE = 1 ether;
    uint256 public constant PERCENT_FEE = 20;
    uint96 public constant ROYALTY_PERCENTAGE = 1500; // 15%
    mapping(string => uint256) countryCounter;
    mapping(string => CountryStruct) countries;
    address public immutable _admin;
    address public immutable escrowAddress;
    address public immutable developerAddress;
    uint256 private constant MAX_MINT = 1000;
    string public MINT_AUTH;
    string public baseURI;

    Counters.Counter private _tokenIds;
    event MintingAllowed(bool allowed);
    event MintedNFT(uint256 count, uint256 tokenIds);
    event SentAmt(uint256 amount, uint256 devFee);
    event UpdateAccountPermission(address account, bool permission);
    event UpdateCountryList(string country, uint256 value, uint256 max);

    /// ==================== MODIFIER =======================
    modifier onlyAdmin() {
        require(msg.sender != address(0), "address_  Zero:invalid address");
        require(msg.sender == _admin, "only admin can call this method");
        _;
    }

    // modifier onlyMinter() {
    //     require(msg.sender != address(0), "address_  Zero:invalid address");
    //     require(
    //         minters[msg.sender],
    //         "only approved addresses can call this method"
    //     );
    //     _;
    // }

    modifier checkMinting() {
        require(mintingAllowed, "Minting is disabled");
        _;
    }

    constructor(
        string memory uri_,
        address _escrowAddress,
        address _developerAddress,
        address _adminAddress
    ) ERC1155(uri_) {
        escrowAddress = _escrowAddress;
        developerAddress = _developerAddress;
        _admin = _adminAddress;
        _tokenIds.increment();
        baseURI = uri_;
        _setDefaultRoyalty(_developerAddress, ROYALTY_PERCENTAGE);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC1155, ERC2981)
        returns (bool)
    {
        return
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            interfaceId == type(IERC2981).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function setMintingAllowed(bool _mintingAllowed) external onlyAdmin {
        mintingAllowed = _mintingAllowed;
        emit MintingAllowed(_mintingAllowed);
    }

    ///  =============  single minting  =====================
    function mint(string calldata country)
        external
        payable
        checkMinting
        nonReentrant
    {
        uint256 countryCount = countryCounter[country];
        CountryStruct memory countryData = countries[country];
        require(countryData.active, "Country not available");
        require(countryCount < countryData.max, "Country Max Mint Reached");
        require(msg.value == countryData.value, "Wrong mint fee");
        uint256 newTokenID = _singleMint(country);
        CalculatePayment(msg.value);
        _mint(_msgSender(), newTokenID, 1, "");
        emit MintedNFT(1, newTokenID);
    }

    function _singleMint(string memory country) private returns (uint256) {
        uint256 newTokenID = _tokenIds.current();
        countryCounter[country] += 1;
        _tokenIds.increment();
        return newTokenID;
    }

    ///  =============  multiple minting =====================
    function mintMultiple(string[] calldata values)
        public
        payable
        checkMinting
        nonReentrant
    {
        uint256 totalAmount;
        uint256 _count = values.length;
        uint256[] memory ids = new uint256[](_count);

        // generate all tokenIds for count
        uint256[] memory amounts = new uint256[](_count);
        for (uint256 i = 0; i < _count; i++) {
            uint256 countryCount = countryCounter[values[i]];
            CountryStruct memory countryData = countries[values[i]];
            require(countryData.active, "Country not available");
            require(countryCount < countryData.max, "Country Max Mint Reached");
            totalAmount = totalAmount + countryData.value;
            amounts[i] = 1;
            ids[i] = _singleMint(values[i]);
        }
        require(msg.value == totalAmount, "Wrong mint fee");
        _mintBatch(_msgSender(), ids, amounts, "");
        CalculatePayment(totalAmount);
        emit MintedNFT(_count, ids[0]);
    }

    /// Calculate Payment
    function CalculatePayment(uint256 sendAmount) private {
        // uint256 devFee = sendAmount.div(10).mul(1);
        // uint256 devFee = sendAmount.mul(PERCENT_FEE).div(100);
        uint256 devFee = (sendAmount * PERCENT_FEE) / 100;
        uint256 potValue = sendAmount - devFee;
        emit SentAmt(potValue, sendAmount);
        (bool success, ) = (escrowAddress).call{value: potValue}("");
        require(success, "transfer to escrow failed");
        (bool successDev, ) = (developerAddress).call{value: devFee}("");
        require(successDev, "transfer to developer failed");
    }

    function getCountryCount(string memory country)
        public
        view
        returns (uint256)
    {
        return countryCounter[country];
    }

    /// ==================== ADMIN FUNCTIONS =======================

    // add new country
    function addCountry(
        string calldata country,
        uint256 value,
        uint256 max
    ) external onlyAdmin {
        countries[country] = CountryStruct(value, max, true);
        emit UpdateCountryList(country, value, max);
    }

    // remove country
    function removeCountry(string calldata country) external onlyAdmin {
        delete countries[country];
        emit UpdateCountryList(country, 0, 0);
    }

    // upload new country list
    function addCountries(
        string[] calldata countriesList,
        uint256[] calldata values,
        uint256[] calldata maxs
    ) external onlyAdmin {
        require(countriesList.length == values.length, "Invalid length");
        require(countriesList.length == maxs.length, "Invalid length");
        for (uint256 i = 0; i < countriesList.length; i++) {
            countries[countriesList[i]] = CountryStruct(values[i], maxs[i], true);
            emit UpdateCountryList(countriesList[i], values[i], maxs[i]);
        }
    }

    // get country
    function getCountry(string calldata country)
        external
        view
        returns (
            string calldata,
            uint256,
            uint256
        )
    {
        CountryStruct storage countryData = countries[country];
        return (country, countryData.value, countryData.max);
    }

    function uri(uint256 _tokenID) override public view returns (string memory) {
       return string(abi.encodePacked(baseURI, Strings.toString(_tokenID)));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"uri_","type":"string"},{"internalType":"address","name":"_escrowAddress","type":"address"},{"internalType":"address","name":"_developerAddress","type":"address"},{"internalType":"address","name":"_adminAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenIds","type":"uint256"}],"name":"MintedNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"MintingAllowed","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":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"devFee","type":"uint256"}],"name":"SentAmt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"permission","type":"bool"}],"name":"UpdateAccountPermission","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"country","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"max","type":"uint256"}],"name":"UpdateCountryList","type":"event"},{"inputs":[],"name":"MINT_AUTH","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENT_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_PERCENTAGE","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"countriesList","type":"string[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"uint256[]","name":"maxs","type":"uint256[]"}],"name":"addCountries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"country","type":"string"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"addCountry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"escrowAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"country","type":"string"}],"name":"getCountry","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"country","type":"string"}],"name":"getCountryCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"country","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string[]","name":"values","type":"string[]"}],"name":"mintMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"country","type":"string"}],"name":"removeCountry","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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"bool","name":"_mintingAllowed","type":"bool"}],"name":"setMintingAllowed","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60e06040526000600760006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50604051620062363803806200623683398181016040528101906200005291906200060e565b8362000064816200017060201b60201c565b5062000085620000796200018560201b60201c565b6200018d60201b60201c565b60016006819055508273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505062000140600c6200025360201b62001fa81760201c565b83600b9081620001519190620008ea565b5062000166826105dc6200026960201b60201c565b5050505062000aec565b8060029081620001819190620008ea565b5050565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b620002796200040c60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620002da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002d19062000a58565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200034c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003439062000aca565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600360008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200047f8262000434565b810181811067ffffffffffffffff82111715620004a157620004a062000445565b5b80604052505050565b6000620004b662000416565b9050620004c4828262000474565b919050565b600067ffffffffffffffff821115620004e757620004e662000445565b5b620004f28262000434565b9050602081019050919050565b60005b838110156200051f57808201518184015260208101905062000502565b60008484015250505050565b6000620005426200053c84620004c9565b620004aa565b9050828152602081018484840111156200056157620005606200042f565b5b6200056e848285620004ff565b509392505050565b600082601f8301126200058e576200058d6200042a565b5b8151620005a08482602086016200052b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005d682620005a9565b9050919050565b620005e881620005c9565b8114620005f457600080fd5b50565b6000815190506200060881620005dd565b92915050565b600080600080608085870312156200062b576200062a62000420565b5b600085015167ffffffffffffffff8111156200064c576200064b62000425565b5b6200065a8782880162000576565b94505060206200066d87828801620005f7565b93505060406200068087828801620005f7565b92505060606200069387828801620005f7565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006f257607f821691505b602082108103620007085762000707620006aa565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000733565b6200077e868362000733565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620007cb620007c5620007bf8462000796565b620007a0565b62000796565b9050919050565b6000819050919050565b620007e783620007aa565b620007ff620007f682620007d2565b84845462000740565b825550505050565b600090565b6200081662000807565b62000823818484620007dc565b505050565b5b818110156200084b576200083f6000826200080c565b60018101905062000829565b5050565b601f8211156200089a5762000864816200070e565b6200086f8462000723565b810160208510156200087f578190505b620008976200088e8562000723565b83018262000828565b50505b505050565b600082821c905092915050565b6000620008bf600019846008026200089f565b1980831691505092915050565b6000620008da8383620008ac565b9150826002028217905092915050565b620008f5826200069f565b67ffffffffffffffff81111562000911576200091062000445565b5b6200091d8254620006d9565b6200092a8282856200084f565b600060209050601f8311600181146200096257600084156200094d578287015190505b620009598582620008cc565b865550620009c9565b601f19841662000972866200070e565b60005b828110156200099c5784890151825560018201915060208501945060208101905062000975565b86831015620009bc5784890151620009b8601f891682620008ac565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000a40602a83620009d1565b915062000a4d82620009e2565b604082019050919050565b6000602082019050818103600083015262000a738162000a31565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000ab2601983620009d1565b915062000abf8262000a7a565b602082019050919050565b6000602082019050818103600083015262000ae58162000aa3565b9050919050565b60805160a05160c0516156f062000b46600039600081816116c7015261290901526000818161092f015261283d0152600081816107c1015281816109f601528181610b7c01528181610fe601526112bf01526156f06000f3fe6080604052600436106101c15760003560e01c806360941bc5116100f7578063a22cb46511610095578063e4adc98f11610064578063e4adc98f1461064c578063e985e9c514610668578063f242432a146106a5578063f2fde38b146106ce576101c1565b8063a22cb465146105b1578063caccd7f7146105da578063d7bf81a314610605578063d85d3d2714610630576101c1565b8063715018a6116100d1578063715018a614610504578063848924cb1461051b5780638da5cb5b1461055b57806396532d1c14610586576101c1565b806360941bc5146104735780636a3f75ce1461049c5780636c0360eb146104d9576101c1565b80631c4b08ad1161016457806330f53f5b1161013e57806330f53f5b146103b75780633fa1c85c146103e0578063463b08db1461040b5780634e1273f414610436576101c1565b80631c4b08ad146103255780632a55205a146103505780632eb2c2d61461038e576101c1565b80630d5defa4116101a05780630d5defa41461026b5780630e89341c14610296578063106b2192146102d357806316c94343146102fc576101c1565b8062fdd58e146101c657806301bc45c91461020357806301ffc9a71461022e575b600080fd5b3480156101d257600080fd5b506101ed60048036038101906101e891906136ac565b6106f7565b6040516101fa91906136fb565b60405180910390f35b34801561020f57600080fd5b506102186107bf565b6040516102259190613725565b60405180910390f35b34801561023a57600080fd5b5061025560048036038101906102509190613798565b6107e3565b60405161026291906137e0565b60405180910390f35b34801561027757600080fd5b5061028061092d565b60405161028d9190613725565b60405180910390f35b3480156102a257600080fd5b506102bd60048036038101906102b891906137fb565b610951565b6040516102ca91906138b8565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f5919061393f565b610985565b005b34801561030857600080fd5b50610323600480360381019061031e91906139b8565b610b0b565b005b34801561033157600080fd5b5061033a610c5c565b60405161034791906138b8565b60405180910390f35b34801561035c57600080fd5b50610377600480360381019061037291906139e5565b610cea565b604051610385929190613a25565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613c41565b610ed4565b005b3480156103c357600080fd5b506103de60048036038101906103d99190613d10565b610f75565b005b3480156103ec57600080fd5b506103f561112a565b60405161040291906136fb565b60405180910390f35b34801561041757600080fd5b5061042061112f565b60405161042d9190613dab565b60405180910390f35b34801561044257600080fd5b5061045d60048036038101906104589190613e89565b611135565b60405161046a9190613fbf565b60405180910390f35b34801561047f57600080fd5b5061049a6004803603810190610495919061408d565b61124e565b005b3480156104a857600080fd5b506104c360048036038101906104be91906141e2565b611561565b6040516104d091906136fb565b60405180910390f35b3480156104e557600080fd5b506104ee611589565b6040516104fb91906138b8565b60405180910390f35b34801561051057600080fd5b50610519611617565b005b34801561052757600080fd5b50610542600480360381019061053d919061393f565b61162b565b6040516105529493929190614258565b60405180910390f35b34801561056757600080fd5b50610570611672565b60405161057d9190613725565b60405180910390f35b34801561059257600080fd5b5061059b61169c565b6040516105a891906137e0565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d39190614298565b6116af565b005b3480156105e657600080fd5b506105ef6116c5565b6040516105fc9190613725565b60405180910390f35b34801561061157600080fd5b5061061a6116e9565b60405161062791906136fb565b60405180910390f35b61064a6004803603810190610645919061393f565b6116f5565b005b610666600480360381019061066191906142d8565b6119aa565b005b34801561067457600080fd5b5061068f600480360381019061068a9190614325565b611df0565b60405161069c91906137e0565b60405180910390f35b3480156106b157600080fd5b506106cc60048036038101906106c79190614365565b611e84565b005b3480156106da57600080fd5b506106f560048036038101906106f091906143fc565b611f25565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075e9061449b565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108ae57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061091657507f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610926575061092582611fbe565b5b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060600b61095e83612038565b60405160200161096f9291906145ef565b6040516020818303038152906040529050919050565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036109f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109eb9061465f565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a79906146cb565b60405180910390fd5b60098282604051610a94929190614710565b908152602001604051809103902060008082016000905560018201600090556002820160006101000a81549060ff021916905550507f779e28217d65b7e94bba5f57d0529efb3a3f07f864a17ab2dd488f21a72b19088282600080604051610aff949392919061476e565b60405180910390a15050565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b719061465f565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff906146cb565b60405180910390fd5b80600760006101000a81548160ff0219169083151502179055507f68dcd6f15d504ba5e33403028d35ad8839d1fdb7418e24bd99d4b602b96fe3cb81604051610c5191906137e0565b60405180910390a150565b600a8054610c69906144ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610c95906144ea565b8015610ce25780601f10610cb757610100808354040283529160200191610ce2565b820191906000526020600020905b815481529060010190602001808311610cc557829003601f168201915b505050505081565b6000806000600460008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610e7f5760036040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610e89612198565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610eb591906147dd565b610ebf919061484e565b90508160000151819350935050509250929050565b610edc6121a2565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610f225750610f2185610f1c6121a2565b611df0565b5b610f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f58906148f1565b60405180910390fd5b610f6e85858585856121aa565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdb9061465f565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611072576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611069906146cb565b60405180910390fd5b604051806060016040528083815260200182815260200160011515815250600985856040516110a2929190614710565b9081526020016040518091039020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff0219169083151502179055509050507f779e28217d65b7e94bba5f57d0529efb3a3f07f864a17ab2dd488f21a72b19088484848460405161111c9493929190614258565b60405180910390a150505050565b601481565b6105dc81565b6060815183511461117b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117290614983565b60405180910390fd5b6000835167ffffffffffffffff81111561119857611197613a4e565b5b6040519080825280602002602001820160405280156111c65781602001602082028036833780820191505090505b50905060005b8451811015611243576112138582815181106111eb576111ea6149a3565b5b6020026020010151858381518110611206576112056149a3565b5b60200260200101516106f7565b828281518110611226576112256149a3565b5b6020026020010181815250508061123c906149d2565b90506111cc565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b49061465f565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461134b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611342906146cb565b60405180910390fd5b838390508686905014611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a90614a66565b60405180910390fd5b8181905086869050146113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d290614a66565b60405180910390fd5b60005b86869050811015611558576040518060600160405280868684818110611407576114066149a3565b5b905060200201358152602001848484818110611426576114256149a3565b5b90506020020135815260200160011515815250600988888481811061144e5761144d6149a3565b5b90506020028101906114609190614a95565b60405161146e929190614710565b9081526020016040518091039020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff0219169083151502179055509050507f779e28217d65b7e94bba5f57d0529efb3a3f07f864a17ab2dd488f21a72b19088787838181106114e7576114e66149a3565b5b90506020028101906114f99190614a95565b87878581811061150c5761150b6149a3565b5b90506020020135868686818110611526576115256149a3565b5b9050602002013560405161153d9493929190614258565b60405180910390a18080611550906149d2565b9150506113de565b50505050505050565b60006008826040516115739190614af8565b9081526020016040518091039020549050919050565b600b8054611596906144ea565b80601f01602080910402602001604051908101604052809291908181526020018280546115c2906144ea565b801561160f5780601f106115e45761010080835404028352916020019161160f565b820191906000526020600020905b8154815290600101906020018083116115f257829003601f168201915b505050505081565b61161f6124cb565b6116296000612549565b565b3660008060008060098787604051611644929190614710565b9081526020016040518091039020905086868260000154836001015494509450945094505092959194509250565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900460ff1681565b6116c16116ba6121a2565b838361260f565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b670de0b6b3a764000081565b600760009054906101000a900460ff16611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173b90614b5b565b60405180910390fd5b600260065403611789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178090614bc7565b60405180910390fd5b60026006819055506000600883836040516117a5929190614710565b90815260200160405180910390205490506000600984846040516117ca929190614710565b908152602001604051809103902060405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16151515158152505090508060400151611858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184f90614c33565b60405180910390fd5b8060200151821061189e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189590614c9f565b60405180910390fd5b806000015134146118e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118db90614d0b565b60405180910390fd5b600061193385858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061277b565b905061193e346127d3565b6119616119496121a2565b826001604051806020016040528060008152506129d8565b7f8cef0d30ca4873649a90eb8c8020564aa8e888375491c0de28328204d267d968600182604051611993929190614d66565b60405180910390a150505060016006819055505050565b600760009054906101000a900460ff166119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f090614b5b565b60405180910390fd5b600260065403611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3590614bc7565b60405180910390fd5b600260068190555060008083839050905060008167ffffffffffffffff811115611a6b57611a6a613a4e565b5b604051908082528060200260200182016040528015611a995781602001602082028036833780820191505090505b50905060008267ffffffffffffffff811115611ab857611ab7613a4e565b5b604051908082528060200260200182016040528015611ae65781602001602082028036833780820191505090505b50905060005b83811015611d1e5760006008888884818110611b0b57611b0a6149a3565b5b9050602002810190611b1d9190614a95565b604051611b2b929190614710565b908152602001604051809103902054905060006009898985818110611b5357611b526149a3565b5b9050602002810190611b659190614a95565b604051611b73929190614710565b908152602001604051809103902060405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16151515158152505090508060400151611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf890614c33565b60405180910390fd5b80602001518210611c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3e90614c9f565b60405180910390fd5b806000015187611c579190614d8f565b96506001848481518110611c6e57611c6d6149a3565b5b602002602001018181525050611cea898985818110611c9057611c8f6149a3565b5b9050602002810190611ca29190614a95565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061277b565b858481518110611cfd57611cfc6149a3565b5b60200260200101818152505050508080611d16906149d2565b915050611aec565b50833414611d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5890614d0b565b60405180910390fd5b611d83611d6c6121a2565b838360405180602001604052806000815250612b88565b611d8c846127d3565b7f8cef0d30ca4873649a90eb8c8020564aa8e888375491c0de28328204d267d9688383600081518110611dc257611dc16149a3565b5b6020026020010151604051611dd8929190614dc3565b60405180910390a15050505060016006819055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e8c6121a2565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611ed25750611ed185611ecc6121a2565b611df0565b5b611f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f08906148f1565b60405180910390fd5b611f1e8585858585612db4565b5050505050565b611f2d6124cb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9390614e5e565b60405180910390fd5b611fa581612549565b50565b6001816000016000828254019250508190555050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061203157506120308261304f565b5b9050919050565b60606000820361207f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612193565b600082905060005b600082146120b157808061209a906149d2565b915050600a826120aa919061484e565b9150612087565b60008167ffffffffffffffff8111156120cd576120cc613a4e565b5b6040519080825280601f01601f1916602001820160405280156120ff5781602001600182028036833780820191505090505b5090505b6000851461218c576001826121189190614e7e565b9150600a856121279190614eb2565b60306121339190614d8f565b60f81b818381518110612149576121486149a3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612185919061484e565b9450612103565b8093505050505b919050565b6000612710905090565b600033905090565b81518351146121ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e590614f55565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361225d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225490614fe7565b60405180910390fd5b60006122676121a2565b9050612277818787878787613131565b60005b8451811015612428576000858281518110612298576122976149a3565b5b6020026020010151905060008583815181106122b7576122b66149a3565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234f90615079565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461240d9190614d8f565b9250508190555050505080612421906149d2565b905061227a565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161249f929190615099565b60405180910390a46124b5818787878787613139565b6124c3818787878787613141565b505050505050565b6124d36121a2565b73ffffffffffffffffffffffffffffffffffffffff166124f1611672565b73ffffffffffffffffffffffffffffffffffffffff1614612547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253e9061511c565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361267d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612674906151ae565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161276e91906137e0565b60405180910390a3505050565b600080612788600c613318565b9050600160088460405161279c9190614af8565b908152602001604051809103902060008282546127b99190614d8f565b925050819055506127ca600c611fa8565b80915050919050565b600060646014836127e491906147dd565b6127ee919061484e565b9050600081836127fe9190614e7e565b90507fdc844f2bfa4f6358d00a51ad3fecffb1f1d41292a99eb56943f65f95ba3fead08184604051612831929190614dc3565b60405180910390a160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168260405161287f906151ff565b60006040518083038185875af1925050503d80600081146128bc576040519150601f19603f3d011682016040523d82523d6000602084013e6128c1565b606091505b5050905080612905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128fc90615260565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168460405161294b906151ff565b60006040518083038185875af1925050503d8060008114612988576040519150601f19603f3d011682016040523d82523d6000602084013e61298d565b606091505b50509050806129d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c8906152cc565b60405180910390fd5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3e9061535e565b60405180910390fd5b6000612a516121a2565b90506000612a5e85613326565b90506000612a6b85613326565b9050612a7c83600089858589613131565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612adb9190614d8f565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612b59929190614dc3565b60405180910390a4612b7083600089858589613139565b612b7f836000898989896133a0565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bee9061535e565b60405180910390fd5b8151835114612c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3290614f55565b60405180910390fd5b6000612c456121a2565b9050612c5681600087878787613131565b60005b8451811015612d0f57838181518110612c7557612c746149a3565b5b6020026020010151600080878481518110612c9357612c926149a3565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cf59190614d8f565b925050819055508080612d07906149d2565b915050612c59565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612d87929190615099565b60405180910390a4612d9e81600087878787613139565b612dad81600087878787613141565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1a90614fe7565b60405180910390fd5b6000612e2d6121a2565b90506000612e3a85613326565b90506000612e4785613326565b9050612e57838989858589613131565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee590615079565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fa39190614d8f565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051613020929190614dc3565b60405180910390a4613036848a8a86868a613139565b613044848a8a8a8a8a6133a0565b505050505050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061311a57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061312a575061312982613577565b5b9050919050565b505050505050565b505050505050565b6131608473ffffffffffffffffffffffffffffffffffffffff166135e1565b15613310578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016131a69594939291906153d3565b6020604051808303816000875af19250505080156131e257506040513d601f19601f820116820180604052508101906131df9190615450565b60015b613287576131ee61548a565b806308c379a00361324a57506132026154ac565b8061320d575061324c565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324191906138b8565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327e906155ae565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461330e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330590615640565b60405180910390fd5b505b505050505050565b600081600001549050919050565b60606000600167ffffffffffffffff81111561334557613344613a4e565b5b6040519080825280602002602001820160405280156133735781602001602082028036833780820191505090505b509050828160008151811061338b5761338a6149a3565b5b60200260200101818152505080915050919050565b6133bf8473ffffffffffffffffffffffffffffffffffffffff166135e1565b1561356f578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401613405959493929190615660565b6020604051808303816000875af192505050801561344157506040513d601f19601f8201168201806040525081019061343e9190615450565b60015b6134e65761344d61548a565b806308c379a0036134a957506134616154ac565b8061346c57506134ab565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a091906138b8565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134dd906155ae565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461356d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356490615640565b60405180910390fd5b505b505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061364382613618565b9050919050565b61365381613638565b811461365e57600080fd5b50565b6000813590506136708161364a565b92915050565b6000819050919050565b61368981613676565b811461369457600080fd5b50565b6000813590506136a681613680565b92915050565b600080604083850312156136c3576136c261360e565b5b60006136d185828601613661565b92505060206136e285828601613697565b9150509250929050565b6136f581613676565b82525050565b600060208201905061371060008301846136ec565b92915050565b61371f81613638565b82525050565b600060208201905061373a6000830184613716565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61377581613740565b811461378057600080fd5b50565b6000813590506137928161376c565b92915050565b6000602082840312156137ae576137ad61360e565b5b60006137bc84828501613783565b91505092915050565b60008115159050919050565b6137da816137c5565b82525050565b60006020820190506137f560008301846137d1565b92915050565b6000602082840312156138115761381061360e565b5b600061381f84828501613697565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613862578082015181840152602081019050613847565b60008484015250505050565b6000601f19601f8301169050919050565b600061388a82613828565b6138948185613833565b93506138a4818560208601613844565b6138ad8161386e565b840191505092915050565b600060208201905081810360008301526138d2818461387f565b905092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126138ff576138fe6138da565b5b8235905067ffffffffffffffff81111561391c5761391b6138df565b5b602083019150836001820283011115613938576139376138e4565b5b9250929050565b600080602083850312156139565761395561360e565b5b600083013567ffffffffffffffff81111561397457613973613613565b5b613980858286016138e9565b92509250509250929050565b613995816137c5565b81146139a057600080fd5b50565b6000813590506139b28161398c565b92915050565b6000602082840312156139ce576139cd61360e565b5b60006139dc848285016139a3565b91505092915050565b600080604083850312156139fc576139fb61360e565b5b6000613a0a85828601613697565b9250506020613a1b85828601613697565b9150509250929050565b6000604082019050613a3a6000830185613716565b613a4760208301846136ec565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a868261386e565b810181811067ffffffffffffffff82111715613aa557613aa4613a4e565b5b80604052505050565b6000613ab8613604565b9050613ac48282613a7d565b919050565b600067ffffffffffffffff821115613ae457613ae3613a4e565b5b602082029050602081019050919050565b6000613b08613b0384613ac9565b613aae565b90508083825260208201905060208402830185811115613b2b57613b2a6138e4565b5b835b81811015613b545780613b408882613697565b845260208401935050602081019050613b2d565b5050509392505050565b600082601f830112613b7357613b726138da565b5b8135613b83848260208601613af5565b91505092915050565b600080fd5b600067ffffffffffffffff821115613bac57613bab613a4e565b5b613bb58261386e565b9050602081019050919050565b82818337600083830152505050565b6000613be4613bdf84613b91565b613aae565b905082815260208101848484011115613c0057613bff613b8c565b5b613c0b848285613bc2565b509392505050565b600082601f830112613c2857613c276138da565b5b8135613c38848260208601613bd1565b91505092915050565b600080600080600060a08688031215613c5d57613c5c61360e565b5b6000613c6b88828901613661565b9550506020613c7c88828901613661565b945050604086013567ffffffffffffffff811115613c9d57613c9c613613565b5b613ca988828901613b5e565b935050606086013567ffffffffffffffff811115613cca57613cc9613613565b5b613cd688828901613b5e565b925050608086013567ffffffffffffffff811115613cf757613cf6613613565b5b613d0388828901613c13565b9150509295509295909350565b60008060008060608587031215613d2a57613d2961360e565b5b600085013567ffffffffffffffff811115613d4857613d47613613565b5b613d54878288016138e9565b94509450506020613d6787828801613697565b9250506040613d7887828801613697565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b613da581613d84565b82525050565b6000602082019050613dc06000830184613d9c565b92915050565b600067ffffffffffffffff821115613de157613de0613a4e565b5b602082029050602081019050919050565b6000613e05613e0084613dc6565b613aae565b90508083825260208201905060208402830185811115613e2857613e276138e4565b5b835b81811015613e515780613e3d8882613661565b845260208401935050602081019050613e2a565b5050509392505050565b600082601f830112613e7057613e6f6138da565b5b8135613e80848260208601613df2565b91505092915050565b60008060408385031215613ea057613e9f61360e565b5b600083013567ffffffffffffffff811115613ebe57613ebd613613565b5b613eca85828601613e5b565b925050602083013567ffffffffffffffff811115613eeb57613eea613613565b5b613ef785828601613b5e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613f3681613676565b82525050565b6000613f488383613f2d565b60208301905092915050565b6000602082019050919050565b6000613f6c82613f01565b613f768185613f0c565b9350613f8183613f1d565b8060005b83811015613fb2578151613f998882613f3c565b9750613fa483613f54565b925050600181019050613f85565b5085935050505092915050565b60006020820190508181036000830152613fd98184613f61565b905092915050565b60008083601f840112613ff757613ff66138da565b5b8235905067ffffffffffffffff811115614014576140136138df565b5b6020830191508360208202830111156140305761402f6138e4565b5b9250929050565b60008083601f84011261404d5761404c6138da565b5b8235905067ffffffffffffffff81111561406a576140696138df565b5b602083019150836020820283011115614086576140856138e4565b5b9250929050565b600080600080600080606087890312156140aa576140a961360e565b5b600087013567ffffffffffffffff8111156140c8576140c7613613565b5b6140d489828a01613fe1565b9650965050602087013567ffffffffffffffff8111156140f7576140f6613613565b5b61410389828a01614037565b9450945050604087013567ffffffffffffffff81111561412657614125613613565b5b61413289828a01614037565b92509250509295509295509295565b600067ffffffffffffffff82111561415c5761415b613a4e565b5b6141658261386e565b9050602081019050919050565b600061418561418084614141565b613aae565b9050828152602081018484840111156141a1576141a0613b8c565b5b6141ac848285613bc2565b509392505050565b600082601f8301126141c9576141c86138da565b5b81356141d9848260208601614172565b91505092915050565b6000602082840312156141f8576141f761360e565b5b600082013567ffffffffffffffff81111561421657614215613613565b5b614222848285016141b4565b91505092915050565b60006142378385613833565b9350614244838584613bc2565b61424d8361386e565b840190509392505050565b6000606082019050818103600083015261427381868861422b565b905061428260208301856136ec565b61428f60408301846136ec565b95945050505050565b600080604083850312156142af576142ae61360e565b5b60006142bd85828601613661565b92505060206142ce858286016139a3565b9150509250929050565b600080602083850312156142ef576142ee61360e565b5b600083013567ffffffffffffffff81111561430d5761430c613613565b5b61431985828601613fe1565b92509250509250929050565b6000806040838503121561433c5761433b61360e565b5b600061434a85828601613661565b925050602061435b85828601613661565b9150509250929050565b600080600080600060a086880312156143815761438061360e565b5b600061438f88828901613661565b95505060206143a088828901613661565b94505060406143b188828901613697565b93505060606143c288828901613697565b925050608086013567ffffffffffffffff8111156143e3576143e2613613565b5b6143ef88828901613c13565b9150509295509295909350565b6000602082840312156144125761441161360e565b5b600061442084828501613661565b91505092915050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000614485602a83613833565b915061449082614429565b604082019050919050565b600060208201905081810360008301526144b481614478565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061450257607f821691505b602082108103614515576145146144bb565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614548816144ea565b614552818661451b565b9450600182166000811461456d5760018114614582576145b5565b60ff19831686528115158202860193506145b5565b61458b85614526565b60005b838110156145ad5781548189015260018201915060208101905061458e565b838801955050505b50505092915050565b60006145c982613828565b6145d3818561451b565b93506145e3818560208601613844565b80840191505092915050565b60006145fb828561453b565b915061460782846145be565b91508190509392505050565b7f616464726573735f20205a65726f3a696e76616c696420616464726573730000600082015250565b6000614649601e83613833565b915061465482614613565b602082019050919050565b600060208201905081810360008301526146788161463c565b9050919050565b7f6f6e6c792061646d696e2063616e2063616c6c2074686973206d6574686f6400600082015250565b60006146b5601f83613833565b91506146c08261467f565b602082019050919050565b600060208201905081810360008301526146e4816146a8565b9050919050565b60006146f7838561451b565b9350614704838584613bc2565b82840190509392505050565b600061471d8284866146eb565b91508190509392505050565b6000819050919050565b6000819050919050565b600061475861475361474e84614729565b614733565b613676565b9050919050565b6147688161473d565b82525050565b6000606082019050818103600083015261478981868861422b565b9050614798602083018561475f565b6147a5604083018461475f565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006147e882613676565b91506147f383613676565b925082820261480181613676565b91508282048414831517614818576148176147ae565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061485982613676565b915061486483613676565b9250826148745761487361481f565b5b828204905092915050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b60006148db602f83613833565b91506148e68261487f565b604082019050919050565b6000602082019050818103600083015261490a816148ce565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b600061496d602983613833565b915061497882614911565b604082019050919050565b6000602082019050818103600083015261499c81614960565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006149dd82613676565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a0f57614a0e6147ae565b5b600182019050919050565b7f496e76616c6964206c656e677468000000000000000000000000000000000000600082015250565b6000614a50600e83613833565b9150614a5b82614a1a565b602082019050919050565b60006020820190508181036000830152614a7f81614a43565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112614ab257614ab1614a86565b5b80840192508235915067ffffffffffffffff821115614ad457614ad3614a8b565b5b602083019250600182023603831315614af057614aef614a90565b5b509250929050565b6000614b0482846145be565b915081905092915050565b7f4d696e74696e672069732064697361626c656400000000000000000000000000600082015250565b6000614b45601383613833565b9150614b5082614b0f565b602082019050919050565b60006020820190508181036000830152614b7481614b38565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614bb1601f83613833565b9150614bbc82614b7b565b602082019050919050565b60006020820190508181036000830152614be081614ba4565b9050919050565b7f436f756e747279206e6f7420617661696c61626c650000000000000000000000600082015250565b6000614c1d601583613833565b9150614c2882614be7565b602082019050919050565b60006020820190508181036000830152614c4c81614c10565b9050919050565b7f436f756e747279204d6178204d696e7420526561636865640000000000000000600082015250565b6000614c89601883613833565b9150614c9482614c53565b602082019050919050565b60006020820190508181036000830152614cb881614c7c565b9050919050565b7f57726f6e67206d696e7420666565000000000000000000000000000000000000600082015250565b6000614cf5600e83613833565b9150614d0082614cbf565b602082019050919050565b60006020820190508181036000830152614d2481614ce8565b9050919050565b6000819050919050565b6000614d50614d4b614d4684614d2b565b614733565b613676565b9050919050565b614d6081614d35565b82525050565b6000604082019050614d7b6000830185614d57565b614d8860208301846136ec565b9392505050565b6000614d9a82613676565b9150614da583613676565b9250828201905080821115614dbd57614dbc6147ae565b5b92915050565b6000604082019050614dd860008301856136ec565b614de560208301846136ec565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e48602683613833565b9150614e5382614dec565b604082019050919050565b60006020820190508181036000830152614e7781614e3b565b9050919050565b6000614e8982613676565b9150614e9483613676565b9250828203905081811115614eac57614eab6147ae565b5b92915050565b6000614ebd82613676565b9150614ec883613676565b925082614ed857614ed761481f565b5b828206905092915050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000614f3f602883613833565b9150614f4a82614ee3565b604082019050919050565b60006020820190508181036000830152614f6e81614f32565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614fd1602583613833565b9150614fdc82614f75565b604082019050919050565b6000602082019050818103600083015261500081614fc4565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000615063602a83613833565b915061506e82615007565b604082019050919050565b6000602082019050818103600083015261509281615056565b9050919050565b600060408201905081810360008301526150b38185613f61565b905081810360208301526150c78184613f61565b90509392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615106602083613833565b9150615111826150d0565b602082019050919050565b60006020820190508181036000830152615135816150f9565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000615198602983613833565b91506151a38261513c565b604082019050919050565b600060208201905081810360008301526151c78161518b565b9050919050565b600081905092915050565b50565b60006151e96000836151ce565b91506151f4826151d9565b600082019050919050565b600061520a826151dc565b9150819050919050565b7f7472616e7366657220746f20657363726f77206661696c656400000000000000600082015250565b600061524a601983613833565b915061525582615214565b602082019050919050565b600060208201905081810360008301526152798161523d565b9050919050565b7f7472616e7366657220746f20646576656c6f706572206661696c656400000000600082015250565b60006152b6601c83613833565b91506152c182615280565b602082019050919050565b600060208201905081810360008301526152e5816152a9565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615348602183613833565b9150615353826152ec565b604082019050919050565b600060208201905081810360008301526153778161533b565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006153a58261537e565b6153af8185615389565b93506153bf818560208601613844565b6153c88161386e565b840191505092915050565b600060a0820190506153e86000830188613716565b6153f56020830187613716565b81810360408301526154078186613f61565b9050818103606083015261541b8185613f61565b9050818103608083015261542f818461539a565b90509695505050505050565b60008151905061544a8161376c565b92915050565b6000602082840312156154665761546561360e565b5b60006154748482850161543b565b91505092915050565b60008160e01c9050919050565b600060033d11156154a95760046000803e6154a660005161547d565b90505b90565b600060443d10615539576154be613604565b60043d036004823e80513d602482011167ffffffffffffffff821117156154e6575050615539565b808201805167ffffffffffffffff8111156155045750505050615539565b80602083010160043d038501811115615521575050505050615539565b61553082602001850186613a7d565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615598603483613833565b91506155a38261553c565b604082019050919050565b600060208201905081810360008301526155c78161558b565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b600061562a602883613833565b9150615635826155ce565b604082019050919050565b600060208201905081810360008301526156598161561d565b9050919050565b600060a0820190506156756000830188613716565b6156826020830187613716565b61568f60408301866136ec565b61569c60608301856136ec565b81810360808301526156ae818461539a565b9050969550505050505056fea2646970667358221220d2da32f80d712763b88f3ca119e1c261e65afc8fdabf2d0d7296224cb61763f564736f6c634300081100330000000000000000000000000000000000000000000000000000000000000080000000000000000000000000e53d7b50228d5713152dcabe3ce78aeb37ecd94b0000000000000000000000003b60d39a0afd9ca24ead59e8428dbfaf9538db35000000000000000000000000658cc97a9e5c142c847319817435017e85b3ad94000000000000000000000000000000000000000000000000000000000000002868747470733a2f2f776f726c64636f72652e737a6e2e67616d65732f6e66742f636f756e7472792f000000000000000000000000000000000000000000000000

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

0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000e53d7b50228d5713152dcabe3ce78aeb37ecd94b0000000000000000000000003b60d39a0afd9ca24ead59e8428dbfaf9538db35000000000000000000000000658cc97a9e5c142c847319817435017e85b3ad94000000000000000000000000000000000000000000000000000000000000002868747470733a2f2f776f726c64636f72652e737a6e2e67616d65732f6e66742f636f756e7472792f000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : uri_ (string): https://worldcore.szn.games/nft/country/
Arg [1] : _escrowAddress (address): 0xe53d7b50228d5713152dcabe3ce78aeb37ecd94b
Arg [2] : _developerAddress (address): 0x3b60d39a0afd9ca24ead59e8428dbfaf9538db35
Arg [3] : _adminAddress (address): 0x658cc97a9e5c142c847319817435017e85b3ad94

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 000000000000000000000000e53d7b50228d5713152dcabe3ce78aeb37ecd94b
Arg [2] : 0000000000000000000000003b60d39a0afd9ca24ead59e8428dbfaf9538db35
Arg [3] : 000000000000000000000000658cc97a9e5c142c847319817435017e85b3ad94
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000028
Arg [5] : 68747470733a2f2f776f726c64636f72652e737a6e2e67616d65732f6e66742f
Arg [6] : 636f756e7472792f000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

51002:7272:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33931:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51513:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53161:419;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51551:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58109:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57005:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53588:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51691:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21902:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;35875:439;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56723:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51307:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51354:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34327:524;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57204:548;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56460:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51721:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8032:103;;;;;;;;;;;;;:::i;:::-;;57780:321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;7384:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51217:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34924:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51596:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51258:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53825:640;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54773:1041;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35151:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35391:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8290:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33931:230;34017:7;34064:1;34045:21;;:7;:21;;;34037:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;34131:9;:13;34141:2;34131:13;;;;;;;;;;;:22;34145:7;34131:22;;;;;;;;;;;;;;;;34124:29;;33931:230;;;;:::o;51513:31::-;;;:::o;53161:419::-;53309:4;53366:26;53351:41;;;:11;:41;;;;:110;;;;53424:37;53409:52;;;:11;:52;;;;53351:110;:168;;;;53493:26;53478:41;;;:11;:41;;;;53351:168;:221;;;;53536:36;53560:11;53536:23;:36::i;:::-;53351:221;53331:241;;53161:419;;;:::o;51551:38::-;;;:::o;58109:162::-;58170:13;58226:7;58235:26;58252:8;58235:16;:26::i;:::-;58209:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58195:68;;58109:162;;;:::o;57005:159::-;52211:1;52189:24;;:10;:24;;;52181:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;52281:6;52267:20;;:10;:20;;;52259:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;57090:9:::1;57100:7;;57090:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;57083:25:::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;57124:32;57142:7;;57151:1;57154::::0;57124:32:::1;;;;;;;;;:::i;:::-;;;;;;;;57005:159:::0;;:::o;53588:166::-;52211:1;52189:24;;:10;:24;;;52181:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;52281:6;52267:20;;:10;:20;;;52259:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;53684:15:::1;53667:14;;:32;;;;;;;;;;;;;;;;;;53715:31;53730:15;53715:31;;;;;;:::i;:::-;;;;;;;;53588:166:::0;:::o;51691:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21902:442::-;21999:7;22008;22028:26;22057:17;:27;22075:8;22057:27;;;;;;;;;;;22028:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22129:1;22101:30;;:7;:16;;;:30;;;22097:92;;22158:19;22148:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22097:92;22201:21;22266:17;:15;:17::i;:::-;22225:58;;22239:7;:23;;;22226:36;;:10;:36;;;;:::i;:::-;22225:58;;;;:::i;:::-;22201:82;;22304:7;:16;;;22322:13;22296:40;;;;;;21902:442;;;;;:::o;35875:439::-;36116:12;:10;:12::i;:::-;36108:20;;:4;:20;;;:60;;;;36132:36;36149:4;36155:12;:10;:12::i;:::-;36132:16;:36::i;:::-;36108:60;36086:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;36254:52;36277:4;36283:2;36287:3;36292:7;36301:4;36254:22;:52::i;:::-;35875:439;;;;;:::o;56723:251::-;52211:1;52189:24;;:10;:24;;;52181:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;52281:6;52267:20;;:10;:20;;;52259:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;56881:31:::1;;;;;;;;56895:5;56881:31;;;;56902:3;56881:31;;;;56907:4;56881:31;;;;::::0;56860:9:::1;56870:7;;56860:18;;;;;;;:::i;:::-;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56928:38;56946:7;;56955:5;56962:3;56928:38;;;;;;;;;:::i;:::-;;;;;;;;56723:251:::0;;;;:::o;51307:40::-;51345:2;51307:40;:::o;51354:48::-;51398:4;51354:48;:::o;34327:524::-;34483:16;34544:3;:10;34525:8;:15;:29;34517:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;34613:30;34660:8;:15;34646:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34613:63;;34694:9;34689:122;34713:8;:15;34709:1;:19;34689:122;;;34769:30;34779:8;34788:1;34779:11;;;;;;;;:::i;:::-;;;;;;;;34792:3;34796:1;34792:6;;;;;;;;:::i;:::-;;;;;;;;34769:9;:30::i;:::-;34750:13;34764:1;34750:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;34730:3;;;;:::i;:::-;;;34689:122;;;;34830:13;34823:20;;;34327:524;;;;:::o;57204:548::-;52211:1;52189:24;;:10;:24;;;52181:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;52281:6;52267:20;;:10;:20;;;52259:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;57407:6:::1;;:13;;57383;;:20;;:37;57375:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;57482:4;;:11;;57458:13;;:20;;:35;57450:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;57528:9;57523:222;57547:13;;:20;;57543:1;:24;57523:222;;;57619:39;;;;;;;;57633:6;;57640:1;57633:9;;;;;;;:::i;:::-;;;;;;;;57619:39;;;;57644:4;;57649:1;57644:7;;;;;;;:::i;:::-;;;;;;;;57619:39;;;;57653:4;57619:39;;;;::::0;57589:9:::1;57599:13;;57613:1;57599:16;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;57589:27;;;;;;;:::i;:::-;;;;;;;;;;;;;:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57678:55;57696:13;;57710:1;57696:16;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;57714:6;;57721:1;57714:9;;;;;;;:::i;:::-;;;;;;;;57725:4;;57730:1;57725:7;;;;;;;:::i;:::-;;;;;;;;57678:55;;;;;;;;;:::i;:::-;;;;;;;;57569:3;;;;;:::i;:::-;;;;57523:222;;;;57204:548:::0;;;;;;:::o;56460:159::-;56556:7;56588:14;56603:7;56588:23;;;;;;:::i;:::-;;;;;;;;;;;;;;56581:30;;56460:159;;;:::o;51721:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;8032:103::-;7270:13;:11;:13::i;:::-;8097:30:::1;8124:1;8097:18;:30::i;:::-;8032:103::o:0;57780:321::-;57889:15;;57919:7;57941;57976:33;58012:9;58022:7;;58012:18;;;;;;;:::i;:::-;;;;;;;;;;;;;57976:54;;58049:7;;58058:11;:17;;;58077:11;:15;;;58041:52;;;;;;;;;57780:321;;;;;;;:::o;7384:87::-;7430:7;7457:6;;;;;;;;;;;7450:13;;7384:87;:::o;51217:34::-;;;;;;;;;;;;;:::o;34924:155::-;35019:52;35038:12;:10;:12::i;:::-;35052:8;35062;35019:18;:52::i;:::-;34924:155;;:::o;51596:41::-;;;:::o;51258:42::-;51293:7;51258:42;:::o;53825:640::-;52670:14;;;;;;;;;;;52662:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4309:1:::1;4907:7;;:19:::0;4899:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;4309:1;5040:7;:18;;;;53959:20:::2;53982:14;53997:7;;53982:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;53959:46;;54016:32;54051:9;54061:7;;54051:18;;;;;;;:::i;:::-;;;;;;;;;;;;;54016:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;54088:11;:18;;;54080:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;54166:11;:15;;;54151:12;:30;54143:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;54242:11;:17;;;54229:9;:30;54221:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54289:18;54310:20;54322:7;;54310:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;:20::i;:::-;54289:41;;54341:27;54358:9;54341:16;:27::i;:::-;54379:38;54385:12;:10;:12::i;:::-;54399:10;54411:1;54379:38;;;;;;;;;;;::::0;:5:::2;:38::i;:::-;54433:24;54443:1;54446:10;54433:24;;;;;;;:::i;:::-;;;;;;;;53948:517;;;4265:1:::1;5219:7;:22;;;;53825:640:::0;;:::o;54773:1041::-;52670:14;;;;;;;;;;;52662:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4309:1:::1;4907:7;;:19:::0;4899:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;4309:1;5040:7;:18;;;;54914:19:::2;54944:14:::0;54961:6:::2;;:13;;54944:30;;54985:20;55022:6;55008:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54985:44;;55086:24;55127:6;55113:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55086:48;;55150:9;55145:466;55169:6;55165:1;:10;55145:466;;;55197:20;55220:14;55235:6;;55242:1;55235:9;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;55220:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;55197:48;;55260:32;55295:9;55305:6;;55312:1;55305:9;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;55295:20;;;;;;;:::i;:::-;;;;;;;;;;;;;55260:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;55338:11;:18;;;55330:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;55420:11;:15;;;55405:12;:30;55397:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;55507:11;:17;;;55493:11;:31;;;;:::i;:::-;55479:45;;55552:1;55539:7;55547:1;55539:10;;;;;;;;:::i;:::-;;;;;;;:14;;;::::0;::::2;55577:22;55589:6;;55596:1;55589:9;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;55577:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;:22::i;:::-;55568:3;55572:1;55568:6;;;;;;;;:::i;:::-;;;;;;;:31;;;::::0;::::2;55182:429;;55177:3;;;;;:::i;:::-;;;;55145:466;;;;55642:11;55629:9;:24;55621:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;55683:42;55694:12;:10;:12::i;:::-;55708:3;55713:7;55683:42;;;;;;;;;;;::::0;:10:::2;:42::i;:::-;55736:29;55753:11;55736:16;:29::i;:::-;55781:25;55791:6;55799:3;55803:1;55799:6;;;;;;;;:::i;:::-;;;;;;;;55781:25;;;;;;;:::i;:::-;;;;;;;;54903:911;;;;4265:1:::1;5219:7;:22;;;;54773:1041:::0;;:::o;35151:168::-;35250:4;35274:18;:27;35293:7;35274:27;;;;;;;;;;;;;;;:37;35302:8;35274:37;;;;;;;;;;;;;;;;;;;;;;;;;35267:44;;35151:168;;;;:::o;35391:407::-;35607:12;:10;:12::i;:::-;35599:20;;:4;:20;;;:60;;;;35623:36;35640:4;35646:12;:10;:12::i;:::-;35623:16;:36::i;:::-;35599:60;35577:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;35745:45;35763:4;35769:2;35773;35777:6;35785:4;35745:17;:45::i;:::-;35391:407;;;;;:::o;8290:201::-;7270:13;:11;:13::i;:::-;8399:1:::1;8379:22;;:8;:22;;::::0;8371:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;8455:28;8474:8;8455:18;:28::i;:::-;8290:201:::0;:::o;50452:127::-;50559:1;50541:7;:14;;;:19;;;;;;;;;;;50452:127;:::o;21632:215::-;21734:4;21773:26;21758:41;;;:11;:41;;;;:81;;;;21803:36;21827:11;21803:23;:36::i;:::-;21758:81;21751:88;;21632:215;;;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;22626:97::-;22684:6;22710:5;22703:12;;22626:97;:::o;5935:98::-;5988:7;6015:10;6008:17;;5935:98;:::o;38110:1146::-;38337:7;:14;38323:3;:10;:28;38315:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;38429:1;38415:16;;:2;:16;;;38407:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;38486:16;38505:12;:10;:12::i;:::-;38486:31;;38530:60;38551:8;38561:4;38567:2;38571:3;38576:7;38585:4;38530:20;:60::i;:::-;38608:9;38603:421;38627:3;:10;38623:1;:14;38603:421;;;38659:10;38672:3;38676:1;38672:6;;;;;;;;:::i;:::-;;;;;;;;38659:19;;38693:14;38710:7;38718:1;38710:10;;;;;;;;:::i;:::-;;;;;;;;38693:27;;38737:19;38759:9;:13;38769:2;38759:13;;;;;;;;;;;:19;38773:4;38759:19;;;;;;;;;;;;;;;;38737:41;;38816:6;38801:11;:21;;38793:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;38949:6;38935:11;:20;38913:9;:13;38923:2;38913:13;;;;;;;;;;;:19;38927:4;38913:19;;;;;;;;;;;;;;;:42;;;;39006:6;38985:9;:13;38995:2;38985:13;;;;;;;;;;;:17;38999:2;38985:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;38644:380;;;38639:3;;;;:::i;:::-;;;38603:421;;;;39071:2;39041:47;;39065:4;39041:47;;39055:8;39041:47;;;39075:3;39080:7;39041:47;;;;;;;:::i;:::-;;;;;;;;39101:59;39121:8;39131:4;39137:2;39141:3;39146:7;39155:4;39101:19;:59::i;:::-;39173:75;39209:8;39219:4;39225:2;39229:3;39234:7;39243:4;39173:35;:75::i;:::-;38304:952;38110:1146;;;;;:::o;7549:132::-;7624:12;:10;:12::i;:::-;7613:23;;:7;:5;:7::i;:::-;:23;;;7605:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7549:132::o;8651:191::-;8725:16;8744:6;;;;;;;;;;;8725:25;;8770:8;8761:6;;:17;;;;;;;;;;;;;;;;;;8825:8;8794:40;;8815:8;8794:40;;;;;;;;;;;;8714:128;8651:191;:::o;44987:331::-;45142:8;45133:17;;:5;:17;;;45125:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;45245:8;45207:18;:25;45226:5;45207:25;;;;;;;;;;;;;;;:35;45233:8;45207:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;45291:8;45269:41;;45284:5;45269:41;;;45301:8;45269:41;;;;;;:::i;:::-;;;;;;;;44987:331;;;:::o;54473:228::-;54534:7;54554:18;54575:19;:9;:17;:19::i;:::-;54554:40;;54632:1;54605:14;54620:7;54605:23;;;;;;:::i;:::-;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;54644:21;:9;:19;:21::i;:::-;54683:10;54676:17;;;54473:228;;;:::o;55849:603::-;56037:14;56083:3;51345:2;56055:10;:24;;;;:::i;:::-;56054:32;;;;:::i;:::-;56037:49;;56097:16;56129:6;56116:10;:19;;;;:::i;:::-;56097:38;;56151:29;56159:8;56169:10;56151:29;;;;;;;:::i;:::-;;;;;;;;56192:12;56211:13;56210:20;;56238:8;56210:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56191:60;;;56270:7;56262:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;56319:15;56341:16;56340:23;;56371:6;56340:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56318:64;;;56401:10;56393:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;55903:549;;;;55849:603;:::o;40574:729::-;40741:1;40727:16;;:2;:16;;;40719:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;40794:16;40813:12;:10;:12::i;:::-;40794:31;;40836:20;40859:21;40877:2;40859:17;:21::i;:::-;40836:44;;40891:24;40918:25;40936:6;40918:17;:25::i;:::-;40891:52;;40956:66;40977:8;40995:1;40999:2;41003:3;41008:7;41017:4;40956:20;:66::i;:::-;41056:6;41035:9;:13;41045:2;41035:13;;;;;;;;;;;:17;41049:2;41035:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;41115:2;41078:52;;41111:1;41078:52;;41093:8;41078:52;;;41119:2;41123:6;41078:52;;;;;;;:::i;:::-;;;;;;;;41143:65;41163:8;41181:1;41185:2;41189:3;41194:7;41203:4;41143:19;:65::i;:::-;41221:74;41252:8;41270:1;41274:2;41278;41282:6;41290:4;41221:30;:74::i;:::-;40708:595;;;40574:729;;;;:::o;41706:813::-;41898:1;41884:16;;:2;:16;;;41876:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;41971:7;:14;41957:3;:10;:28;41949:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42043:16;42062:12;:10;:12::i;:::-;42043:31;;42087:66;42108:8;42126:1;42130:2;42134:3;42139:7;42148:4;42087:20;:66::i;:::-;42171:9;42166:103;42190:3;:10;42186:1;:14;42166:103;;;42247:7;42255:1;42247:10;;;;;;;;:::i;:::-;;;;;;;;42222:9;:17;42232:3;42236:1;42232:6;;;;;;;;:::i;:::-;;;;;;;;42222:17;;;;;;;;;;;:21;42240:2;42222:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;42202:3;;;;;:::i;:::-;;;;42166:103;;;;42322:2;42286:53;;42318:1;42286:53;;42300:8;42286:53;;;42326:3;42331:7;42286:53;;;;;;;:::i;:::-;;;;;;;;42352:65;42372:8;42390:1;42394:2;42398:3;42403:7;42412:4;42352:19;:65::i;:::-;42430:81;42466:8;42484:1;42488:2;42492:3;42497:7;42506:4;42430:35;:81::i;:::-;41865:654;41706:813;;;;:::o;36778:974::-;36980:1;36966:16;;:2;:16;;;36958:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37037:16;37056:12;:10;:12::i;:::-;37037:31;;37079:20;37102:21;37120:2;37102:17;:21::i;:::-;37079:44;;37134:24;37161:25;37179:6;37161:17;:25::i;:::-;37134:52;;37199:60;37220:8;37230:4;37236:2;37240:3;37245:7;37254:4;37199:20;:60::i;:::-;37272:19;37294:9;:13;37304:2;37294:13;;;;;;;;;;;:19;37308:4;37294:19;;;;;;;;;;;;;;;;37272:41;;37347:6;37332:11;:21;;37324:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;37472:6;37458:11;:20;37436:9;:13;37446:2;37436:13;;;;;;;;;;;:19;37450:4;37436:19;;;;;;;;;;;;;;;:42;;;;37521:6;37500:9;:13;37510:2;37500:13;;;;;;;;;;;:17;37514:2;37500:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;37576:2;37545:46;;37570:4;37545:46;;37560:8;37545:46;;;37580:2;37584:6;37545:46;;;;;;;:::i;:::-;;;;;;;;37604:59;37624:8;37634:4;37640:2;37644:3;37649:7;37658:4;37604:19;:59::i;:::-;37676:68;37707:8;37717:4;37723:2;37727;37731:6;37739:4;37676:30;:68::i;:::-;36947:805;;;;36778:974;;;;;:::o;32954:310::-;33056:4;33108:26;33093:41;;;:11;:41;;;;:110;;;;33166:37;33151:52;;;:11;:52;;;;33093:110;:163;;;;33220:36;33244:11;33220:23;:36::i;:::-;33093:163;33073:183;;32954:310;;;:::o;46276:221::-;;;;;;;:::o;47452:220::-;;;;;;;:::o;48432:813::-;48672:15;:2;:13;;;:15::i;:::-;48668:570;;;48725:2;48708:43;;;48752:8;48762:4;48768:3;48773:7;48782:4;48708:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48704:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;49100:6;49093:14;;;;;;;;;;;:::i;:::-;;;;;;;;48704:523;;;49149:62;;;;;;;;;;:::i;:::-;;;;;;;;48704:523;48881:48;;;48869:60;;;:8;:60;;;;48865:159;;48954:50;;;;;;;;;;:::i;:::-;;;;;;;;48865:159;48788:251;48668:570;48432:813;;;;;;:::o;50330:114::-;50395:7;50422;:14;;;50415:21;;50330:114;;;:::o;49253:198::-;49319:16;49348:22;49387:1;49373:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49348:41;;49411:7;49400:5;49406:1;49400:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;49438:5;49431:12;;;49253:198;;;:::o;47680:744::-;47895:15;:2;:13;;;:15::i;:::-;47891:526;;;47948:2;47931:38;;;47970:8;47980:4;47986:2;47990:6;47998:4;47931:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47927:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;48279:6;48272:14;;;;;;;;;;;:::i;:::-;;;;;;;;47927:479;;;48328:62;;;;;;;;;;:::i;:::-;;;;;;;;47927:479;48065:43;;;48053:55;;;:8;:55;;;;48049:154;;48133:50;;;;;;;;;;:::i;:::-;;;;;;;;48049:154;48004:214;47891:526;47680:744;;;;;;:::o;20082:157::-;20167:4;20206:25;20191:40;;;:11;:40;;;;20184:47;;20082:157;;;:::o;10082:326::-;10142:4;10399:1;10377:7;:19;;;:23;10370:30;;10082:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:118::-;2116:24;2134:5;2116:24;:::i;:::-;2111:3;2104:37;2029:118;;:::o;2153:222::-;2246:4;2284:2;2273:9;2269:18;2261:26;;2297:71;2365:1;2354:9;2350:17;2341:6;2297:71;:::i;:::-;2153:222;;;;:::o;2381:149::-;2417:7;2457:66;2450:5;2446:78;2435:89;;2381:149;;;:::o;2536:120::-;2608:23;2625:5;2608:23;:::i;:::-;2601:5;2598:34;2588:62;;2646:1;2643;2636:12;2588:62;2536:120;:::o;2662:137::-;2707:5;2745:6;2732:20;2723:29;;2761:32;2787:5;2761:32;:::i;:::-;2662:137;;;;:::o;2805:327::-;2863:6;2912:2;2900:9;2891:7;2887:23;2883:32;2880:119;;;2918:79;;:::i;:::-;2880:119;3038:1;3063:52;3107:7;3098:6;3087:9;3083:22;3063:52;:::i;:::-;3053:62;;3009:116;2805:327;;;;:::o;3138:90::-;3172:7;3215:5;3208:13;3201:21;3190:32;;3138:90;;;:::o;3234:109::-;3315:21;3330:5;3315:21;:::i;:::-;3310:3;3303:34;3234:109;;:::o;3349:210::-;3436:4;3474:2;3463:9;3459:18;3451:26;;3487:65;3549:1;3538:9;3534:17;3525:6;3487:65;:::i;:::-;3349:210;;;;:::o;3565:329::-;3624:6;3673:2;3661:9;3652:7;3648:23;3644:32;3641:119;;;3679:79;;:::i;:::-;3641:119;3799:1;3824:53;3869:7;3860:6;3849:9;3845:22;3824:53;:::i;:::-;3814:63;;3770:117;3565:329;;;;:::o;3900:99::-;3952:6;3986:5;3980:12;3970:22;;3900:99;;;:::o;4005:169::-;4089:11;4123:6;4118:3;4111:19;4163:4;4158:3;4154:14;4139:29;;4005:169;;;;:::o;4180:246::-;4261:1;4271:113;4285:6;4282:1;4279:13;4271:113;;;4370:1;4365:3;4361:11;4355:18;4351:1;4346:3;4342:11;4335:39;4307:2;4304:1;4300:10;4295:15;;4271:113;;;4418:1;4409:6;4404:3;4400:16;4393:27;4242:184;4180:246;;;:::o;4432:102::-;4473:6;4524:2;4520:7;4515:2;4508:5;4504:14;4500:28;4490:38;;4432:102;;;:::o;4540:377::-;4628:3;4656:39;4689:5;4656:39;:::i;:::-;4711:71;4775:6;4770:3;4711:71;:::i;:::-;4704:78;;4791:65;4849:6;4844:3;4837:4;4830:5;4826:16;4791:65;:::i;:::-;4881:29;4903:6;4881:29;:::i;:::-;4876:3;4872:39;4865:46;;4632:285;4540:377;;;;:::o;4923:313::-;5036:4;5074:2;5063:9;5059:18;5051:26;;5123:9;5117:4;5113:20;5109:1;5098:9;5094:17;5087:47;5151:78;5224:4;5215:6;5151:78;:::i;:::-;5143:86;;4923:313;;;;:::o;5242:117::-;5351:1;5348;5341:12;5365:117;5474:1;5471;5464:12;5488:117;5597:1;5594;5587:12;5625:553;5683:8;5693:6;5743:3;5736:4;5728:6;5724:17;5720:27;5710:122;;5751:79;;:::i;:::-;5710:122;5864:6;5851:20;5841:30;;5894:18;5886:6;5883:30;5880:117;;;5916:79;;:::i;:::-;5880:117;6030:4;6022:6;6018:17;6006:29;;6084:3;6076:4;6068:6;6064:17;6054:8;6050:32;6047:41;6044:128;;;6091:79;;:::i;:::-;6044:128;5625:553;;;;;:::o;6184:529::-;6255:6;6263;6312:2;6300:9;6291:7;6287:23;6283:32;6280:119;;;6318:79;;:::i;:::-;6280:119;6466:1;6455:9;6451:17;6438:31;6496:18;6488:6;6485:30;6482:117;;;6518:79;;:::i;:::-;6482:117;6631:65;6688:7;6679:6;6668:9;6664:22;6631:65;:::i;:::-;6613:83;;;;6409:297;6184:529;;;;;:::o;6719:116::-;6789:21;6804:5;6789:21;:::i;:::-;6782:5;6779:32;6769:60;;6825:1;6822;6815:12;6769:60;6719:116;:::o;6841:133::-;6884:5;6922:6;6909:20;6900:29;;6938:30;6962:5;6938:30;:::i;:::-;6841:133;;;;:::o;6980:323::-;7036:6;7085:2;7073:9;7064:7;7060:23;7056:32;7053:119;;;7091:79;;:::i;:::-;7053:119;7211:1;7236:50;7278:7;7269:6;7258:9;7254:22;7236:50;:::i;:::-;7226:60;;7182:114;6980:323;;;;:::o;7309:474::-;7377:6;7385;7434:2;7422:9;7413:7;7409:23;7405:32;7402:119;;;7440:79;;:::i;:::-;7402:119;7560:1;7585:53;7630:7;7621:6;7610:9;7606:22;7585:53;:::i;:::-;7575:63;;7531:117;7687:2;7713:53;7758:7;7749:6;7738:9;7734:22;7713:53;:::i;:::-;7703:63;;7658:118;7309:474;;;;;:::o;7789:332::-;7910:4;7948:2;7937:9;7933:18;7925:26;;7961:71;8029:1;8018:9;8014:17;8005:6;7961:71;:::i;:::-;8042:72;8110:2;8099:9;8095:18;8086:6;8042:72;:::i;:::-;7789:332;;;;;:::o;8127:180::-;8175:77;8172:1;8165:88;8272:4;8269:1;8262:15;8296:4;8293:1;8286:15;8313:281;8396:27;8418:4;8396:27;:::i;:::-;8388:6;8384:40;8526:6;8514:10;8511:22;8490:18;8478:10;8475:34;8472:62;8469:88;;;8537:18;;:::i;:::-;8469:88;8577:10;8573:2;8566:22;8356:238;8313:281;;:::o;8600:129::-;8634:6;8661:20;;:::i;:::-;8651:30;;8690:33;8718:4;8710:6;8690:33;:::i;:::-;8600:129;;;:::o;8735:311::-;8812:4;8902:18;8894:6;8891:30;8888:56;;;8924:18;;:::i;:::-;8888:56;8974:4;8966:6;8962:17;8954:25;;9034:4;9028;9024:15;9016:23;;8735:311;;;:::o;9069:710::-;9165:5;9190:81;9206:64;9263:6;9206:64;:::i;:::-;9190:81;:::i;:::-;9181:90;;9291:5;9320:6;9313:5;9306:21;9354:4;9347:5;9343:16;9336:23;;9407:4;9399:6;9395:17;9387:6;9383:30;9436:3;9428:6;9425:15;9422:122;;;9455:79;;:::i;:::-;9422:122;9570:6;9553:220;9587:6;9582:3;9579:15;9553:220;;;9662:3;9691:37;9724:3;9712:10;9691:37;:::i;:::-;9686:3;9679:50;9758:4;9753:3;9749:14;9742:21;;9629:144;9613:4;9608:3;9604:14;9597:21;;9553:220;;;9557:21;9171:608;;9069:710;;;;;:::o;9802:370::-;9873:5;9922:3;9915:4;9907:6;9903:17;9899:27;9889:122;;9930:79;;:::i;:::-;9889:122;10047:6;10034:20;10072:94;10162:3;10154:6;10147:4;10139:6;10135:17;10072:94;:::i;:::-;10063:103;;9879:293;9802:370;;;;:::o;10178:117::-;10287:1;10284;10277:12;10301:307;10362:4;10452:18;10444:6;10441:30;10438:56;;;10474:18;;:::i;:::-;10438:56;10512:29;10534:6;10512:29;:::i;:::-;10504:37;;10596:4;10590;10586:15;10578:23;;10301:307;;;:::o;10614:146::-;10711:6;10706:3;10701;10688:30;10752:1;10743:6;10738:3;10734:16;10727:27;10614:146;;;:::o;10766:423::-;10843:5;10868:65;10884:48;10925:6;10884:48;:::i;:::-;10868:65;:::i;:::-;10859:74;;10956:6;10949:5;10942:21;10994:4;10987:5;10983:16;11032:3;11023:6;11018:3;11014:16;11011:25;11008:112;;;11039:79;;:::i;:::-;11008:112;11129:54;11176:6;11171:3;11166;11129:54;:::i;:::-;10849:340;10766:423;;;;;:::o;11208:338::-;11263:5;11312:3;11305:4;11297:6;11293:17;11289:27;11279:122;;11320:79;;:::i;:::-;11279:122;11437:6;11424:20;11462:78;11536:3;11528:6;11521:4;11513:6;11509:17;11462:78;:::i;:::-;11453:87;;11269:277;11208:338;;;;:::o;11552:1509::-;11706:6;11714;11722;11730;11738;11787:3;11775:9;11766:7;11762:23;11758:33;11755:120;;;11794:79;;:::i;:::-;11755:120;11914:1;11939:53;11984:7;11975:6;11964:9;11960:22;11939:53;:::i;:::-;11929:63;;11885:117;12041:2;12067:53;12112:7;12103:6;12092:9;12088:22;12067:53;:::i;:::-;12057:63;;12012:118;12197:2;12186:9;12182:18;12169:32;12228:18;12220:6;12217:30;12214:117;;;12250:79;;:::i;:::-;12214:117;12355:78;12425:7;12416:6;12405:9;12401:22;12355:78;:::i;:::-;12345:88;;12140:303;12510:2;12499:9;12495:18;12482:32;12541:18;12533:6;12530:30;12527:117;;;12563:79;;:::i;:::-;12527:117;12668:78;12738:7;12729:6;12718:9;12714:22;12668:78;:::i;:::-;12658:88;;12453:303;12823:3;12812:9;12808:19;12795:33;12855:18;12847:6;12844:30;12841:117;;;12877:79;;:::i;:::-;12841:117;12982:62;13036:7;13027:6;13016:9;13012:22;12982:62;:::i;:::-;12972:72;;12766:288;11552:1509;;;;;;;;:::o;13067:819::-;13156:6;13164;13172;13180;13229:2;13217:9;13208:7;13204:23;13200:32;13197:119;;;13235:79;;:::i;:::-;13197:119;13383:1;13372:9;13368:17;13355:31;13413:18;13405:6;13402:30;13399:117;;;13435:79;;:::i;:::-;13399:117;13548:65;13605:7;13596:6;13585:9;13581:22;13548:65;:::i;:::-;13530:83;;;;13326:297;13662:2;13688:53;13733:7;13724:6;13713:9;13709:22;13688:53;:::i;:::-;13678:63;;13633:118;13790:2;13816:53;13861:7;13852:6;13841:9;13837:22;13816:53;:::i;:::-;13806:63;;13761:118;13067:819;;;;;;;:::o;13892:109::-;13928:7;13968:26;13961:5;13957:38;13946:49;;13892:109;;;:::o;14007:115::-;14092:23;14109:5;14092:23;:::i;:::-;14087:3;14080:36;14007:115;;:::o;14128:218::-;14219:4;14257:2;14246:9;14242:18;14234:26;;14270:69;14336:1;14325:9;14321:17;14312:6;14270:69;:::i;:::-;14128:218;;;;:::o;14352:311::-;14429:4;14519:18;14511:6;14508:30;14505:56;;;14541:18;;:::i;:::-;14505:56;14591:4;14583:6;14579:17;14571:25;;14651:4;14645;14641:15;14633:23;;14352:311;;;:::o;14686:710::-;14782:5;14807:81;14823:64;14880:6;14823:64;:::i;:::-;14807:81;:::i;:::-;14798:90;;14908:5;14937:6;14930:5;14923:21;14971:4;14964:5;14960:16;14953:23;;15024:4;15016:6;15012:17;15004:6;15000:30;15053:3;15045:6;15042:15;15039:122;;;15072:79;;:::i;:::-;15039:122;15187:6;15170:220;15204:6;15199:3;15196:15;15170:220;;;15279:3;15308:37;15341:3;15329:10;15308:37;:::i;:::-;15303:3;15296:50;15375:4;15370:3;15366:14;15359:21;;15246:144;15230:4;15225:3;15221:14;15214:21;;15170:220;;;15174:21;14788:608;;14686:710;;;;;:::o;15419:370::-;15490:5;15539:3;15532:4;15524:6;15520:17;15516:27;15506:122;;15547:79;;:::i;:::-;15506:122;15664:6;15651:20;15689:94;15779:3;15771:6;15764:4;15756:6;15752:17;15689:94;:::i;:::-;15680:103;;15496:293;15419:370;;;;:::o;15795:894::-;15913:6;15921;15970:2;15958:9;15949:7;15945:23;15941:32;15938:119;;;15976:79;;:::i;:::-;15938:119;16124:1;16113:9;16109:17;16096:31;16154:18;16146:6;16143:30;16140:117;;;16176:79;;:::i;:::-;16140:117;16281:78;16351:7;16342:6;16331:9;16327:22;16281:78;:::i;:::-;16271:88;;16067:302;16436:2;16425:9;16421:18;16408:32;16467:18;16459:6;16456:30;16453:117;;;16489:79;;:::i;:::-;16453:117;16594:78;16664:7;16655:6;16644:9;16640:22;16594:78;:::i;:::-;16584:88;;16379:303;15795:894;;;;;:::o;16695:114::-;16762:6;16796:5;16790:12;16780:22;;16695:114;;;:::o;16815:184::-;16914:11;16948:6;16943:3;16936:19;16988:4;16983:3;16979:14;16964:29;;16815:184;;;;:::o;17005:132::-;17072:4;17095:3;17087:11;;17125:4;17120:3;17116:14;17108:22;;17005:132;;;:::o;17143:108::-;17220:24;17238:5;17220:24;:::i;:::-;17215:3;17208:37;17143:108;;:::o;17257:179::-;17326:10;17347:46;17389:3;17381:6;17347:46;:::i;:::-;17425:4;17420:3;17416:14;17402:28;;17257:179;;;;:::o;17442:113::-;17512:4;17544;17539:3;17535:14;17527:22;;17442:113;;;:::o;17591:732::-;17710:3;17739:54;17787:5;17739:54;:::i;:::-;17809:86;17888:6;17883:3;17809:86;:::i;:::-;17802:93;;17919:56;17969:5;17919:56;:::i;:::-;17998:7;18029:1;18014:284;18039:6;18036:1;18033:13;18014:284;;;18115:6;18109:13;18142:63;18201:3;18186:13;18142:63;:::i;:::-;18135:70;;18228:60;18281:6;18228:60;:::i;:::-;18218:70;;18074:224;18061:1;18058;18054:9;18049:14;;18014:284;;;18018:14;18314:3;18307:10;;17715:608;;;17591:732;;;;:::o;18329:373::-;18472:4;18510:2;18499:9;18495:18;18487:26;;18559:9;18553:4;18549:20;18545:1;18534:9;18530:17;18523:47;18587:108;18690:4;18681:6;18587:108;:::i;:::-;18579:116;;18329:373;;;;:::o;18724:580::-;18809:8;18819:6;18869:3;18862:4;18854:6;18850:17;18846:27;18836:122;;18877:79;;:::i;:::-;18836:122;18990:6;18977:20;18967:30;;19020:18;19012:6;19009:30;19006:117;;;19042:79;;:::i;:::-;19006:117;19156:4;19148:6;19144:17;19132:29;;19210:3;19202:4;19194:6;19190:17;19180:8;19176:32;19173:41;19170:128;;;19217:79;;:::i;:::-;19170:128;18724:580;;;;;:::o;19327:568::-;19400:8;19410:6;19460:3;19453:4;19445:6;19441:17;19437:27;19427:122;;19468:79;;:::i;:::-;19427:122;19581:6;19568:20;19558:30;;19611:18;19603:6;19600:30;19597:117;;;19633:79;;:::i;:::-;19597:117;19747:4;19739:6;19735:17;19723:29;;19801:3;19793:4;19785:6;19781:17;19771:8;19767:32;19764:41;19761:128;;;19808:79;;:::i;:::-;19761:128;19327:568;;;;;:::o;19901:1333::-;20071:6;20079;20087;20095;20103;20111;20160:2;20148:9;20139:7;20135:23;20131:32;20128:119;;;20166:79;;:::i;:::-;20128:119;20314:1;20303:9;20299:17;20286:31;20344:18;20336:6;20333:30;20330:117;;;20366:79;;:::i;:::-;20330:117;20479:92;20563:7;20554:6;20543:9;20539:22;20479:92;:::i;:::-;20461:110;;;;20257:324;20648:2;20637:9;20633:18;20620:32;20679:18;20671:6;20668:30;20665:117;;;20701:79;;:::i;:::-;20665:117;20814:80;20886:7;20877:6;20866:9;20862:22;20814:80;:::i;:::-;20796:98;;;;20591:313;20971:2;20960:9;20956:18;20943:32;21002:18;20994:6;20991:30;20988:117;;;21024:79;;:::i;:::-;20988:117;21137:80;21209:7;21200:6;21189:9;21185:22;21137:80;:::i;:::-;21119:98;;;;20914:313;19901:1333;;;;;;;;:::o;21240:308::-;21302:4;21392:18;21384:6;21381:30;21378:56;;;21414:18;;:::i;:::-;21378:56;21452:29;21474:6;21452:29;:::i;:::-;21444:37;;21536:4;21530;21526:15;21518:23;;21240:308;;;:::o;21554:425::-;21632:5;21657:66;21673:49;21715:6;21673:49;:::i;:::-;21657:66;:::i;:::-;21648:75;;21746:6;21739:5;21732:21;21784:4;21777:5;21773:16;21822:3;21813:6;21808:3;21804:16;21801:25;21798:112;;;21829:79;;:::i;:::-;21798:112;21919:54;21966:6;21961:3;21956;21919:54;:::i;:::-;21638:341;21554:425;;;;;:::o;21999:340::-;22055:5;22104:3;22097:4;22089:6;22085:17;22081:27;22071:122;;22112:79;;:::i;:::-;22071:122;22229:6;22216:20;22254:79;22329:3;22321:6;22314:4;22306:6;22302:17;22254:79;:::i;:::-;22245:88;;22061:278;21999:340;;;;:::o;22345:509::-;22414:6;22463:2;22451:9;22442:7;22438:23;22434:32;22431:119;;;22469:79;;:::i;:::-;22431:119;22617:1;22606:9;22602:17;22589:31;22647:18;22639:6;22636:30;22633:117;;;22669:79;;:::i;:::-;22633:117;22774:63;22829:7;22820:6;22809:9;22805:22;22774:63;:::i;:::-;22764:73;;22560:287;22345:509;;;;:::o;22884:317::-;22982:3;23003:71;23067:6;23062:3;23003:71;:::i;:::-;22996:78;;23084:56;23133:6;23128:3;23121:5;23084:56;:::i;:::-;23165:29;23187:6;23165:29;:::i;:::-;23160:3;23156:39;23149:46;;22884:317;;;;;:::o;23207:553::-;23386:4;23424:2;23413:9;23409:18;23401:26;;23473:9;23467:4;23463:20;23459:1;23448:9;23444:17;23437:47;23501:88;23584:4;23575:6;23567;23501:88;:::i;:::-;23493:96;;23599:72;23667:2;23656:9;23652:18;23643:6;23599:72;:::i;:::-;23681;23749:2;23738:9;23734:18;23725:6;23681:72;:::i;:::-;23207:553;;;;;;;:::o;23766:468::-;23831:6;23839;23888:2;23876:9;23867:7;23863:23;23859:32;23856:119;;;23894:79;;:::i;:::-;23856:119;24014:1;24039:53;24084:7;24075:6;24064:9;24060:22;24039:53;:::i;:::-;24029:63;;23985:117;24141:2;24167:50;24209:7;24200:6;24189:9;24185:22;24167:50;:::i;:::-;24157:60;;24112:115;23766:468;;;;;:::o;24240:583::-;24338:6;24346;24395:2;24383:9;24374:7;24370:23;24366:32;24363:119;;;24401:79;;:::i;:::-;24363:119;24549:1;24538:9;24534:17;24521:31;24579:18;24571:6;24568:30;24565:117;;;24601:79;;:::i;:::-;24565:117;24714:92;24798:7;24789:6;24778:9;24774:22;24714:92;:::i;:::-;24696:110;;;;24492:324;24240:583;;;;;:::o;24829:474::-;24897:6;24905;24954:2;24942:9;24933:7;24929:23;24925:32;24922:119;;;24960:79;;:::i;:::-;24922:119;25080:1;25105:53;25150:7;25141:6;25130:9;25126:22;25105:53;:::i;:::-;25095:63;;25051:117;25207:2;25233:53;25278:7;25269:6;25258:9;25254:22;25233:53;:::i;:::-;25223:63;;25178:118;24829:474;;;;;:::o;25309:1089::-;25413:6;25421;25429;25437;25445;25494:3;25482:9;25473:7;25469:23;25465:33;25462:120;;;25501:79;;:::i;:::-;25462:120;25621:1;25646:53;25691:7;25682:6;25671:9;25667:22;25646:53;:::i;:::-;25636:63;;25592:117;25748:2;25774:53;25819:7;25810:6;25799:9;25795:22;25774:53;:::i;:::-;25764:63;;25719:118;25876:2;25902:53;25947:7;25938:6;25927:9;25923:22;25902:53;:::i;:::-;25892:63;;25847:118;26004:2;26030:53;26075:7;26066:6;26055:9;26051:22;26030:53;:::i;:::-;26020:63;;25975:118;26160:3;26149:9;26145:19;26132:33;26192:18;26184:6;26181:30;26178:117;;;26214:79;;:::i;:::-;26178:117;26319:62;26373:7;26364:6;26353:9;26349:22;26319:62;:::i;:::-;26309:72;;26103:288;25309:1089;;;;;;;;:::o;26404:329::-;26463:6;26512:2;26500:9;26491:7;26487:23;26483:32;26480:119;;;26518:79;;:::i;:::-;26480:119;26638:1;26663:53;26708:7;26699:6;26688:9;26684:22;26663:53;:::i;:::-;26653:63;;26609:117;26404:329;;;;:::o;26739:229::-;26879:34;26875:1;26867:6;26863:14;26856:58;26948:12;26943:2;26935:6;26931:15;26924:37;26739:229;:::o;26974:366::-;27116:3;27137:67;27201:2;27196:3;27137:67;:::i;:::-;27130:74;;27213:93;27302:3;27213:93;:::i;:::-;27331:2;27326:3;27322:12;27315:19;;26974:366;;;:::o;27346:419::-;27512:4;27550:2;27539:9;27535:18;27527:26;;27599:9;27593:4;27589:20;27585:1;27574:9;27570:17;27563:47;27627:131;27753:4;27627:131;:::i;:::-;27619:139;;27346:419;;;:::o;27771:180::-;27819:77;27816:1;27809:88;27916:4;27913:1;27906:15;27940:4;27937:1;27930:15;27957:320;28001:6;28038:1;28032:4;28028:12;28018:22;;28085:1;28079:4;28075:12;28106:18;28096:81;;28162:4;28154:6;28150:17;28140:27;;28096:81;28224:2;28216:6;28213:14;28193:18;28190:38;28187:84;;28243:18;;:::i;:::-;28187:84;28008:269;27957:320;;;:::o;28283:148::-;28385:11;28422:3;28407:18;;28283:148;;;;:::o;28437:141::-;28486:4;28509:3;28501:11;;28532:3;28529:1;28522:14;28566:4;28563:1;28553:18;28545:26;;28437:141;;;:::o;28608:874::-;28711:3;28748:5;28742:12;28777:36;28803:9;28777:36;:::i;:::-;28829:89;28911:6;28906:3;28829:89;:::i;:::-;28822:96;;28949:1;28938:9;28934:17;28965:1;28960:166;;;;29140:1;29135:341;;;;28927:549;;28960:166;29044:4;29040:9;29029;29025:25;29020:3;29013:38;29106:6;29099:14;29092:22;29084:6;29080:35;29075:3;29071:45;29064:52;;28960:166;;29135:341;29202:38;29234:5;29202:38;:::i;:::-;29262:1;29276:154;29290:6;29287:1;29284:13;29276:154;;;29364:7;29358:14;29354:1;29349:3;29345:11;29338:35;29414:1;29405:7;29401:15;29390:26;;29312:4;29309:1;29305:12;29300:17;;29276:154;;;29459:6;29454:3;29450:16;29443:23;;29142:334;;28927:549;;28715:767;;28608:874;;;;:::o;29488:390::-;29594:3;29622:39;29655:5;29622:39;:::i;:::-;29677:89;29759:6;29754:3;29677:89;:::i;:::-;29670:96;;29775:65;29833:6;29828:3;29821:4;29814:5;29810:16;29775:65;:::i;:::-;29865:6;29860:3;29856:16;29849:23;;29598:280;29488:390;;;;:::o;29884:429::-;30061:3;30083:92;30171:3;30162:6;30083:92;:::i;:::-;30076:99;;30192:95;30283:3;30274:6;30192:95;:::i;:::-;30185:102;;30304:3;30297:10;;29884:429;;;;;:::o;30319:180::-;30459:32;30455:1;30447:6;30443:14;30436:56;30319:180;:::o;30505:366::-;30647:3;30668:67;30732:2;30727:3;30668:67;:::i;:::-;30661:74;;30744:93;30833:3;30744:93;:::i;:::-;30862:2;30857:3;30853:12;30846:19;;30505:366;;;:::o;30877:419::-;31043:4;31081:2;31070:9;31066:18;31058:26;;31130:9;31124:4;31120:20;31116:1;31105:9;31101:17;31094:47;31158:131;31284:4;31158:131;:::i;:::-;31150:139;;30877:419;;;:::o;31302:181::-;31442:33;31438:1;31430:6;31426:14;31419:57;31302:181;:::o;31489:366::-;31631:3;31652:67;31716:2;31711:3;31652:67;:::i;:::-;31645:74;;31728:93;31817:3;31728:93;:::i;:::-;31846:2;31841:3;31837:12;31830:19;;31489:366;;;:::o;31861:419::-;32027:4;32065:2;32054:9;32050:18;32042:26;;32114:9;32108:4;32104:20;32100:1;32089:9;32085:17;32078:47;32142:131;32268:4;32142:131;:::i;:::-;32134:139;;31861:419;;;:::o;32310:330::-;32426:3;32447:89;32529:6;32524:3;32447:89;:::i;:::-;32440:96;;32546:56;32595:6;32590:3;32583:5;32546:56;:::i;:::-;32627:6;32622:3;32618:16;32611:23;;32310:330;;;;;:::o;32646:295::-;32788:3;32810:105;32911:3;32902:6;32894;32810:105;:::i;:::-;32803:112;;32932:3;32925:10;;32646:295;;;;;:::o;32947:85::-;32992:7;33021:5;33010:16;;32947:85;;;:::o;33038:60::-;33066:3;33087:5;33080:12;;33038:60;;;:::o;33104:158::-;33162:9;33195:61;33213:42;33222:32;33248:5;33222:32;:::i;:::-;33213:42;:::i;:::-;33195:61;:::i;:::-;33182:74;;33104:158;;;:::o;33268:147::-;33363:45;33402:5;33363:45;:::i;:::-;33358:3;33351:58;33268:147;;:::o;33421:585::-;33616:4;33654:2;33643:9;33639:18;33631:26;;33703:9;33697:4;33693:20;33689:1;33678:9;33674:17;33667:47;33731:88;33814:4;33805:6;33797;33731:88;:::i;:::-;33723:96;;33829:80;33905:2;33894:9;33890:18;33881:6;33829:80;:::i;:::-;33919;33995:2;33984:9;33980:18;33971:6;33919:80;:::i;:::-;33421:585;;;;;;;:::o;34012:180::-;34060:77;34057:1;34050:88;34157:4;34154:1;34147:15;34181:4;34178:1;34171:15;34198:410;34238:7;34261:20;34279:1;34261:20;:::i;:::-;34256:25;;34295:20;34313:1;34295:20;:::i;:::-;34290:25;;34350:1;34347;34343:9;34372:30;34390:11;34372:30;:::i;:::-;34361:41;;34551:1;34542:7;34538:15;34535:1;34532:22;34512:1;34505:9;34485:83;34462:139;;34581:18;;:::i;:::-;34462:139;34246:362;34198:410;;;;:::o;34614:180::-;34662:77;34659:1;34652:88;34759:4;34756:1;34749:15;34783:4;34780:1;34773:15;34800:185;34840:1;34857:20;34875:1;34857:20;:::i;:::-;34852:25;;34891:20;34909:1;34891:20;:::i;:::-;34886:25;;34930:1;34920:35;;34935:18;;:::i;:::-;34920:35;34977:1;34974;34970:9;34965:14;;34800:185;;;;:::o;34991:234::-;35131:34;35127:1;35119:6;35115:14;35108:58;35200:17;35195:2;35187:6;35183:15;35176:42;34991:234;:::o;35231:366::-;35373:3;35394:67;35458:2;35453:3;35394:67;:::i;:::-;35387:74;;35470:93;35559:3;35470:93;:::i;:::-;35588:2;35583:3;35579:12;35572:19;;35231:366;;;:::o;35603:419::-;35769:4;35807:2;35796:9;35792:18;35784:26;;35856:9;35850:4;35846:20;35842:1;35831:9;35827:17;35820:47;35884:131;36010:4;35884:131;:::i;:::-;35876:139;;35603:419;;;:::o;36028:228::-;36168:34;36164:1;36156:6;36152:14;36145:58;36237:11;36232:2;36224:6;36220:15;36213:36;36028:228;:::o;36262:366::-;36404:3;36425:67;36489:2;36484:3;36425:67;:::i;:::-;36418:74;;36501:93;36590:3;36501:93;:::i;:::-;36619:2;36614:3;36610:12;36603:19;;36262:366;;;:::o;36634:419::-;36800:4;36838:2;36827:9;36823:18;36815:26;;36887:9;36881:4;36877:20;36873:1;36862:9;36858:17;36851:47;36915:131;37041:4;36915:131;:::i;:::-;36907:139;;36634:419;;;:::o;37059:180::-;37107:77;37104:1;37097:88;37204:4;37201:1;37194:15;37228:4;37225:1;37218:15;37245:233;37284:3;37307:24;37325:5;37307:24;:::i;:::-;37298:33;;37353:66;37346:5;37343:77;37340:103;;37423:18;;:::i;:::-;37340:103;37470:1;37463:5;37459:13;37452:20;;37245:233;;;:::o;37484:164::-;37624:16;37620:1;37612:6;37608:14;37601:40;37484:164;:::o;37654:366::-;37796:3;37817:67;37881:2;37876:3;37817:67;:::i;:::-;37810:74;;37893:93;37982:3;37893:93;:::i;:::-;38011:2;38006:3;38002:12;37995:19;;37654:366;;;:::o;38026:419::-;38192:4;38230:2;38219:9;38215:18;38207:26;;38279:9;38273:4;38269:20;38265:1;38254:9;38250:17;38243:47;38307:131;38433:4;38307:131;:::i;:::-;38299:139;;38026:419;;;:::o;38451:117::-;38560:1;38557;38550:12;38574:117;38683:1;38680;38673:12;38697:117;38806:1;38803;38796:12;38820:725;38898:4;38904:6;38960:11;38947:25;39060:1;39054:4;39050:12;39039:8;39023:14;39019:29;39015:48;38995:18;38991:73;38981:168;;39068:79;;:::i;:::-;38981:168;39180:18;39170:8;39166:33;39158:41;;39232:4;39219:18;39209:28;;39260:18;39252:6;39249:30;39246:117;;;39282:79;;:::i;:::-;39246:117;39390:2;39384:4;39380:13;39372:21;;39447:4;39439:6;39435:17;39419:14;39415:38;39409:4;39405:49;39402:136;;;39457:79;;:::i;:::-;39402:136;38911:634;38820:725;;;;;:::o;39551:275::-;39683:3;39705:95;39796:3;39787:6;39705:95;:::i;:::-;39698:102;;39817:3;39810:10;;39551:275;;;;:::o;39832:169::-;39972:21;39968:1;39960:6;39956:14;39949:45;39832:169;:::o;40007:366::-;40149:3;40170:67;40234:2;40229:3;40170:67;:::i;:::-;40163:74;;40246:93;40335:3;40246:93;:::i;:::-;40364:2;40359:3;40355:12;40348:19;;40007:366;;;:::o;40379:419::-;40545:4;40583:2;40572:9;40568:18;40560:26;;40632:9;40626:4;40622:20;40618:1;40607:9;40603:17;40596:47;40660:131;40786:4;40660:131;:::i;:::-;40652:139;;40379:419;;;:::o;40804:181::-;40944:33;40940:1;40932:6;40928:14;40921:57;40804:181;:::o;40991:366::-;41133:3;41154:67;41218:2;41213:3;41154:67;:::i;:::-;41147:74;;41230:93;41319:3;41230:93;:::i;:::-;41348:2;41343:3;41339:12;41332:19;;40991:366;;;:::o;41363:419::-;41529:4;41567:2;41556:9;41552:18;41544:26;;41616:9;41610:4;41606:20;41602:1;41591:9;41587:17;41580:47;41644:131;41770:4;41644:131;:::i;:::-;41636:139;;41363:419;;;:::o;41788:171::-;41928:23;41924:1;41916:6;41912:14;41905:47;41788:171;:::o;41965:366::-;42107:3;42128:67;42192:2;42187:3;42128:67;:::i;:::-;42121:74;;42204:93;42293:3;42204:93;:::i;:::-;42322:2;42317:3;42313:12;42306:19;;41965:366;;;:::o;42337:419::-;42503:4;42541:2;42530:9;42526:18;42518:26;;42590:9;42584:4;42580:20;42576:1;42565:9;42561:17;42554:47;42618:131;42744:4;42618:131;:::i;:::-;42610:139;;42337:419;;;:::o;42762:174::-;42902:26;42898:1;42890:6;42886:14;42879:50;42762:174;:::o;42942:366::-;43084:3;43105:67;43169:2;43164:3;43105:67;:::i;:::-;43098:74;;43181:93;43270:3;43181:93;:::i;:::-;43299:2;43294:3;43290:12;43283:19;;42942:366;;;:::o;43314:419::-;43480:4;43518:2;43507:9;43503:18;43495:26;;43567:9;43561:4;43557:20;43553:1;43542:9;43538:17;43531:47;43595:131;43721:4;43595:131;:::i;:::-;43587:139;;43314:419;;;:::o;43739:164::-;43879:16;43875:1;43867:6;43863:14;43856:40;43739:164;:::o;43909:366::-;44051:3;44072:67;44136:2;44131:3;44072:67;:::i;:::-;44065:74;;44148:93;44237:3;44148:93;:::i;:::-;44266:2;44261:3;44257:12;44250:19;;43909:366;;;:::o;44281:419::-;44447:4;44485:2;44474:9;44470:18;44462:26;;44534:9;44528:4;44524:20;44520:1;44509:9;44505:17;44498:47;44562:131;44688:4;44562:131;:::i;:::-;44554:139;;44281:419;;;:::o;44706:85::-;44751:7;44780:5;44769:16;;44706:85;;;:::o;44797:158::-;44855:9;44888:61;44906:42;44915:32;44941:5;44915:32;:::i;:::-;44906:42;:::i;:::-;44888:61;:::i;:::-;44875:74;;44797:158;;;:::o;44961:147::-;45056:45;45095:5;45056:45;:::i;:::-;45051:3;45044:58;44961:147;;:::o;45114:348::-;45243:4;45281:2;45270:9;45266:18;45258:26;;45294:79;45370:1;45359:9;45355:17;45346:6;45294:79;:::i;:::-;45383:72;45451:2;45440:9;45436:18;45427:6;45383:72;:::i;:::-;45114:348;;;;;:::o;45468:191::-;45508:3;45527:20;45545:1;45527:20;:::i;:::-;45522:25;;45561:20;45579:1;45561:20;:::i;:::-;45556:25;;45604:1;45601;45597:9;45590:16;;45625:3;45622:1;45619:10;45616:36;;;45632:18;;:::i;:::-;45616:36;45468:191;;;;:::o;45665:332::-;45786:4;45824:2;45813:9;45809:18;45801:26;;45837:71;45905:1;45894:9;45890:17;45881:6;45837:71;:::i;:::-;45918:72;45986:2;45975:9;45971:18;45962:6;45918:72;:::i;:::-;45665:332;;;;;:::o;46003:225::-;46143:34;46139:1;46131:6;46127:14;46120:58;46212:8;46207:2;46199:6;46195:15;46188:33;46003:225;:::o;46234:366::-;46376:3;46397:67;46461:2;46456:3;46397:67;:::i;:::-;46390:74;;46473:93;46562:3;46473:93;:::i;:::-;46591:2;46586:3;46582:12;46575:19;;46234:366;;;:::o;46606:419::-;46772:4;46810:2;46799:9;46795:18;46787:26;;46859:9;46853:4;46849:20;46845:1;46834:9;46830:17;46823:47;46887:131;47013:4;46887:131;:::i;:::-;46879:139;;46606:419;;;:::o;47031:194::-;47071:4;47091:20;47109:1;47091:20;:::i;:::-;47086:25;;47125:20;47143:1;47125:20;:::i;:::-;47120:25;;47169:1;47166;47162:9;47154:17;;47193:1;47187:4;47184:11;47181:37;;;47198:18;;:::i;:::-;47181:37;47031:194;;;;:::o;47231:176::-;47263:1;47280:20;47298:1;47280:20;:::i;:::-;47275:25;;47314:20;47332:1;47314:20;:::i;:::-;47309:25;;47353:1;47343:35;;47358:18;;:::i;:::-;47343:35;47399:1;47396;47392:9;47387:14;;47231:176;;;;:::o;47413:227::-;47553:34;47549:1;47541:6;47537:14;47530:58;47622:10;47617:2;47609:6;47605:15;47598:35;47413:227;:::o;47646:366::-;47788:3;47809:67;47873:2;47868:3;47809:67;:::i;:::-;47802:74;;47885:93;47974:3;47885:93;:::i;:::-;48003:2;47998:3;47994:12;47987:19;;47646:366;;;:::o;48018:419::-;48184:4;48222:2;48211:9;48207:18;48199:26;;48271:9;48265:4;48261:20;48257:1;48246:9;48242:17;48235:47;48299:131;48425:4;48299:131;:::i;:::-;48291:139;;48018:419;;;:::o;48443:224::-;48583:34;48579:1;48571:6;48567:14;48560:58;48652:7;48647:2;48639:6;48635:15;48628:32;48443:224;:::o;48673:366::-;48815:3;48836:67;48900:2;48895:3;48836:67;:::i;:::-;48829:74;;48912:93;49001:3;48912:93;:::i;:::-;49030:2;49025:3;49021:12;49014:19;;48673:366;;;:::o;49045:419::-;49211:4;49249:2;49238:9;49234:18;49226:26;;49298:9;49292:4;49288:20;49284:1;49273:9;49269:17;49262:47;49326:131;49452:4;49326:131;:::i;:::-;49318:139;;49045:419;;;:::o;49470:229::-;49610:34;49606:1;49598:6;49594:14;49587:58;49679:12;49674:2;49666:6;49662:15;49655:37;49470:229;:::o;49705:366::-;49847:3;49868:67;49932:2;49927:3;49868:67;:::i;:::-;49861:74;;49944:93;50033:3;49944:93;:::i;:::-;50062:2;50057:3;50053:12;50046:19;;49705:366;;;:::o;50077:419::-;50243:4;50281:2;50270:9;50266:18;50258:26;;50330:9;50324:4;50320:20;50316:1;50305:9;50301:17;50294:47;50358:131;50484:4;50358:131;:::i;:::-;50350:139;;50077:419;;;:::o;50502:634::-;50723:4;50761:2;50750:9;50746:18;50738:26;;50810:9;50804:4;50800:20;50796:1;50785:9;50781:17;50774:47;50838:108;50941:4;50932:6;50838:108;:::i;:::-;50830:116;;50993:9;50987:4;50983:20;50978:2;50967:9;50963:18;50956:48;51021:108;51124:4;51115:6;51021:108;:::i;:::-;51013:116;;50502:634;;;;;:::o;51142:182::-;51282:34;51278:1;51270:6;51266:14;51259:58;51142:182;:::o;51330:366::-;51472:3;51493:67;51557:2;51552:3;51493:67;:::i;:::-;51486:74;;51569:93;51658:3;51569:93;:::i;:::-;51687:2;51682:3;51678:12;51671:19;;51330:366;;;:::o;51702:419::-;51868:4;51906:2;51895:9;51891:18;51883:26;;51955:9;51949:4;51945:20;51941:1;51930:9;51926:17;51919:47;51983:131;52109:4;51983:131;:::i;:::-;51975:139;;51702:419;;;:::o;52127:228::-;52267:34;52263:1;52255:6;52251:14;52244:58;52336:11;52331:2;52323:6;52319:15;52312:36;52127:228;:::o;52361:366::-;52503:3;52524:67;52588:2;52583:3;52524:67;:::i;:::-;52517:74;;52600:93;52689:3;52600:93;:::i;:::-;52718:2;52713:3;52709:12;52702:19;;52361:366;;;:::o;52733:419::-;52899:4;52937:2;52926:9;52922:18;52914:26;;52986:9;52980:4;52976:20;52972:1;52961:9;52957:17;52950:47;53014:131;53140:4;53014:131;:::i;:::-;53006:139;;52733:419;;;:::o;53158:147::-;53259:11;53296:3;53281:18;;53158:147;;;;:::o;53311:114::-;;:::o;53431:398::-;53590:3;53611:83;53692:1;53687:3;53611:83;:::i;:::-;53604:90;;53703:93;53792:3;53703:93;:::i;:::-;53821:1;53816:3;53812:11;53805:18;;53431:398;;;:::o;53835:379::-;54019:3;54041:147;54184:3;54041:147;:::i;:::-;54034:154;;54205:3;54198:10;;53835:379;;;:::o;54220:175::-;54360:27;54356:1;54348:6;54344:14;54337:51;54220:175;:::o;54401:366::-;54543:3;54564:67;54628:2;54623:3;54564:67;:::i;:::-;54557:74;;54640:93;54729:3;54640:93;:::i;:::-;54758:2;54753:3;54749:12;54742:19;;54401:366;;;:::o;54773:419::-;54939:4;54977:2;54966:9;54962:18;54954:26;;55026:9;55020:4;55016:20;55012:1;55001:9;54997:17;54990:47;55054:131;55180:4;55054:131;:::i;:::-;55046:139;;54773:419;;;:::o;55198:178::-;55338:30;55334:1;55326:6;55322:14;55315:54;55198:178;:::o;55382:366::-;55524:3;55545:67;55609:2;55604:3;55545:67;:::i;:::-;55538:74;;55621:93;55710:3;55621:93;:::i;:::-;55739:2;55734:3;55730:12;55723:19;;55382:366;;;:::o;55754:419::-;55920:4;55958:2;55947:9;55943:18;55935:26;;56007:9;56001:4;55997:20;55993:1;55982:9;55978:17;55971:47;56035:131;56161:4;56035:131;:::i;:::-;56027:139;;55754:419;;;:::o;56179:220::-;56319:34;56315:1;56307:6;56303:14;56296:58;56388:3;56383:2;56375:6;56371:15;56364:28;56179:220;:::o;56405:366::-;56547:3;56568:67;56632:2;56627:3;56568:67;:::i;:::-;56561:74;;56644:93;56733:3;56644:93;:::i;:::-;56762:2;56757:3;56753:12;56746:19;;56405:366;;;:::o;56777:419::-;56943:4;56981:2;56970:9;56966:18;56958:26;;57030:9;57024:4;57020:20;57016:1;57005:9;57001:17;56994:47;57058:131;57184:4;57058:131;:::i;:::-;57050:139;;56777:419;;;:::o;57202:98::-;57253:6;57287:5;57281:12;57271:22;;57202:98;;;:::o;57306:168::-;57389:11;57423:6;57418:3;57411:19;57463:4;57458:3;57454:14;57439:29;;57306:168;;;;:::o;57480:373::-;57566:3;57594:38;57626:5;57594:38;:::i;:::-;57648:70;57711:6;57706:3;57648:70;:::i;:::-;57641:77;;57727:65;57785:6;57780:3;57773:4;57766:5;57762:16;57727:65;:::i;:::-;57817:29;57839:6;57817:29;:::i;:::-;57812:3;57808:39;57801:46;;57570:283;57480:373;;;;:::o;57859:1053::-;58182:4;58220:3;58209:9;58205:19;58197:27;;58234:71;58302:1;58291:9;58287:17;58278:6;58234:71;:::i;:::-;58315:72;58383:2;58372:9;58368:18;58359:6;58315:72;:::i;:::-;58434:9;58428:4;58424:20;58419:2;58408:9;58404:18;58397:48;58462:108;58565:4;58556:6;58462:108;:::i;:::-;58454:116;;58617:9;58611:4;58607:20;58602:2;58591:9;58587:18;58580:48;58645:108;58748:4;58739:6;58645:108;:::i;:::-;58637:116;;58801:9;58795:4;58791:20;58785:3;58774:9;58770:19;58763:49;58829:76;58900:4;58891:6;58829:76;:::i;:::-;58821:84;;57859:1053;;;;;;;;:::o;58918:141::-;58974:5;59005:6;58999:13;58990:22;;59021:32;59047:5;59021:32;:::i;:::-;58918:141;;;;:::o;59065:349::-;59134:6;59183:2;59171:9;59162:7;59158:23;59154:32;59151:119;;;59189:79;;:::i;:::-;59151:119;59309:1;59334:63;59389:7;59380:6;59369:9;59365:22;59334:63;:::i;:::-;59324:73;;59280:127;59065:349;;;;:::o;59420:106::-;59464:8;59513:5;59508:3;59504:15;59483:36;;59420:106;;;:::o;59532:183::-;59567:3;59605:1;59587:16;59584:23;59581:128;;;59643:1;59640;59637;59622:23;59665:34;59696:1;59690:8;59665:34;:::i;:::-;59658:41;;59581:128;59532:183;:::o;59721:711::-;59760:3;59798:4;59780:16;59777:26;59806:5;59774:39;59835:20;;:::i;:::-;59910:1;59892:16;59888:24;59885:1;59879:4;59864:49;59943:4;59937:11;60042:16;60035:4;60027:6;60023:17;60020:39;59987:18;59979:6;59976:30;59960:113;59957:146;;;60088:5;;;;59957:146;60134:6;60128:4;60124:17;60170:3;60164:10;60197:18;60189:6;60186:30;60183:43;;;60219:5;;;;;;60183:43;60267:6;60260:4;60255:3;60251:14;60247:27;60326:1;60308:16;60304:24;60298:4;60294:35;60289:3;60286:44;60283:57;;;60333:5;;;;;;;60283:57;60350;60398:6;60392:4;60388:17;60380:6;60376:30;60370:4;60350:57;:::i;:::-;60423:3;60416:10;;59764:668;;;;;59721:711;;:::o;60438:239::-;60578:34;60574:1;60566:6;60562:14;60555:58;60647:22;60642:2;60634:6;60630:15;60623:47;60438:239;:::o;60683:366::-;60825:3;60846:67;60910:2;60905:3;60846:67;:::i;:::-;60839:74;;60922:93;61011:3;60922:93;:::i;:::-;61040:2;61035:3;61031:12;61024:19;;60683:366;;;:::o;61055:419::-;61221:4;61259:2;61248:9;61244:18;61236:26;;61308:9;61302:4;61298:20;61294:1;61283:9;61279:17;61272:47;61336:131;61462:4;61336:131;:::i;:::-;61328:139;;61055:419;;;:::o;61480:227::-;61620:34;61616:1;61608:6;61604:14;61597:58;61689:10;61684:2;61676:6;61672:15;61665:35;61480:227;:::o;61713:366::-;61855:3;61876:67;61940:2;61935:3;61876:67;:::i;:::-;61869:74;;61952:93;62041:3;61952:93;:::i;:::-;62070:2;62065:3;62061:12;62054:19;;61713:366;;;:::o;62085:419::-;62251:4;62289:2;62278:9;62274:18;62266:26;;62338:9;62332:4;62328:20;62324:1;62313:9;62309:17;62302:47;62366:131;62492:4;62366:131;:::i;:::-;62358:139;;62085:419;;;:::o;62510:751::-;62733:4;62771:3;62760:9;62756:19;62748:27;;62785:71;62853:1;62842:9;62838:17;62829:6;62785:71;:::i;:::-;62866:72;62934:2;62923:9;62919:18;62910:6;62866:72;:::i;:::-;62948;63016:2;63005:9;63001:18;62992:6;62948:72;:::i;:::-;63030;63098:2;63087:9;63083:18;63074:6;63030:72;:::i;:::-;63150:9;63144:4;63140:20;63134:3;63123:9;63119:19;63112:49;63178:76;63249:4;63240:6;63178:76;:::i;:::-;63170:84;;62510:751;;;;;;;;:::o

Swarm Source

ipfs://d2da32f80d712763b88f3ca119e1c261e65afc8fdabf2d0d7296224cb61763f5
Loading