ETH Price: $2,512.80 (+0.51%)

Token

CyberRonin Haruka (Haruka)
 

Overview

Max Total Supply

504 Haruka

Holders

252

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 Haruka
0x77D7A0237819072e0eAD5e754AAA4eDEF35BcFCF
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Haruka

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// 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/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

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

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

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

// File: contracts/CyberRonin Haruka.sol


pragma solidity ^0.8.4;





contract Haruka is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;
    bytes32 public root;

    uint256 MAX_MINTS = 55;
    uint256 MAX_SUPPLY = 5555;
    uint256 MAX_SUPPLY_PRIVATE_WHITELISTED = 55;

    uint256 public mintRatePrivateWhitelist = 0 ether;
    uint256 public mintRatePublicWhitelist = 0.055 ether;
    uint256 public mintRatePublicSale = 0.069 ether;

    bool public paused = false;
    bool public revealed = false;
    bool public privateWhitelisted = true;
    bool public publicWhitelisted = false;
    bool public publicSale = false;

    uint256 public mintedPublicWhitelistAddressLimit = 2;
    uint256 public mintedPublicAddressLimit = 3;

    address[] public mintedPublicWhitelistAddresses;
    
    mapping(address => uint256) public publicWhitelistAddressMintedBalance;
    
    string public baseURI = "ipfs://QmNWFJgHgTH5aneQXTT6AfDXKMqGQoA7whAftZUtkFHFjK/";
    string public uriSuffix = ".json";    
    string public hiddenMetadataUri;

    address constant public privateWLAddress = 0xE0eDcd0b10E86f2309f24bED584E2909eD268e48;

    constructor(bytes32 _root) ERC721A("CyberRonin Haruka", "Haruka") {
        setHiddenMetadataUri("ipfs://QmNWFJgHgTH5aneQXTT6AfDXKMqGQoA7whAftZUtkFHFjK/Hidden.json");
        root = _root;
    }

    modifier mintCompliance(uint256 quantity) {
        require(!paused, "The contract is paused!");
        require(isValidateEvent(), "The all event state is false");
        require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough tokens left");
        _;
    }
    
    function privateMint(uint256 quantity) external payable mintCompliance(quantity) {
        require(quantity <= MAX_MINTS,  "Max minting per tx have exceeded");
        require(publicSale == false, "Public sale not false");
        require(mintRatePrivateWhitelist == 0, "Set mintrate to 0");
        require(msg.sender == privateWLAddress, "You are not on private whitelist to perform minting");
        require(totalSupply() + quantity <= MAX_SUPPLY_PRIVATE_WHITELISTED, "Not enough tokens left on private whitelist sale");

        _safeMint(msg.sender, quantity);
    }

    function publicWhitelistMint(uint256 quantity, bytes32[] memory proof) external payable mintCompliance(quantity) {
        require(privateWhitelisted == false, "Set private whitelist to false");
        require(publicSale == false, "Public sale not false");
        require(isValidWhitelistedPublic(proof, keccak256(abi.encodePacked(msg.sender))), "You are not whitelisted to perform minting");

        require(quantity <= mintedPublicWhitelistAddressLimit,  "Max minting per tx have limited on public whitelist");
        require(msg.value >= (mintRatePublicWhitelist * quantity), "Not enough ether sent");

        uint amountToWithdraw = publicWhitelistAddressMintedBalance[msg.sender];

        if(isMintedPublicWhitelistAddress(msg.sender) == true) {
            uint256 ownerPWTokenCount = amountToWithdraw;
            require(ownerPWTokenCount + quantity <= mintedPublicWhitelistAddressLimit, "Minting have exceeded on public whitelist sale");
        }
        
        mintedPublicWhitelistAddresses.push(msg.sender);

        for (uint256 i = 0; i < quantity; i++) {
            publicWhitelistAddressMintedBalance[msg.sender]++;
        }

        _safeMint(msg.sender, quantity);
    }

    function publicMint(uint256 quantity) external payable mintCompliance(quantity) {
        require(publicSale == true, "Public sale not true");
        require(quantity <= mintedPublicAddressLimit,  "Max minting per trx have limited on public sale");
        require(msg.value >= (mintRatePublicSale * quantity), "Not enough ether sent");

        if(isMintedPublicWhitelistAddress(msg.sender) == true) {
            uint256 ownerPublicTokenCount = publicWhitelistAddressMintedBalance[msg.sender];
            require(ownerPublicTokenCount + quantity <= mintedPublicAddressLimit, "Minting have exceeded on public sale");
        }
        
        mintedPublicWhitelistAddresses.push(msg.sender);
        
        for (uint256 i = 0; i < quantity; i++) {
            publicWhitelistAddressMintedBalance[msg.sender]++;
        }

        _safeMint(msg.sender, quantity);
    }
    
    function withdraw() external payable onlyOwner {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    function setPaused(bool _state) public onlyOwner {
        paused = _state;
    }

    function setRevealed(bool _state) public onlyOwner {
        revealed = _state;
    }

    function setPublicSale(bool _state) public onlyOwner {
        publicSale = _state;
    }

    function setPublicWhitelistedAddressLimit(uint256 _limit) public onlyOwner {
        mintedPublicWhitelistAddressLimit = _limit;
    }

    function setPublicAddressLimit(uint256 _limit) public onlyOwner {
        mintedPublicAddressLimit = _limit;
    }

    function setPrivateWhitelisted(bool _state) public onlyOwner {
        privateWhitelisted = _state;
    }

    function setPublicWhitelisted(bool _state) public onlyOwner {
        publicWhitelisted = _state;
    }

    function setBaseURI(string memory _baseUri) public onlyOwner {
        baseURI = _baseUri;
    }

    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }

    function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
        hiddenMetadataUri = _hiddenMetadataUri;
    }
    
    function isValidateEvent() public view returns (bool)
    {
     if((privateWhitelisted == false) && (publicWhitelisted == false) && (publicSale == false)) {
         return false;
     } else {
         return true;
     }
    } 

    function walletOfOwner(address _owner) public view returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = 1;
        uint256 ownedTokenIndex = 0;

        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= MAX_SUPPLY) {
        address currentTokenOwner = ownerOf(currentTokenId);

        if (currentTokenOwner == _owner) {
            ownedTokenIds[ownedTokenIndex] = currentTokenId;

            ownedTokenIndex++;
        }

        currentTokenId++;
        }

        return ownedTokenIds;
    }

    function isMintedPublicWhitelistAddress(address _user) public view returns (bool)
    {
        for (uint i = 0; i < mintedPublicWhitelistAddresses.length; i++) {
            if (mintedPublicWhitelistAddresses[i] == _user) {
                    return true;
                }
            }
            return false;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        
        if (revealed == false) {
            return hiddenMetadataUri;
        }

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

    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    function isValidWhitelistedPublic(bytes32[] memory proof, bytes32 leaf) public view returns (bool) {
        return MerkleProof.verify(proof, root, leaf);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isMintedPublicWhitelistAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValidWhitelistedPublic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isValidateEvent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintRatePrivateWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintRatePublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintRatePublicWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedPublicAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedPublicWhitelistAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintedPublicWhitelistAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"privateMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"privateWLAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicWhitelistAddressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"publicWhitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPrivateWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setPublicAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPublicWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setPublicWhitelistedAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526037600b556115b3600c556037600d556000600e5566c3663566a58000600f5566f52322698080006010556000601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff0219169083151502179055506001601160026101000a81548160ff0219169083151502179055506000601160036101000a81548160ff0219169083151502179055506000601160046101000a81548160ff0219169083151502179055506002601255600360135560405180606001604052806036815260200162005e346036913960169080519060200190620000f192919062000435565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250601790805190602001906200013f92919062000435565b503480156200014d57600080fd5b5060405162005e6a38038062005e6a8339818101604052810190620001739190620004fc565b6040518060400160405280601181526020017f4379626572526f6e696e20486172756b610000000000000000000000000000008152506040518060400160405280600681526020017f486172756b6100000000000000000000000000000000000000000000000000008152508160029080519060200190620001f792919062000435565b5080600390805190602001906200021092919062000435565b50620002216200028960201b60201c565b6000819055505050620002496200023d6200029260201b60201c565b6200029a60201b60201c565b60016009819055506200027b60405180608001604052806041815260200162005df3604191396200036060201b60201c565b80600a81905550506200063f565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003706200029260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003966200040b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003e69062000555565b60405180910390fd5b80601890805190602001906200040792919062000435565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620004439062000592565b90600052602060002090601f016020900481019282620004675760008555620004b3565b82601f106200048257805160ff1916838001178555620004b3565b82800160010185558215620004b3579182015b82811115620004b257825182559160200191906001019062000495565b5b509050620004c29190620004c6565b5090565b5b80821115620004e1576000816000905550600101620004c7565b5090565b600081519050620004f68162000625565b92915050565b600060208284031215620005155762000514620005f7565b5b60006200052584828501620004e5565b91505092915050565b60006200053d60208362000577565b91506200054a82620005fc565b602082019050919050565b6000602082019050818103600083015262000570816200052e565b9050919050565b600082825260208201905092915050565b6000819050919050565b60006002820490506001821680620005ab57607f821691505b60208210811415620005c257620005c1620005c8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620006308162000588565b81146200063c57600080fd5b50565b6157a4806200064f6000396000f3fe6080604052600436106102ff5760003560e01c80635c975abb11610190578063a9c9aa2b116100dc578063e0a8085311610095578063ec9320e41161006f578063ec9320e414610b4a578063ed8efe6814610b73578063f2fde38b14610b9e578063f76e484e14610bc7576102ff565b8063e0a8085314610ab9578063e985e9c514610ae2578063ebf0c71714610b1f576102ff565b8063a9c9aa2b146109ba578063abfe40a8146109e5578063b88d4fde14610a01578063bd6d726114610a2a578063becf259614610a53578063c87b56dd14610a7c576102ff565b80638da5cb5b11610149578063a1307d7911610123578063a1307d7914610910578063a1a9ab9f1461093b578063a22cb46514610966578063a45ba8e71461098f576102ff565b80638da5cb5b1461088f57806395d89b41146108ba5780639f6c437b146108e5576102ff565b80635c975abb1461077f5780636352211e146107aa5780636c0360eb146107e757806370a0823114610812578063715018a61461084f57806374bd8afb14610866576102ff565b80632db115441161024f578063499a3ca2116102085780635503a0e8116101e25780635503a0e8146106c557806355f804b3146106f057806359e3afbf146107195780635aca1bb614610756576102ff565b8063499a3ca2146106555780634fdd43cb14610671578063518302271461069a576102ff565b80632db115441461057357806333bc1c5c1461058f57806337534b5c146105ba5780633ccfd60b146105e557806342842e0e146105ef578063438b630014610618576102ff565b80630ca01ad9116102bc57806316ba10e01161029657806316ba10e0146104cd57806316c38b3c146104f657806318160ddd1461051f57806323b872dd1461054a576102ff565b80630ca01ad91461043a578063108a5661146104655780631117cf1514610490576102ff565b806301ffc9a71461030457806303354c351461034157806306fdde031461036c578063081812fc14610397578063095ea7b3146103d45780630b7f1999146103fd575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190614345565b610c04565b6040516103389190614a34565b60405180910390f35b34801561034d57600080fd5b50610356610ce6565b6040516103639190614d0c565b60405180910390f35b34801561037857600080fd5b50610381610cec565b60405161038e9190614a6a565b60405180910390f35b3480156103a357600080fd5b506103be60048036038101906103b991906143e8565b610d7e565b6040516103cb91906149ab565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f6919061427c565b610dfa565b005b34801561040957600080fd5b50610424600480360381019061041f91906140f9565b610f05565b6040516104319190614a34565b60405180910390f35b34801561044657600080fd5b5061044f610fb4565b60405161045c9190614d0c565b60405180910390f35b34801561047157600080fd5b5061047a610fba565b6040516104879190614a34565b60405180910390f35b34801561049c57600080fd5b506104b760048036038101906104b291906143e8565b610fcd565b6040516104c491906149ab565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef919061439f565b61100c565b005b34801561050257600080fd5b5061051d60048036038101906105189190614318565b6110a2565b005b34801561052b57600080fd5b5061053461113b565b6040516105419190614d0c565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190614166565b611152565b005b61058d600480360381019061058891906143e8565b611162565b005b34801561059b57600080fd5b506105a46114cc565b6040516105b19190614a34565b60405180910390f35b3480156105c657600080fd5b506105cf6114df565b6040516105dc9190614a34565b60405180910390f35b6105ed6114f2565b005b3480156105fb57600080fd5b5061061660048036038101906106119190614166565b61161d565b005b34801561062457600080fd5b5061063f600480360381019061063a91906140f9565b61163d565b60405161064c9190614a12565b60405180910390f35b61066f600480360381019061066a9190614415565b611748565b005b34801561067d57600080fd5b506106986004803603810190610693919061439f565b611b7e565b005b3480156106a657600080fd5b506106af611c14565b6040516106bc9190614a34565b60405180910390f35b3480156106d157600080fd5b506106da611c27565b6040516106e79190614a6a565b60405180910390f35b3480156106fc57600080fd5b506107176004803603810190610712919061439f565b611cb5565b005b34801561072557600080fd5b50610740600480360381019061073b91906140f9565b611d4b565b60405161074d9190614d0c565b60405180910390f35b34801561076257600080fd5b5061077d60048036038101906107789190614318565b611d63565b005b34801561078b57600080fd5b50610794611dfc565b6040516107a19190614a34565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc91906143e8565b611e0f565b6040516107de91906149ab565b60405180910390f35b3480156107f357600080fd5b506107fc611e25565b6040516108099190614a6a565b60405180910390f35b34801561081e57600080fd5b50610839600480360381019061083491906140f9565b611eb3565b6040516108469190614d0c565b60405180910390f35b34801561085b57600080fd5b50610864611f83565b005b34801561087257600080fd5b5061088d600480360381019061088891906143e8565b61200b565b005b34801561089b57600080fd5b506108a4612091565b6040516108b191906149ab565b60405180910390f35b3480156108c657600080fd5b506108cf6120bb565b6040516108dc9190614a6a565b60405180910390f35b3480156108f157600080fd5b506108fa61214d565b6040516109079190614a34565b60405180910390f35b34801561091c57600080fd5b506109256121b9565b6040516109329190614d0c565b60405180910390f35b34801561094757600080fd5b506109506121bf565b60405161095d9190614d0c565b60405180910390f35b34801561097257600080fd5b5061098d6004803603810190610988919061423c565b6121c5565b005b34801561099b57600080fd5b506109a461233d565b6040516109b19190614a6a565b60405180910390f35b3480156109c657600080fd5b506109cf6123cb565b6040516109dc91906149ab565b60405180910390f35b6109ff60048036038101906109fa91906143e8565b6123e3565b005b348015610a0d57600080fd5b50610a286004803603810190610a2391906141b9565b612699565b005b348015610a3657600080fd5b50610a516004803603810190610a4c9190614318565b612715565b005b348015610a5f57600080fd5b50610a7a6004803603810190610a7591906143e8565b6127ae565b005b348015610a8857600080fd5b50610aa36004803603810190610a9e91906143e8565b612834565b604051610ab09190614a6a565b60405180910390f35b348015610ac557600080fd5b50610ae06004803603810190610adb9190614318565b61298d565b005b348015610aee57600080fd5b50610b096004803603810190610b049190614126565b612a26565b604051610b169190614a34565b60405180910390f35b348015610b2b57600080fd5b50610b34612aba565b604051610b419190614a4f565b60405180910390f35b348015610b5657600080fd5b50610b716004803603810190610b6c9190614318565b612ac0565b005b348015610b7f57600080fd5b50610b88612b59565b604051610b959190614d0c565b60405180910390f35b348015610baa57600080fd5b50610bc56004803603810190610bc091906140f9565b612b5f565b005b348015610bd357600080fd5b50610bee6004803603810190610be991906142bc565b612c57565b604051610bfb9190614a34565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ccf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cdf5750610cde82612c6e565b5b9050919050565b600e5481565b606060028054610cfb9061504b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d279061504b565b8015610d745780601f10610d4957610100808354040283529160200191610d74565b820191906000526020600020905b815481529060010190602001808311610d5757829003601f168201915b5050505050905090565b6000610d8982612cd8565b610dbf576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e0582611e0f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e6d576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e8c612d26565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ebe5750610ebc81610eb7612d26565b612a26565b155b15610ef5576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f00838383612d2e565b505050565b600080600090505b601480549050811015610fa9578273ffffffffffffffffffffffffffffffffffffffff1660148281548110610f4557610f446151d9565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610f96576001915050610faf565b8080610fa1906150ae565b915050610f0d565b50600090505b919050565b600f5481565b601160029054906101000a900460ff1681565b60148181548110610fdd57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611014612d26565b73ffffffffffffffffffffffffffffffffffffffff16611032612091565b73ffffffffffffffffffffffffffffffffffffffff1614611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f90614bec565b60405180910390fd5b806017908051906020019061109e929190613e17565b5050565b6110aa612d26565b73ffffffffffffffffffffffffffffffffffffffff166110c8612091565b73ffffffffffffffffffffffffffffffffffffffff161461111e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111590614bec565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b6000611145612de0565b6001546000540303905090565b61115d838383612de9565b505050565b80601160009054906101000a900460ff16156111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa90614c0c565b60405180910390fd5b6111bb61214d565b6111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f190614c4c565b60405180910390fd5b600c548161120661113b565b6112109190614e76565b1115611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124890614b8c565b60405180910390fd5b60011515601160049054906101000a900460ff161515146112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90614bac565b60405180910390fd5b6013548211156112ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e390614cac565b60405180910390fd5b816010546112fa9190614efd565b34101561133c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133390614c8c565b60405180910390fd5b6001151561134933610f05565b151514156113e7576000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060135483826113a49190614e76565b11156113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90614b2c565b60405180910390fd5b505b6014339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b828110156114bd57601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906114a5906150ae565b919050555080806114b5906150ae565b91505061144d565b506114c8338361329f565b5050565b601160049054906101000a900460ff1681565b601160039054906101000a900460ff1681565b6114fa612d26565b73ffffffffffffffffffffffffffffffffffffffff16611518612091565b73ffffffffffffffffffffffffffffffffffffffff161461156e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156590614bec565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161159490614996565b60006040518083038185875af1925050503d80600081146115d1576040519150601f19603f3d011682016040523d82523d6000602084013e6115d6565b606091505b505090508061161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161190614c6c565b60405180910390fd5b50565b61163883838360405180602001604052806000815250612699565b505050565b6060600061164a83611eb3565b905060008167ffffffffffffffff81111561166857611667615208565b5b6040519080825280602002602001820160405280156116965781602001602082028036833780820191505090505b50905060006001905060005b83811080156116b35750600c548211155b1561173c5760006116c383611e0f565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611728578284838151811061170d5761170c6151d9565b5b6020026020010181815250508180611724906150ae565b9250505b8280611733906150ae565b935050506116a2565b82945050505050919050565b81601160009054906101000a900460ff1615611799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179090614c0c565b60405180910390fd5b6117a161214d565b6117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d790614c4c565b60405180910390fd5b600c54816117ec61113b565b6117f69190614e76565b1115611837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182e90614b8c565b60405180910390fd5b60001515601160029054906101000a900460ff1615151461188d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188490614acc565b60405180910390fd5b60001515601160049054906101000a900460ff161515146118e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118da90614b6c565b60405180910390fd5b61191382336040516020016118f8919061494a565b60405160208183030381529060405280519060200120612c57565b611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194990614aec565b60405180910390fd5b601254831115611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e90614cec565b60405180910390fd5b82600f546119a59190614efd565b3410156119e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119de90614c8c565b60405180910390fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060011515611a3833610f05565b15151415611a975760008190506012548582611a549190614e76565b1115611a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8c90614a8c565b60405180910390fd5b505b6014339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b84811015611b6d57601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611b55906150ae565b91905055508080611b65906150ae565b915050611afd565b50611b78338561329f565b50505050565b611b86612d26565b73ffffffffffffffffffffffffffffffffffffffff16611ba4612091565b73ffffffffffffffffffffffffffffffffffffffff1614611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf190614bec565b60405180910390fd5b8060189080519060200190611c10929190613e17565b5050565b601160019054906101000a900460ff1681565b60178054611c349061504b565b80601f0160208091040260200160405190810160405280929190818152602001828054611c609061504b565b8015611cad5780601f10611c8257610100808354040283529160200191611cad565b820191906000526020600020905b815481529060010190602001808311611c9057829003601f168201915b505050505081565b611cbd612d26565b73ffffffffffffffffffffffffffffffffffffffff16611cdb612091565b73ffffffffffffffffffffffffffffffffffffffff1614611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2890614bec565b60405180910390fd5b8060169080519060200190611d47929190613e17565b5050565b60156020528060005260406000206000915090505481565b611d6b612d26565b73ffffffffffffffffffffffffffffffffffffffff16611d89612091565b73ffffffffffffffffffffffffffffffffffffffff1614611ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd690614bec565b60405180910390fd5b80601160046101000a81548160ff02191690831515021790555050565b601160009054906101000a900460ff1681565b6000611e1a826132bd565b600001519050919050565b60168054611e329061504b565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5e9061504b565b8015611eab5780601f10611e8057610100808354040283529160200191611eab565b820191906000526020600020905b815481529060010190602001808311611e8e57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f1b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611f8b612d26565b73ffffffffffffffffffffffffffffffffffffffff16611fa9612091565b73ffffffffffffffffffffffffffffffffffffffff1614611fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff690614bec565b60405180910390fd5b612009600061354c565b565b612013612d26565b73ffffffffffffffffffffffffffffffffffffffff16612031612091565b73ffffffffffffffffffffffffffffffffffffffff1614612087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207e90614bec565b60405180910390fd5b8060138190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546120ca9061504b565b80601f01602080910402602001604051908101604052809291908181526020018280546120f69061504b565b80156121435780601f1061211857610100808354040283529160200191612143565b820191906000526020600020905b81548152906001019060200180831161212657829003601f168201915b5050505050905090565b6000801515601160029054906101000a900460ff161515148015612184575060001515601160039054906101000a900460ff161515145b80156121a3575060001515601160049054906101000a900460ff161515145b156121b157600090506121b6565b600190505b90565b60125481565b60135481565b6121cd612d26565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612232576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061223f612d26565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122ec612d26565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123319190614a34565b60405180910390a35050565b6018805461234a9061504b565b80601f01602080910402602001604051908101604052809291908181526020018280546123769061504b565b80156123c35780601f10612398576101008083540402835291602001916123c3565b820191906000526020600020905b8154815290600101906020018083116123a657829003601f168201915b505050505081565b73e0edcd0b10e86f2309f24bed584e2909ed268e4881565b80601160009054906101000a900460ff1615612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242b90614c0c565b60405180910390fd5b61243c61214d565b61247b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247290614c4c565b60405180910390fd5b600c548161248761113b565b6124919190614e76565b11156124d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c990614b8c565b60405180910390fd5b600b54821115612517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250e90614b0c565b60405180910390fd5b60001515601160049054906101000a900460ff1615151461256d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256490614b6c565b60405180910390fd5b6000600e54146125b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a990614bcc565b60405180910390fd5b73e0edcd0b10e86f2309f24bed584e2909ed268e4873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262b90614ccc565b60405180910390fd5b600d548261264061113b565b61264a9190614e76565b111561268b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268290614b4c565b60405180910390fd5b612695338361329f565b5050565b6126a4848484612de9565b6126c38373ffffffffffffffffffffffffffffffffffffffff16613612565b80156126d857506126d684848484613635565b155b1561270f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61271d612d26565b73ffffffffffffffffffffffffffffffffffffffff1661273b612091565b73ffffffffffffffffffffffffffffffffffffffff1614612791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278890614bec565b60405180910390fd5b80601160036101000a81548160ff02191690831515021790555050565b6127b6612d26565b73ffffffffffffffffffffffffffffffffffffffff166127d4612091565b73ffffffffffffffffffffffffffffffffffffffff161461282a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282190614bec565b60405180910390fd5b8060128190555050565b606061283f82612cd8565b61287e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287590614c2c565b60405180910390fd5b60001515601160019054906101000a900460ff161515141561292c57601880546128a79061504b565b80601f01602080910402602001604051908101604052809291908181526020018280546128d39061504b565b80156129205780601f106128f557610100808354040283529160200191612920565b820191906000526020600020905b81548152906001019060200180831161290357829003601f168201915b50505050509050612988565b6000612936613795565b905060008151116129565760405180602001604052806000815250612984565b8061296084613827565b601760405160200161297493929190614965565b6040516020818303038152906040525b9150505b919050565b612995612d26565b73ffffffffffffffffffffffffffffffffffffffff166129b3612091565b73ffffffffffffffffffffffffffffffffffffffff1614612a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0090614bec565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a5481565b612ac8612d26565b73ffffffffffffffffffffffffffffffffffffffff16612ae6612091565b73ffffffffffffffffffffffffffffffffffffffff1614612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3390614bec565b60405180910390fd5b80601160026101000a81548160ff02191690831515021790555050565b60105481565b612b67612d26565b73ffffffffffffffffffffffffffffffffffffffff16612b85612091565b73ffffffffffffffffffffffffffffffffffffffff1614612bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd290614bec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4290614aac565b60405180910390fd5b612c548161354c565b50565b6000612c6683600a5484613988565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081612ce3612de0565b11158015612cf2575060005482105b8015612d1f575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000612df4826132bd565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e5f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612e80612d26565b73ffffffffffffffffffffffffffffffffffffffff161480612eaf5750612eae85612ea9612d26565b612a26565b5b80612ef45750612ebd612d26565b73ffffffffffffffffffffffffffffffffffffffff16612edc84610d7e565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612f2d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612f94576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fa1858585600161399f565b612fad60008487612d2e565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561322d57600054821461322c57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461329885858560016139a5565b5050505050565b6132b98282604051806020016040528060008152506139ab565b5050565b6132c5613e9d565b6000829050806132d3612de0565b111580156132e2575060005481105b15613515576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161351357600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146133f7578092505050613547565b5b60011561351257818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461350d578092505050613547565b6133f8565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261365b612d26565b8786866040518563ffffffff1660e01b815260040161367d94939291906149c6565b602060405180830381600087803b15801561369757600080fd5b505af19250505080156136c857506040513d601f19601f820116820180604052508101906136c59190614372565b60015b613742573d80600081146136f8576040519150601f19603f3d011682016040523d82523d6000602084013e6136fd565b606091505b5060008151141561373a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060601680546137a49061504b565b80601f01602080910402602001604051908101604052809291908181526020018280546137d09061504b565b801561381d5780601f106137f25761010080835404028352916020019161381d565b820191906000526020600020905b81548152906001019060200180831161380057829003601f168201915b5050505050905090565b6060600082141561386f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613983565b600082905060005b600082146138a157808061388a906150ae565b915050600a8261389a9190614ecc565b9150613877565b60008167ffffffffffffffff8111156138bd576138bc615208565b5b6040519080825280601f01601f1916602001820160405280156138ef5781602001600182028036833780820191505090505b5090505b6000851461397c576001826139089190614f57565b9150600a85613917919061511b565b60306139239190614e76565b60f81b818381518110613939576139386151d9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856139759190614ecc565b94506138f3565b8093505050505b919050565b60008261399585846139bd565b1490509392505050565b50505050565b50505050565b6139b88383836001613a32565b505050565b60008082905060005b8451811015613a275760008582815181106139e4576139e36151d9565b5b60200260200101519050808311613a06576139ff8382613e00565b9250613a13565b613a108184613e00565b92505b508080613a1f906150ae565b9150506139c6565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613a9f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613ada576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613ae7600086838761399f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613cb15750613cb08773ffffffffffffffffffffffffffffffffffffffff16613612565b5b15613d77575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613d266000888480600101955088613635565b613d5c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415613cb7578260005414613d7257600080fd5b613de3565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613d78575b816000819055505050613df960008683876139a5565b5050505050565b600082600052816020526040600020905092915050565b828054613e239061504b565b90600052602060002090601f016020900481019282613e455760008555613e8c565b82601f10613e5e57805160ff1916838001178555613e8c565b82800160010185558215613e8c579182015b82811115613e8b578251825591602001919060010190613e70565b5b509050613e999190613ee0565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613ef9576000816000905550600101613ee1565b5090565b6000613f10613f0b84614d4c565b614d27565b90508083825260208201905082856020860282011115613f3357613f3261523c565b5b60005b85811015613f635781613f498882614049565b845260208401935060208301925050600181019050613f36565b5050509392505050565b6000613f80613f7b84614d78565b614d27565b905082815260208101848484011115613f9c57613f9b615241565b5b613fa7848285615009565b509392505050565b6000613fc2613fbd84614da9565b614d27565b905082815260208101848484011115613fde57613fdd615241565b5b613fe9848285615009565b509392505050565b600081359050614000816156fb565b92915050565b600082601f83011261401b5761401a615237565b5b813561402b848260208601613efd565b91505092915050565b60008135905061404381615712565b92915050565b60008135905061405881615729565b92915050565b60008135905061406d81615740565b92915050565b60008151905061408281615740565b92915050565b600082601f83011261409d5761409c615237565b5b81356140ad848260208601613f6d565b91505092915050565b600082601f8301126140cb576140ca615237565b5b81356140db848260208601613faf565b91505092915050565b6000813590506140f381615757565b92915050565b60006020828403121561410f5761410e61524b565b5b600061411d84828501613ff1565b91505092915050565b6000806040838503121561413d5761413c61524b565b5b600061414b85828601613ff1565b925050602061415c85828601613ff1565b9150509250929050565b60008060006060848603121561417f5761417e61524b565b5b600061418d86828701613ff1565b935050602061419e86828701613ff1565b92505060406141af868287016140e4565b9150509250925092565b600080600080608085870312156141d3576141d261524b565b5b60006141e187828801613ff1565b94505060206141f287828801613ff1565b9350506040614203878288016140e4565b925050606085013567ffffffffffffffff81111561422457614223615246565b5b61423087828801614088565b91505092959194509250565b600080604083850312156142535761425261524b565b5b600061426185828601613ff1565b925050602061427285828601614034565b9150509250929050565b600080604083850312156142935761429261524b565b5b60006142a185828601613ff1565b92505060206142b2858286016140e4565b9150509250929050565b600080604083850312156142d3576142d261524b565b5b600083013567ffffffffffffffff8111156142f1576142f0615246565b5b6142fd85828601614006565b925050602061430e85828601614049565b9150509250929050565b60006020828403121561432e5761432d61524b565b5b600061433c84828501614034565b91505092915050565b60006020828403121561435b5761435a61524b565b5b60006143698482850161405e565b91505092915050565b6000602082840312156143885761438761524b565b5b600061439684828501614073565b91505092915050565b6000602082840312156143b5576143b461524b565b5b600082013567ffffffffffffffff8111156143d3576143d2615246565b5b6143df848285016140b6565b91505092915050565b6000602082840312156143fe576143fd61524b565b5b600061440c848285016140e4565b91505092915050565b6000806040838503121561442c5761442b61524b565b5b600061443a858286016140e4565b925050602083013567ffffffffffffffff81111561445b5761445a615246565b5b61446785828601614006565b9150509250929050565b600061447d838361492c565b60208301905092915050565b61449281614f8b565b82525050565b6144a96144a482614f8b565b6150f7565b82525050565b60006144ba82614dff565b6144c48185614e2d565b93506144cf83614dda565b8060005b838110156145005781516144e78882614471565b97506144f283614e20565b9250506001810190506144d3565b5085935050505092915050565b61451681614f9d565b82525050565b61452581614fa9565b82525050565b600061453682614e0a565b6145408185614e3e565b9350614550818560208601615018565b61455981615250565b840191505092915050565b600061456f82614e15565b6145798185614e5a565b9350614589818560208601615018565b61459281615250565b840191505092915050565b60006145a882614e15565b6145b28185614e6b565b93506145c2818560208601615018565b80840191505092915050565b600081546145db8161504b565b6145e58186614e6b565b94506001821660008114614600576001811461461157614644565b60ff19831686528186019350614644565b61461a85614dea565b60005b8381101561463c5781548189015260018201915060208101905061461d565b838801955050505b50505092915050565b600061465a602e83614e5a565b91506146658261526e565b604082019050919050565b600061467d602683614e5a565b9150614688826152bd565b604082019050919050565b60006146a0601e83614e5a565b91506146ab8261530c565b602082019050919050565b60006146c3602a83614e5a565b91506146ce82615335565b604082019050919050565b60006146e6602083614e5a565b91506146f182615384565b602082019050919050565b6000614709602483614e5a565b9150614714826153ad565b604082019050919050565b600061472c603083614e5a565b9150614737826153fc565b604082019050919050565b600061474f601583614e5a565b915061475a8261544b565b602082019050919050565b6000614772601683614e5a565b915061477d82615474565b602082019050919050565b6000614795601483614e5a565b91506147a08261549d565b602082019050919050565b60006147b8601183614e5a565b91506147c3826154c6565b602082019050919050565b60006147db602083614e5a565b91506147e6826154ef565b602082019050919050565b60006147fe601783614e5a565b915061480982615518565b602082019050919050565b6000614821602f83614e5a565b915061482c82615541565b604082019050919050565b6000614844601c83614e5a565b915061484f82615590565b602082019050919050565b6000614867600083614e4f565b9150614872826155b9565b600082019050919050565b600061488a601083614e5a565b9150614895826155bc565b602082019050919050565b60006148ad601583614e5a565b91506148b8826155e5565b602082019050919050565b60006148d0602f83614e5a565b91506148db8261560e565b604082019050919050565b60006148f3603383614e5a565b91506148fe8261565d565b604082019050919050565b6000614916603383614e5a565b9150614921826156ac565b604082019050919050565b61493581614fff565b82525050565b61494481614fff565b82525050565b60006149568284614498565b60148201915081905092915050565b6000614971828661459d565b915061497d828561459d565b915061498982846145ce565b9150819050949350505050565b60006149a18261485a565b9150819050919050565b60006020820190506149c06000830184614489565b92915050565b60006080820190506149db6000830187614489565b6149e86020830186614489565b6149f5604083018561493b565b8181036060830152614a07818461452b565b905095945050505050565b60006020820190508181036000830152614a2c81846144af565b905092915050565b6000602082019050614a49600083018461450d565b92915050565b6000602082019050614a64600083018461451c565b92915050565b60006020820190508181036000830152614a848184614564565b905092915050565b60006020820190508181036000830152614aa58161464d565b9050919050565b60006020820190508181036000830152614ac581614670565b9050919050565b60006020820190508181036000830152614ae581614693565b9050919050565b60006020820190508181036000830152614b05816146b6565b9050919050565b60006020820190508181036000830152614b25816146d9565b9050919050565b60006020820190508181036000830152614b45816146fc565b9050919050565b60006020820190508181036000830152614b658161471f565b9050919050565b60006020820190508181036000830152614b8581614742565b9050919050565b60006020820190508181036000830152614ba581614765565b9050919050565b60006020820190508181036000830152614bc581614788565b9050919050565b60006020820190508181036000830152614be5816147ab565b9050919050565b60006020820190508181036000830152614c05816147ce565b9050919050565b60006020820190508181036000830152614c25816147f1565b9050919050565b60006020820190508181036000830152614c4581614814565b9050919050565b60006020820190508181036000830152614c6581614837565b9050919050565b60006020820190508181036000830152614c858161487d565b9050919050565b60006020820190508181036000830152614ca5816148a0565b9050919050565b60006020820190508181036000830152614cc5816148c3565b9050919050565b60006020820190508181036000830152614ce5816148e6565b9050919050565b60006020820190508181036000830152614d0581614909565b9050919050565b6000602082019050614d21600083018461493b565b92915050565b6000614d31614d42565b9050614d3d828261507d565b919050565b6000604051905090565b600067ffffffffffffffff821115614d6757614d66615208565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d9357614d92615208565b5b614d9c82615250565b9050602081019050919050565b600067ffffffffffffffff821115614dc457614dc3615208565b5b614dcd82615250565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e8182614fff565b9150614e8c83614fff565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ec157614ec061514c565b5b828201905092915050565b6000614ed782614fff565b9150614ee283614fff565b925082614ef257614ef161517b565b5b828204905092915050565b6000614f0882614fff565b9150614f1383614fff565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f4c57614f4b61514c565b5b828202905092915050565b6000614f6282614fff565b9150614f6d83614fff565b925082821015614f8057614f7f61514c565b5b828203905092915050565b6000614f9682614fdf565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561503657808201518184015260208101905061501b565b83811115615045576000848401525b50505050565b6000600282049050600182168061506357607f821691505b60208210811415615077576150766151aa565b5b50919050565b61508682615250565b810181811067ffffffffffffffff821117156150a5576150a4615208565b5b80604052505050565b60006150b982614fff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156150ec576150eb61514c565b5b600182019050919050565b600061510282615109565b9050919050565b600061511482615261565b9050919050565b600061512682614fff565b915061513183614fff565b9250826151415761514061517b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d696e74696e672068617665206578636565646564206f6e207075626c69632060008201527f77686974656c6973742073616c65000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53657420707269766174652077686974656c69737420746f2066616c73650000600082015250565b7f596f7520617265206e6f742077686974656c697374656420746f20706572666f60008201527f726d206d696e74696e6700000000000000000000000000000000000000000000602082015250565b7f4d6178206d696e74696e67207065722074782068617665206578636565646564600082015250565b7f4d696e74696e672068617665206578636565646564206f6e207075626c69632060008201527f73616c6500000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c656674206f6e2070726976617460008201527f652077686974656c6973742073616c6500000000000000000000000000000000602082015250565b7f5075626c69632073616c65206e6f742066616c73650000000000000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f5075626c69632073616c65206e6f742074727565000000000000000000000000600082015250565b7f536574206d696e747261746520746f2030000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f54686520616c6c206576656e742073746174652069732066616c736500000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b7f4d6178206d696e74696e6720706572207472782068617665206c696d6974656460008201527f206f6e207075626c69632073616c650000000000000000000000000000000000602082015250565b7f596f7520617265206e6f74206f6e20707269766174652077686974656c69737460008201527f20746f20706572666f726d206d696e74696e6700000000000000000000000000602082015250565b7f4d6178206d696e74696e67207065722074782068617665206c696d697465642060008201527f6f6e207075626c69632077686974656c69737400000000000000000000000000602082015250565b61570481614f8b565b811461570f57600080fd5b50565b61571b81614f9d565b811461572657600080fd5b50565b61573281614fa9565b811461573d57600080fd5b50565b61574981614fb3565b811461575457600080fd5b50565b61576081614fff565b811461576b57600080fd5b5056fea2646970667358221220f332b01f8d2d899e42175c03c527137e8a434a78908924393f1dff11b0163c2f64736f6c63430008070033697066733a2f2f516d4e57464a674867544835616e655158545436416644584b4d7147516f413777684166745a55746b4648466a4b2f48696464656e2e6a736f6e697066733a2f2f516d4e57464a674867544835616e655158545436416644584b4d7147516f413777684166745a55746b4648466a4b2f98729ed74eabada581fb5a108198a0619d05464e74a7ee2b0e80ca7a61b9350f

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c80635c975abb11610190578063a9c9aa2b116100dc578063e0a8085311610095578063ec9320e41161006f578063ec9320e414610b4a578063ed8efe6814610b73578063f2fde38b14610b9e578063f76e484e14610bc7576102ff565b8063e0a8085314610ab9578063e985e9c514610ae2578063ebf0c71714610b1f576102ff565b8063a9c9aa2b146109ba578063abfe40a8146109e5578063b88d4fde14610a01578063bd6d726114610a2a578063becf259614610a53578063c87b56dd14610a7c576102ff565b80638da5cb5b11610149578063a1307d7911610123578063a1307d7914610910578063a1a9ab9f1461093b578063a22cb46514610966578063a45ba8e71461098f576102ff565b80638da5cb5b1461088f57806395d89b41146108ba5780639f6c437b146108e5576102ff565b80635c975abb1461077f5780636352211e146107aa5780636c0360eb146107e757806370a0823114610812578063715018a61461084f57806374bd8afb14610866576102ff565b80632db115441161024f578063499a3ca2116102085780635503a0e8116101e25780635503a0e8146106c557806355f804b3146106f057806359e3afbf146107195780635aca1bb614610756576102ff565b8063499a3ca2146106555780634fdd43cb14610671578063518302271461069a576102ff565b80632db115441461057357806333bc1c5c1461058f57806337534b5c146105ba5780633ccfd60b146105e557806342842e0e146105ef578063438b630014610618576102ff565b80630ca01ad9116102bc57806316ba10e01161029657806316ba10e0146104cd57806316c38b3c146104f657806318160ddd1461051f57806323b872dd1461054a576102ff565b80630ca01ad91461043a578063108a5661146104655780631117cf1514610490576102ff565b806301ffc9a71461030457806303354c351461034157806306fdde031461036c578063081812fc14610397578063095ea7b3146103d45780630b7f1999146103fd575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190614345565b610c04565b6040516103389190614a34565b60405180910390f35b34801561034d57600080fd5b50610356610ce6565b6040516103639190614d0c565b60405180910390f35b34801561037857600080fd5b50610381610cec565b60405161038e9190614a6a565b60405180910390f35b3480156103a357600080fd5b506103be60048036038101906103b991906143e8565b610d7e565b6040516103cb91906149ab565b60405180910390f35b3480156103e057600080fd5b506103fb60048036038101906103f6919061427c565b610dfa565b005b34801561040957600080fd5b50610424600480360381019061041f91906140f9565b610f05565b6040516104319190614a34565b60405180910390f35b34801561044657600080fd5b5061044f610fb4565b60405161045c9190614d0c565b60405180910390f35b34801561047157600080fd5b5061047a610fba565b6040516104879190614a34565b60405180910390f35b34801561049c57600080fd5b506104b760048036038101906104b291906143e8565b610fcd565b6040516104c491906149ab565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef919061439f565b61100c565b005b34801561050257600080fd5b5061051d60048036038101906105189190614318565b6110a2565b005b34801561052b57600080fd5b5061053461113b565b6040516105419190614d0c565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190614166565b611152565b005b61058d600480360381019061058891906143e8565b611162565b005b34801561059b57600080fd5b506105a46114cc565b6040516105b19190614a34565b60405180910390f35b3480156105c657600080fd5b506105cf6114df565b6040516105dc9190614a34565b60405180910390f35b6105ed6114f2565b005b3480156105fb57600080fd5b5061061660048036038101906106119190614166565b61161d565b005b34801561062457600080fd5b5061063f600480360381019061063a91906140f9565b61163d565b60405161064c9190614a12565b60405180910390f35b61066f600480360381019061066a9190614415565b611748565b005b34801561067d57600080fd5b506106986004803603810190610693919061439f565b611b7e565b005b3480156106a657600080fd5b506106af611c14565b6040516106bc9190614a34565b60405180910390f35b3480156106d157600080fd5b506106da611c27565b6040516106e79190614a6a565b60405180910390f35b3480156106fc57600080fd5b506107176004803603810190610712919061439f565b611cb5565b005b34801561072557600080fd5b50610740600480360381019061073b91906140f9565b611d4b565b60405161074d9190614d0c565b60405180910390f35b34801561076257600080fd5b5061077d60048036038101906107789190614318565b611d63565b005b34801561078b57600080fd5b50610794611dfc565b6040516107a19190614a34565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc91906143e8565b611e0f565b6040516107de91906149ab565b60405180910390f35b3480156107f357600080fd5b506107fc611e25565b6040516108099190614a6a565b60405180910390f35b34801561081e57600080fd5b50610839600480360381019061083491906140f9565b611eb3565b6040516108469190614d0c565b60405180910390f35b34801561085b57600080fd5b50610864611f83565b005b34801561087257600080fd5b5061088d600480360381019061088891906143e8565b61200b565b005b34801561089b57600080fd5b506108a4612091565b6040516108b191906149ab565b60405180910390f35b3480156108c657600080fd5b506108cf6120bb565b6040516108dc9190614a6a565b60405180910390f35b3480156108f157600080fd5b506108fa61214d565b6040516109079190614a34565b60405180910390f35b34801561091c57600080fd5b506109256121b9565b6040516109329190614d0c565b60405180910390f35b34801561094757600080fd5b506109506121bf565b60405161095d9190614d0c565b60405180910390f35b34801561097257600080fd5b5061098d6004803603810190610988919061423c565b6121c5565b005b34801561099b57600080fd5b506109a461233d565b6040516109b19190614a6a565b60405180910390f35b3480156109c657600080fd5b506109cf6123cb565b6040516109dc91906149ab565b60405180910390f35b6109ff60048036038101906109fa91906143e8565b6123e3565b005b348015610a0d57600080fd5b50610a286004803603810190610a2391906141b9565b612699565b005b348015610a3657600080fd5b50610a516004803603810190610a4c9190614318565b612715565b005b348015610a5f57600080fd5b50610a7a6004803603810190610a7591906143e8565b6127ae565b005b348015610a8857600080fd5b50610aa36004803603810190610a9e91906143e8565b612834565b604051610ab09190614a6a565b60405180910390f35b348015610ac557600080fd5b50610ae06004803603810190610adb9190614318565b61298d565b005b348015610aee57600080fd5b50610b096004803603810190610b049190614126565b612a26565b604051610b169190614a34565b60405180910390f35b348015610b2b57600080fd5b50610b34612aba565b604051610b419190614a4f565b60405180910390f35b348015610b5657600080fd5b50610b716004803603810190610b6c9190614318565b612ac0565b005b348015610b7f57600080fd5b50610b88612b59565b604051610b959190614d0c565b60405180910390f35b348015610baa57600080fd5b50610bc56004803603810190610bc091906140f9565b612b5f565b005b348015610bd357600080fd5b50610bee6004803603810190610be991906142bc565b612c57565b604051610bfb9190614a34565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ccf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cdf5750610cde82612c6e565b5b9050919050565b600e5481565b606060028054610cfb9061504b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d279061504b565b8015610d745780601f10610d4957610100808354040283529160200191610d74565b820191906000526020600020905b815481529060010190602001808311610d5757829003601f168201915b5050505050905090565b6000610d8982612cd8565b610dbf576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e0582611e0f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e6d576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e8c612d26565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ebe5750610ebc81610eb7612d26565b612a26565b155b15610ef5576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f00838383612d2e565b505050565b600080600090505b601480549050811015610fa9578273ffffffffffffffffffffffffffffffffffffffff1660148281548110610f4557610f446151d9565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610f96576001915050610faf565b8080610fa1906150ae565b915050610f0d565b50600090505b919050565b600f5481565b601160029054906101000a900460ff1681565b60148181548110610fdd57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611014612d26565b73ffffffffffffffffffffffffffffffffffffffff16611032612091565b73ffffffffffffffffffffffffffffffffffffffff1614611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f90614bec565b60405180910390fd5b806017908051906020019061109e929190613e17565b5050565b6110aa612d26565b73ffffffffffffffffffffffffffffffffffffffff166110c8612091565b73ffffffffffffffffffffffffffffffffffffffff161461111e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111590614bec565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b6000611145612de0565b6001546000540303905090565b61115d838383612de9565b505050565b80601160009054906101000a900460ff16156111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa90614c0c565b60405180910390fd5b6111bb61214d565b6111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f190614c4c565b60405180910390fd5b600c548161120661113b565b6112109190614e76565b1115611251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124890614b8c565b60405180910390fd5b60011515601160049054906101000a900460ff161515146112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90614bac565b60405180910390fd5b6013548211156112ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e390614cac565b60405180910390fd5b816010546112fa9190614efd565b34101561133c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133390614c8c565b60405180910390fd5b6001151561134933610f05565b151514156113e7576000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060135483826113a49190614e76565b11156113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90614b2c565b60405180910390fd5b505b6014339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b828110156114bd57601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906114a5906150ae565b919050555080806114b5906150ae565b91505061144d565b506114c8338361329f565b5050565b601160049054906101000a900460ff1681565b601160039054906101000a900460ff1681565b6114fa612d26565b73ffffffffffffffffffffffffffffffffffffffff16611518612091565b73ffffffffffffffffffffffffffffffffffffffff161461156e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156590614bec565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161159490614996565b60006040518083038185875af1925050503d80600081146115d1576040519150601f19603f3d011682016040523d82523d6000602084013e6115d6565b606091505b505090508061161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161190614c6c565b60405180910390fd5b50565b61163883838360405180602001604052806000815250612699565b505050565b6060600061164a83611eb3565b905060008167ffffffffffffffff81111561166857611667615208565b5b6040519080825280602002602001820160405280156116965781602001602082028036833780820191505090505b50905060006001905060005b83811080156116b35750600c548211155b1561173c5760006116c383611e0f565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611728578284838151811061170d5761170c6151d9565b5b6020026020010181815250508180611724906150ae565b9250505b8280611733906150ae565b935050506116a2565b82945050505050919050565b81601160009054906101000a900460ff1615611799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179090614c0c565b60405180910390fd5b6117a161214d565b6117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d790614c4c565b60405180910390fd5b600c54816117ec61113b565b6117f69190614e76565b1115611837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182e90614b8c565b60405180910390fd5b60001515601160029054906101000a900460ff1615151461188d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188490614acc565b60405180910390fd5b60001515601160049054906101000a900460ff161515146118e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118da90614b6c565b60405180910390fd5b61191382336040516020016118f8919061494a565b60405160208183030381529060405280519060200120612c57565b611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194990614aec565b60405180910390fd5b601254831115611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e90614cec565b60405180910390fd5b82600f546119a59190614efd565b3410156119e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119de90614c8c565b60405180910390fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060011515611a3833610f05565b15151415611a975760008190506012548582611a549190614e76565b1115611a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8c90614a8c565b60405180910390fd5b505b6014339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b84811015611b6d57601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611b55906150ae565b91905055508080611b65906150ae565b915050611afd565b50611b78338561329f565b50505050565b611b86612d26565b73ffffffffffffffffffffffffffffffffffffffff16611ba4612091565b73ffffffffffffffffffffffffffffffffffffffff1614611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf190614bec565b60405180910390fd5b8060189080519060200190611c10929190613e17565b5050565b601160019054906101000a900460ff1681565b60178054611c349061504b565b80601f0160208091040260200160405190810160405280929190818152602001828054611c609061504b565b8015611cad5780601f10611c8257610100808354040283529160200191611cad565b820191906000526020600020905b815481529060010190602001808311611c9057829003601f168201915b505050505081565b611cbd612d26565b73ffffffffffffffffffffffffffffffffffffffff16611cdb612091565b73ffffffffffffffffffffffffffffffffffffffff1614611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2890614bec565b60405180910390fd5b8060169080519060200190611d47929190613e17565b5050565b60156020528060005260406000206000915090505481565b611d6b612d26565b73ffffffffffffffffffffffffffffffffffffffff16611d89612091565b73ffffffffffffffffffffffffffffffffffffffff1614611ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd690614bec565b60405180910390fd5b80601160046101000a81548160ff02191690831515021790555050565b601160009054906101000a900460ff1681565b6000611e1a826132bd565b600001519050919050565b60168054611e329061504b565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5e9061504b565b8015611eab5780601f10611e8057610100808354040283529160200191611eab565b820191906000526020600020905b815481529060010190602001808311611e8e57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f1b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611f8b612d26565b73ffffffffffffffffffffffffffffffffffffffff16611fa9612091565b73ffffffffffffffffffffffffffffffffffffffff1614611fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff690614bec565b60405180910390fd5b612009600061354c565b565b612013612d26565b73ffffffffffffffffffffffffffffffffffffffff16612031612091565b73ffffffffffffffffffffffffffffffffffffffff1614612087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207e90614bec565b60405180910390fd5b8060138190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546120ca9061504b565b80601f01602080910402602001604051908101604052809291908181526020018280546120f69061504b565b80156121435780601f1061211857610100808354040283529160200191612143565b820191906000526020600020905b81548152906001019060200180831161212657829003601f168201915b5050505050905090565b6000801515601160029054906101000a900460ff161515148015612184575060001515601160039054906101000a900460ff161515145b80156121a3575060001515601160049054906101000a900460ff161515145b156121b157600090506121b6565b600190505b90565b60125481565b60135481565b6121cd612d26565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612232576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061223f612d26565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122ec612d26565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123319190614a34565b60405180910390a35050565b6018805461234a9061504b565b80601f01602080910402602001604051908101604052809291908181526020018280546123769061504b565b80156123c35780601f10612398576101008083540402835291602001916123c3565b820191906000526020600020905b8154815290600101906020018083116123a657829003601f168201915b505050505081565b73e0edcd0b10e86f2309f24bed584e2909ed268e4881565b80601160009054906101000a900460ff1615612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242b90614c0c565b60405180910390fd5b61243c61214d565b61247b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247290614c4c565b60405180910390fd5b600c548161248761113b565b6124919190614e76565b11156124d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c990614b8c565b60405180910390fd5b600b54821115612517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250e90614b0c565b60405180910390fd5b60001515601160049054906101000a900460ff1615151461256d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256490614b6c565b60405180910390fd5b6000600e54146125b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a990614bcc565b60405180910390fd5b73e0edcd0b10e86f2309f24bed584e2909ed268e4873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262b90614ccc565b60405180910390fd5b600d548261264061113b565b61264a9190614e76565b111561268b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268290614b4c565b60405180910390fd5b612695338361329f565b5050565b6126a4848484612de9565b6126c38373ffffffffffffffffffffffffffffffffffffffff16613612565b80156126d857506126d684848484613635565b155b1561270f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61271d612d26565b73ffffffffffffffffffffffffffffffffffffffff1661273b612091565b73ffffffffffffffffffffffffffffffffffffffff1614612791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278890614bec565b60405180910390fd5b80601160036101000a81548160ff02191690831515021790555050565b6127b6612d26565b73ffffffffffffffffffffffffffffffffffffffff166127d4612091565b73ffffffffffffffffffffffffffffffffffffffff161461282a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282190614bec565b60405180910390fd5b8060128190555050565b606061283f82612cd8565b61287e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287590614c2c565b60405180910390fd5b60001515601160019054906101000a900460ff161515141561292c57601880546128a79061504b565b80601f01602080910402602001604051908101604052809291908181526020018280546128d39061504b565b80156129205780601f106128f557610100808354040283529160200191612920565b820191906000526020600020905b81548152906001019060200180831161290357829003601f168201915b50505050509050612988565b6000612936613795565b905060008151116129565760405180602001604052806000815250612984565b8061296084613827565b601760405160200161297493929190614965565b6040516020818303038152906040525b9150505b919050565b612995612d26565b73ffffffffffffffffffffffffffffffffffffffff166129b3612091565b73ffffffffffffffffffffffffffffffffffffffff1614612a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0090614bec565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a5481565b612ac8612d26565b73ffffffffffffffffffffffffffffffffffffffff16612ae6612091565b73ffffffffffffffffffffffffffffffffffffffff1614612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3390614bec565b60405180910390fd5b80601160026101000a81548160ff02191690831515021790555050565b60105481565b612b67612d26565b73ffffffffffffffffffffffffffffffffffffffff16612b85612091565b73ffffffffffffffffffffffffffffffffffffffff1614612bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd290614bec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4290614aac565b60405180910390fd5b612c548161354c565b50565b6000612c6683600a5484613988565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081612ce3612de0565b11158015612cf2575060005482105b8015612d1f575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000612df4826132bd565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e5f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612e80612d26565b73ffffffffffffffffffffffffffffffffffffffff161480612eaf5750612eae85612ea9612d26565b612a26565b5b80612ef45750612ebd612d26565b73ffffffffffffffffffffffffffffffffffffffff16612edc84610d7e565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612f2d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612f94576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fa1858585600161399f565b612fad60008487612d2e565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561322d57600054821461322c57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461329885858560016139a5565b5050505050565b6132b98282604051806020016040528060008152506139ab565b5050565b6132c5613e9d565b6000829050806132d3612de0565b111580156132e2575060005481105b15613515576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161351357600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146133f7578092505050613547565b5b60011561351257818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461350d578092505050613547565b6133f8565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261365b612d26565b8786866040518563ffffffff1660e01b815260040161367d94939291906149c6565b602060405180830381600087803b15801561369757600080fd5b505af19250505080156136c857506040513d601f19601f820116820180604052508101906136c59190614372565b60015b613742573d80600081146136f8576040519150601f19603f3d011682016040523d82523d6000602084013e6136fd565b606091505b5060008151141561373a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060601680546137a49061504b565b80601f01602080910402602001604051908101604052809291908181526020018280546137d09061504b565b801561381d5780601f106137f25761010080835404028352916020019161381d565b820191906000526020600020905b81548152906001019060200180831161380057829003601f168201915b5050505050905090565b6060600082141561386f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613983565b600082905060005b600082146138a157808061388a906150ae565b915050600a8261389a9190614ecc565b9150613877565b60008167ffffffffffffffff8111156138bd576138bc615208565b5b6040519080825280601f01601f1916602001820160405280156138ef5781602001600182028036833780820191505090505b5090505b6000851461397c576001826139089190614f57565b9150600a85613917919061511b565b60306139239190614e76565b60f81b818381518110613939576139386151d9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856139759190614ecc565b94506138f3565b8093505050505b919050565b60008261399585846139bd565b1490509392505050565b50505050565b50505050565b6139b88383836001613a32565b505050565b60008082905060005b8451811015613a275760008582815181106139e4576139e36151d9565b5b60200260200101519050808311613a06576139ff8382613e00565b9250613a13565b613a108184613e00565b92505b508080613a1f906150ae565b9150506139c6565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613a9f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613ada576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613ae7600086838761399f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613cb15750613cb08773ffffffffffffffffffffffffffffffffffffffff16613612565b5b15613d77575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613d266000888480600101955088613635565b613d5c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415613cb7578260005414613d7257600080fd5b613de3565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613d78575b816000819055505050613df960008683876139a5565b5050505050565b600082600052816020526040600020905092915050565b828054613e239061504b565b90600052602060002090601f016020900481019282613e455760008555613e8c565b82601f10613e5e57805160ff1916838001178555613e8c565b82800160010185558215613e8c579182015b82811115613e8b578251825591602001919060010190613e70565b5b509050613e999190613ee0565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613ef9576000816000905550600101613ee1565b5090565b6000613f10613f0b84614d4c565b614d27565b90508083825260208201905082856020860282011115613f3357613f3261523c565b5b60005b85811015613f635781613f498882614049565b845260208401935060208301925050600181019050613f36565b5050509392505050565b6000613f80613f7b84614d78565b614d27565b905082815260208101848484011115613f9c57613f9b615241565b5b613fa7848285615009565b509392505050565b6000613fc2613fbd84614da9565b614d27565b905082815260208101848484011115613fde57613fdd615241565b5b613fe9848285615009565b509392505050565b600081359050614000816156fb565b92915050565b600082601f83011261401b5761401a615237565b5b813561402b848260208601613efd565b91505092915050565b60008135905061404381615712565b92915050565b60008135905061405881615729565b92915050565b60008135905061406d81615740565b92915050565b60008151905061408281615740565b92915050565b600082601f83011261409d5761409c615237565b5b81356140ad848260208601613f6d565b91505092915050565b600082601f8301126140cb576140ca615237565b5b81356140db848260208601613faf565b91505092915050565b6000813590506140f381615757565b92915050565b60006020828403121561410f5761410e61524b565b5b600061411d84828501613ff1565b91505092915050565b6000806040838503121561413d5761413c61524b565b5b600061414b85828601613ff1565b925050602061415c85828601613ff1565b9150509250929050565b60008060006060848603121561417f5761417e61524b565b5b600061418d86828701613ff1565b935050602061419e86828701613ff1565b92505060406141af868287016140e4565b9150509250925092565b600080600080608085870312156141d3576141d261524b565b5b60006141e187828801613ff1565b94505060206141f287828801613ff1565b9350506040614203878288016140e4565b925050606085013567ffffffffffffffff81111561422457614223615246565b5b61423087828801614088565b91505092959194509250565b600080604083850312156142535761425261524b565b5b600061426185828601613ff1565b925050602061427285828601614034565b9150509250929050565b600080604083850312156142935761429261524b565b5b60006142a185828601613ff1565b92505060206142b2858286016140e4565b9150509250929050565b600080604083850312156142d3576142d261524b565b5b600083013567ffffffffffffffff8111156142f1576142f0615246565b5b6142fd85828601614006565b925050602061430e85828601614049565b9150509250929050565b60006020828403121561432e5761432d61524b565b5b600061433c84828501614034565b91505092915050565b60006020828403121561435b5761435a61524b565b5b60006143698482850161405e565b91505092915050565b6000602082840312156143885761438761524b565b5b600061439684828501614073565b91505092915050565b6000602082840312156143b5576143b461524b565b5b600082013567ffffffffffffffff8111156143d3576143d2615246565b5b6143df848285016140b6565b91505092915050565b6000602082840312156143fe576143fd61524b565b5b600061440c848285016140e4565b91505092915050565b6000806040838503121561442c5761442b61524b565b5b600061443a858286016140e4565b925050602083013567ffffffffffffffff81111561445b5761445a615246565b5b61446785828601614006565b9150509250929050565b600061447d838361492c565b60208301905092915050565b61449281614f8b565b82525050565b6144a96144a482614f8b565b6150f7565b82525050565b60006144ba82614dff565b6144c48185614e2d565b93506144cf83614dda565b8060005b838110156145005781516144e78882614471565b97506144f283614e20565b9250506001810190506144d3565b5085935050505092915050565b61451681614f9d565b82525050565b61452581614fa9565b82525050565b600061453682614e0a565b6145408185614e3e565b9350614550818560208601615018565b61455981615250565b840191505092915050565b600061456f82614e15565b6145798185614e5a565b9350614589818560208601615018565b61459281615250565b840191505092915050565b60006145a882614e15565b6145b28185614e6b565b93506145c2818560208601615018565b80840191505092915050565b600081546145db8161504b565b6145e58186614e6b565b94506001821660008114614600576001811461461157614644565b60ff19831686528186019350614644565b61461a85614dea565b60005b8381101561463c5781548189015260018201915060208101905061461d565b838801955050505b50505092915050565b600061465a602e83614e5a565b91506146658261526e565b604082019050919050565b600061467d602683614e5a565b9150614688826152bd565b604082019050919050565b60006146a0601e83614e5a565b91506146ab8261530c565b602082019050919050565b60006146c3602a83614e5a565b91506146ce82615335565b604082019050919050565b60006146e6602083614e5a565b91506146f182615384565b602082019050919050565b6000614709602483614e5a565b9150614714826153ad565b604082019050919050565b600061472c603083614e5a565b9150614737826153fc565b604082019050919050565b600061474f601583614e5a565b915061475a8261544b565b602082019050919050565b6000614772601683614e5a565b915061477d82615474565b602082019050919050565b6000614795601483614e5a565b91506147a08261549d565b602082019050919050565b60006147b8601183614e5a565b91506147c3826154c6565b602082019050919050565b60006147db602083614e5a565b91506147e6826154ef565b602082019050919050565b60006147fe601783614e5a565b915061480982615518565b602082019050919050565b6000614821602f83614e5a565b915061482c82615541565b604082019050919050565b6000614844601c83614e5a565b915061484f82615590565b602082019050919050565b6000614867600083614e4f565b9150614872826155b9565b600082019050919050565b600061488a601083614e5a565b9150614895826155bc565b602082019050919050565b60006148ad601583614e5a565b91506148b8826155e5565b602082019050919050565b60006148d0602f83614e5a565b91506148db8261560e565b604082019050919050565b60006148f3603383614e5a565b91506148fe8261565d565b604082019050919050565b6000614916603383614e5a565b9150614921826156ac565b604082019050919050565b61493581614fff565b82525050565b61494481614fff565b82525050565b60006149568284614498565b60148201915081905092915050565b6000614971828661459d565b915061497d828561459d565b915061498982846145ce565b9150819050949350505050565b60006149a18261485a565b9150819050919050565b60006020820190506149c06000830184614489565b92915050565b60006080820190506149db6000830187614489565b6149e86020830186614489565b6149f5604083018561493b565b8181036060830152614a07818461452b565b905095945050505050565b60006020820190508181036000830152614a2c81846144af565b905092915050565b6000602082019050614a49600083018461450d565b92915050565b6000602082019050614a64600083018461451c565b92915050565b60006020820190508181036000830152614a848184614564565b905092915050565b60006020820190508181036000830152614aa58161464d565b9050919050565b60006020820190508181036000830152614ac581614670565b9050919050565b60006020820190508181036000830152614ae581614693565b9050919050565b60006020820190508181036000830152614b05816146b6565b9050919050565b60006020820190508181036000830152614b25816146d9565b9050919050565b60006020820190508181036000830152614b45816146fc565b9050919050565b60006020820190508181036000830152614b658161471f565b9050919050565b60006020820190508181036000830152614b8581614742565b9050919050565b60006020820190508181036000830152614ba581614765565b9050919050565b60006020820190508181036000830152614bc581614788565b9050919050565b60006020820190508181036000830152614be5816147ab565b9050919050565b60006020820190508181036000830152614c05816147ce565b9050919050565b60006020820190508181036000830152614c25816147f1565b9050919050565b60006020820190508181036000830152614c4581614814565b9050919050565b60006020820190508181036000830152614c6581614837565b9050919050565b60006020820190508181036000830152614c858161487d565b9050919050565b60006020820190508181036000830152614ca5816148a0565b9050919050565b60006020820190508181036000830152614cc5816148c3565b9050919050565b60006020820190508181036000830152614ce5816148e6565b9050919050565b60006020820190508181036000830152614d0581614909565b9050919050565b6000602082019050614d21600083018461493b565b92915050565b6000614d31614d42565b9050614d3d828261507d565b919050565b6000604051905090565b600067ffffffffffffffff821115614d6757614d66615208565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614d9357614d92615208565b5b614d9c82615250565b9050602081019050919050565b600067ffffffffffffffff821115614dc457614dc3615208565b5b614dcd82615250565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e8182614fff565b9150614e8c83614fff565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ec157614ec061514c565b5b828201905092915050565b6000614ed782614fff565b9150614ee283614fff565b925082614ef257614ef161517b565b5b828204905092915050565b6000614f0882614fff565b9150614f1383614fff565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f4c57614f4b61514c565b5b828202905092915050565b6000614f6282614fff565b9150614f6d83614fff565b925082821015614f8057614f7f61514c565b5b828203905092915050565b6000614f9682614fdf565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561503657808201518184015260208101905061501b565b83811115615045576000848401525b50505050565b6000600282049050600182168061506357607f821691505b60208210811415615077576150766151aa565b5b50919050565b61508682615250565b810181811067ffffffffffffffff821117156150a5576150a4615208565b5b80604052505050565b60006150b982614fff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156150ec576150eb61514c565b5b600182019050919050565b600061510282615109565b9050919050565b600061511482615261565b9050919050565b600061512682614fff565b915061513183614fff565b9250826151415761514061517b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d696e74696e672068617665206578636565646564206f6e207075626c69632060008201527f77686974656c6973742073616c65000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53657420707269766174652077686974656c69737420746f2066616c73650000600082015250565b7f596f7520617265206e6f742077686974656c697374656420746f20706572666f60008201527f726d206d696e74696e6700000000000000000000000000000000000000000000602082015250565b7f4d6178206d696e74696e67207065722074782068617665206578636565646564600082015250565b7f4d696e74696e672068617665206578636565646564206f6e207075626c69632060008201527f73616c6500000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820746f6b656e73206c656674206f6e2070726976617460008201527f652077686974656c6973742073616c6500000000000000000000000000000000602082015250565b7f5075626c69632073616c65206e6f742066616c73650000000000000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f5075626c69632073616c65206e6f742074727565000000000000000000000000600082015250565b7f536574206d696e747261746520746f2030000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f54686520616c6c206576656e742073746174652069732066616c736500000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b7f4d6178206d696e74696e6720706572207472782068617665206c696d6974656460008201527f206f6e207075626c69632073616c650000000000000000000000000000000000602082015250565b7f596f7520617265206e6f74206f6e20707269766174652077686974656c69737460008201527f20746f20706572666f726d206d696e74696e6700000000000000000000000000602082015250565b7f4d6178206d696e74696e67207065722074782068617665206c696d697465642060008201527f6f6e207075626c69632077686974656c69737400000000000000000000000000602082015250565b61570481614f8b565b811461570f57600080fd5b50565b61571b81614f9d565b811461572657600080fd5b50565b61573281614fa9565b811461573d57600080fd5b50565b61574981614fb3565b811461575457600080fd5b50565b61576081614fff565b811461576b57600080fd5b5056fea2646970667358221220f332b01f8d2d899e42175c03c527137e8a434a78908924393f1dff11b0163c2f64736f6c63430008070033

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

98729ed74eabada581fb5a108198a0619d05464e74a7ee2b0e80ca7a61b9350f

-----Decoded View---------------
Arg [0] : _root (bytes32): 0x98729ed74eabada581fb5a108198a0619d05464e74a7ee2b0e80ca7a61b9350f

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 98729ed74eabada581fb5a108198a0619d05464e74a7ee2b0e80ca7a61b9350f


Deployed Bytecode Sourcemap

49979:7810:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32153:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50212:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35266:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36769:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36332:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56565:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50268:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50451:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50689:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55379:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54492:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31402:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37634:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53400:891;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50539:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50495:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54303:181;;;:::i;:::-;;37875:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55888:669;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52171:1221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55493:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50416:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50919:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55273:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50749:70;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54678:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50383:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35074:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50832:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32522:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9911:103;;;;;;;;;;;;;:::i;:::-;;54921:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9260:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35435:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55643:236;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50578:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50637:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37045:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50963:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51003:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51583:580;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38131:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55160:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54777:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57018:489;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54583:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37403:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50071:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55045:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50327:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10169:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57624:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32153:305;32255:4;32307:25;32292:40;;;:11;:40;;;;:105;;;;32364:33;32349:48;;;:11;:48;;;;32292:105;:158;;;;32414:36;32438:11;32414:23;:36::i;:::-;32292:158;32272:178;;32153:305;;;:::o;50212:49::-;;;;:::o;35266:100::-;35320:13;35353:5;35346:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35266:100;:::o;36769:204::-;36837:7;36862:16;36870:7;36862;:16::i;:::-;36857:64;;36887:34;;;;;;;;;;;;;;36857:64;36941:15;:24;36957:7;36941:24;;;;;;;;;;;;;;;;;;;;;36934:31;;36769:204;;;:::o;36332:371::-;36405:13;36421:24;36437:7;36421:15;:24::i;:::-;36405:40;;36466:5;36460:11;;:2;:11;;;36456:48;;;36480:24;;;;;;;;;;;;;;36456:48;36537:5;36521:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;36547:37;36564:5;36571:12;:10;:12::i;:::-;36547:16;:37::i;:::-;36546:38;36521:63;36517:138;;;36608:35;;;;;;;;;;;;;;36517:138;36667:28;36676:2;36680:7;36689:5;36667:8;:28::i;:::-;36394:309;36332:371;;:::o;56565:329::-;56641:4;56668:6;56677:1;56668:10;;56663:197;56684:30;:37;;;;56680:1;:41;56663:197;;;56784:5;56747:42;;:30;56778:1;56747:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:42;;;56743:102;;;56821:4;56814:11;;;;;56743:102;56723:3;;;;;:::i;:::-;;;;56663:197;;;;56881:5;56874:12;;56565:329;;;;:::o;50268:52::-;;;;:::o;50451:37::-;;;;;;;;;;;;;:::o;50689:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55379:106::-;9491:12;:10;:12::i;:::-;9480:23;;:7;:5;:7::i;:::-;:23;;;9472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55467:10:::1;55455:9;:22;;;;;;;;;;;;:::i;:::-;;55379:106:::0;:::o;54492:83::-;9491:12;:10;:12::i;:::-;9480:23;;:7;:5;:7::i;:::-;:23;;;9472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54561:6:::1;54552;;:15;;;;;;;;;;;;;;;;;;54492:83:::0;:::o;31402:303::-;31446:7;31671:15;:13;:15::i;:::-;31656:12;;31640:13;;:28;:46;31633:53;;31402:303;:::o;37634:170::-;37768:28;37778:4;37784:2;37788:7;37768:9;:28::i;:::-;37634:170;;;:::o;53400:891::-;53470:8;51364:6;;;;;;;;;;;51363:7;51355:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;51417:17;:15;:17::i;:::-;51409:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51514:10;;51502:8;51486:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;51478:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53513:4:::1;53499:18;;:10;;;;;;;;;;;:18;;;53491:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;53573:24;;53561:8;:36;;53553:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;53704:8;53683:18;;:29;;;;:::i;:::-;53669:9;:44;;53661:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;53801:4;53755:50;;:42;53786:10;53755:30;:42::i;:::-;:50;;;53752:285;;;53822:29;53854:35;:47;53890:10;53854:47;;;;;;;;;;;;;;;;53822:79;;53960:24;;53948:8;53924:21;:32;;;;:::i;:::-;:60;;53916:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;53807:230;53752:285;54057:30;54093:10;54057:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54130:9;54125:115;54149:8;54145:1;:12;54125:115;;;54179:35;:47;54215:10;54179:47;;;;;;;;;;;;;;;;:49;;;;;;;;;:::i;:::-;;;;;;54159:3;;;;;:::i;:::-;;;;54125:115;;;;54252:31;54262:10;54274:8;54252:9;:31::i;:::-;53400:891:::0;;:::o;50539:30::-;;;;;;;;;;;;;:::o;50495:37::-;;;;;;;;;;;;;:::o;54303:181::-;9491:12;:10;:12::i;:::-;9480:23;;:7;:5;:7::i;:::-;:23;;;9472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54362:12:::1;54380:10;:15;;54403:21;54380:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54361:68;;;54448:7;54440:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;54350:134;54303:181::o:0;37875:185::-;38013:39;38030:4;38036:2;38040:7;38013:39;;;;;;;;;;;;:16;:39::i;:::-;37875:185;;;:::o;55888:669::-;55948:16;55982:23;56008:17;56018:6;56008:9;:17::i;:::-;55982:43;;56036:30;56083:15;56069:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56036:63;;56110:22;56135:1;56110:26;;56147:23;56187:330;56212:15;56194;:33;:65;;;;;56249:10;;56231:14;:28;;56194:65;56187:330;;;56272:25;56300:23;56308:14;56300:7;:23::i;:::-;56272:51;;56361:6;56340:27;;:17;:27;;;56336:141;;;56417:14;56384:13;56398:15;56384:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;56448:17;;;;;:::i;:::-;;;;56336:141;56489:16;;;;;:::i;:::-;;;;56261:256;56187:330;;;56536:13;56529:20;;;;;;55888:669;;;:::o;52171:1221::-;52274:8;51364:6;;;;;;;;;;;51363:7;51355:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;51417:17;:15;:17::i;:::-;51409:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51514:10;;51502:8;51486:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;51478:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52325:5:::1;52303:27;;:18;;;;;;;;;;;:27;;;52295:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;52398:5;52384:19;;:10;;;;;;;;;;;:19;;;52376:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;52448:72;52473:5;52507:10;52490:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;52480:39;;;;;;52448:24;:72::i;:::-;52440:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;52600:33;;52588:8;:45;;52580:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;52749:8;52723:23;;:34;;;;:::i;:::-;52709:9;:49;;52701:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;52797:21;52821:35;:47;52857:10;52821:47;;;;;;;;;;;;;;;;52797:71;;52930:4;52884:50;;:42;52915:10;52884:30;:42::i;:::-;:50;;;52881:265;;;52951:25;52979:16;52951:44;;53050:33;;53038:8;53018:17;:28;;;;:::i;:::-;:65;;53010:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;52936:210;52881:265;53166:30;53202:10;53166:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53231:9;53226:115;53250:8;53246:1;:12;53226:115;;;53280:35;:47;53316:10;53280:47;;;;;;;;;;;;;;;;:49;;;;;;;;;:::i;:::-;;;;;;53260:3;;;;;:::i;:::-;;;;53226:115;;;;53353:31;53363:10;53375:8;53353:9;:31::i;:::-;52284:1108;52171:1221:::0;;;:::o;55493:138::-;9491:12;:10;:12::i;:::-;9480:23;;:7;:5;:7::i;:::-;:23;;;9472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55605:18:::1;55585:17;:38;;;;;;;;;;;;:::i;:::-;;55493:138:::0;:::o;50416:28::-;;;;;;;;;;;;;:::o;50919:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55273:98::-;9491:12;:10;:12::i;:::-;9480:23;;:7;:5;:7::i;:::-;:23;;;9472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55355:8:::1;55345:7;:18;;;;;;;;;;;;:::i;:::-;;55273:98:::0;:::o;50749:70::-;;;;;;;;;;;;;;;;;:::o;54678:91::-;9491:12;:10;:12::i;:::-;9480:23;;:7;:5;:7::i;:::-;:23;;;9472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54755:6:::1;54742:10;;:19;;;;;;;;;;;;;;;;;;54678:91:::0;:::o;50383:26::-;;;;;;;;;;;;;:::o;35074:125::-;35138:7;35165:21;35178:7;35165:12;:21::i;:::-;:26;;;35158:33;;35074:125;;;:::o;50832:80::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32522:206::-;32586:7;32627:1;32610:19;;:5;:19;;;32606:60;;;32638:28;;;;;;;;;;;;;;32606:60;32692:12;:19;32705:5;32692:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;32684:36;;32677:43;;32522:206;;;:::o;9911:103::-;9491:12;:10;:12::i;:::-;9480:23;;:7;:5;:7::i;:::-;:23;;;9472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9976:30:::1;10003:1;9976:18;:30::i;:::-;9911:103::o:0;54921:116::-;9491:12;:10;:12::i;:::-;9480:23;;:7;:5;:7::i;:::-;:23;;;9472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55023:6:::1;54996:24;:33;;;;54921:116:::0;:::o;9260:87::-;9306:7;9333:6;;;;;;;;;;;9326:13;;9260:87;:::o;35435:104::-;35491:13;35524:7;35517:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35435:104;:::o;55643:236::-;55691:4;55736:5;55714:27;;:18;;;;;;;;;;;:27;;;55713:61;;;;;55768:5;55747:26;;:17;;;;;;;;;;;:26;;;55713:61;:86;;;;;55793:5;55779:19;;:10;;;;;;;;;;;:19;;;55713:86;55710:162;;;55820:5;55813:12;;;;55710:162;55859:4;55852:11;;55643:236;;:::o;50578:52::-;;;;:::o;50637:43::-;;;;:::o;37045:287::-;37156:12;:10;:12::i;:::-;37144:24;;:8;:24;;;37140:54;;;37177:17;;;;;;;;;;;;;;37140:54;37252:8;37207:18;:32;37226:12;:10;:12::i;:::-;37207:32;;;;;;;;;;;;;;;:42;37240:8;37207:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;37305:8;37276:48;;37291:12;:10;:12::i;:::-;37276:48;;;37315:8;37276:48;;;;;;:::i;:::-;;;;;;;;37045:287;;:::o;50963:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51003:85::-;51046:42;51003:85;:::o;51583:580::-;51654:8;51364:6;;;;;;;;;;;51363:7;51355:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;51417:17;:15;:17::i;:::-;51409:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51514:10;;51502:8;51486:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;51478:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51695:9:::1;;51683:8;:21;;51675:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;51775:5;51761:19;;:10;;;;;;;;;;;:19;;;51753:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;51853:1;51825:24;;:29;51817:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;51046:42;51895:30;;:10;:30;;;51887:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;52028:30;;52016:8;52000:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:58;;51992:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;52124:31;52134:10;52146:8;52124:9;:31::i;:::-;51583:580:::0;;:::o;38131:369::-;38298:28;38308:4;38314:2;38318:7;38298:9;:28::i;:::-;38341:15;:2;:13;;;:15::i;:::-;:76;;;;;38361:56;38392:4;38398:2;38402:7;38411:5;38361:30;:56::i;:::-;38360:57;38341:76;38337:156;;;38441:40;;;;;;;;;;;;;;38337:156;38131:369;;;;:::o;55160:105::-;9491:12;:10;:12::i;:::-;9480:23;;:7;:5;:7::i;:::-;:23;;;9472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55251:6:::1;55231:17;;:26;;;;;;;;;;;;;;;;;;55160:105:::0;:::o;54777:136::-;9491:12;:10;:12::i;:::-;9480:23;;:7;:5;:7::i;:::-;:23;;;9472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54899:6:::1;54863:33;:42;;;;54777:136:::0;:::o;57018:489::-;57092:13;57126:17;57134:8;57126:7;:17::i;:::-;57118:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;57232:5;57220:17;;:8;;;;;;;;;;;:17;;;57216:74;;;57261:17;57254:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57216:74;57302:28;57333:10;:8;:10::i;:::-;57302:41;;57392:1;57367:14;57361:28;:32;:138;;;;;;;;;;;;;;;;;57433:14;57449:19;:8;:17;:19::i;:::-;57470:9;57416:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57361:138;57354:145;;;57018:489;;;;:::o;54583:87::-;9491:12;:10;:12::i;:::-;9480:23;;:7;:5;:7::i;:::-;:23;;;9472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54656:6:::1;54645:8;;:17;;;;;;;;;;;;;;;;;;54583:87:::0;:::o;37403:164::-;37500:4;37524:18;:25;37543:5;37524:25;;;;;;;;;;;;;;;:35;37550:8;37524:35;;;;;;;;;;;;;;;;;;;;;;;;;37517:42;;37403:164;;;;:::o;50071:19::-;;;;:::o;55045:107::-;9491:12;:10;:12::i;:::-;9480:23;;:7;:5;:7::i;:::-;:23;;;9472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55138:6:::1;55117:18;;:27;;;;;;;;;;;;;;;;;;55045:107:::0;:::o;50327:47::-;;;;:::o;10169:201::-;9491:12;:10;:12::i;:::-;9480:23;;:7;:5;:7::i;:::-;:23;;;9472:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10278:1:::1;10258:22;;:8;:22;;;;10250:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10334:28;10353:8;10334:18;:28::i;:::-;10169:201:::0;:::o;57624:162::-;57717:4;57741:37;57760:5;57767:4;;57773;57741:18;:37::i;:::-;57734:44;;57624:162;;;;:::o;22044:157::-;22129:4;22168:25;22153:40;;;:11;:40;;;;22146:47;;22044:157;;;:::o;38755:174::-;38812:4;38855:7;38836:15;:13;:15::i;:::-;:26;;:53;;;;;38876:13;;38866:7;:23;38836:53;:85;;;;;38894:11;:20;38906:7;38894:20;;;;;;;;;;;:27;;;;;;;;;;;;38893:28;38836:85;38829:92;;38755:174;;;:::o;7984:98::-;8037:7;8064:10;8057:17;;7984:98;:::o;46912:196::-;47054:2;47027:15;:24;47043:7;47027:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47092:7;47088:2;47072:28;;47081:5;47072:28;;;;;;;;;;;;46912:196;;;:::o;57515:101::-;57580:7;57607:1;57600:8;;57515:101;:::o;41855:2130::-;41970:35;42008:21;42021:7;42008:12;:21::i;:::-;41970:59;;42068:4;42046:26;;:13;:18;;;:26;;;42042:67;;42081:28;;;;;;;;;;;;;;42042:67;42122:22;42164:4;42148:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;42185:36;42202:4;42208:12;:10;:12::i;:::-;42185:16;:36::i;:::-;42148:73;:126;;;;42262:12;:10;:12::i;:::-;42238:36;;:20;42250:7;42238:11;:20::i;:::-;:36;;;42148:126;42122:153;;42293:17;42288:66;;42319:35;;;;;;;;;;;;;;42288:66;42383:1;42369:16;;:2;:16;;;42365:52;;;42394:23;;;;;;;;;;;;;;42365:52;42430:43;42452:4;42458:2;42462:7;42471:1;42430:21;:43::i;:::-;42538:35;42555:1;42559:7;42568:4;42538:8;:35::i;:::-;42899:1;42869:12;:18;42882:4;42869:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42943:1;42915:12;:16;42928:2;42915:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42961:31;42995:11;:20;43007:7;42995:20;;;;;;;;;;;42961:54;;43046:2;43030:8;:13;;;:18;;;;;;;;;;;;;;;;;;43096:15;43063:8;:23;;;:49;;;;;;;;;;;;;;;;;;43364:19;43396:1;43386:7;:11;43364:33;;43412:31;43446:11;:24;43458:11;43446:24;;;;;;;;;;;43412:58;;43514:1;43489:27;;:8;:13;;;;;;;;;;;;:27;;;43485:384;;;43699:13;;43684:11;:28;43680:174;;43753:4;43737:8;:13;;;:20;;;;;;;;;;;;;;;;;;43806:13;:28;;;43780:8;:23;;;:54;;;;;;;;;;;;;;;;;;43680:174;43485:384;42844:1036;;;43916:7;43912:2;43897:27;;43906:4;43897:27;;;;;;;;;;;;43935:42;43956:4;43962:2;43966:7;43975:1;43935:20;:42::i;:::-;41959:2026;;41855:2130;;;:::o;38937:104::-;39006:27;39016:2;39020:8;39006:27;;;;;;;;;;;;:9;:27::i;:::-;38937:104;;:::o;33903:1109::-;33965:21;;:::i;:::-;33999:12;34014:7;33999:22;;34082:4;34063:15;:13;:15::i;:::-;:23;;:47;;;;;34097:13;;34090:4;:20;34063:47;34059:886;;;34131:31;34165:11;:17;34177:4;34165:17;;;;;;;;;;;34131:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34206:9;:16;;;34201:729;;34277:1;34251:28;;:9;:14;;;:28;;;34247:101;;34315:9;34308:16;;;;;;34247:101;34650:261;34657:4;34650:261;;;34690:6;;;;;;;;34735:11;:17;34747:4;34735:17;;;;;;;;;;;34723:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34809:1;34783:28;;:9;:14;;;:28;;;34779:109;;34851:9;34844:16;;;;;;34779:109;34650:261;;;34201:729;34112:833;34059:886;34973:31;;;;;;;;;;;;;;33903:1109;;;;:::o;10530:191::-;10604:16;10623:6;;;;;;;;;;;10604:25;;10649:8;10640:6;;:17;;;;;;;;;;;;;;;;;;10704:8;10673:40;;10694:8;10673:40;;;;;;;;;;;;10593:128;10530:191;:::o;11961:326::-;12021:4;12278:1;12256:7;:19;;;:23;12249:30;;11961:326;;;:::o;47600:667::-;47763:4;47800:2;47784:36;;;47821:12;:10;:12::i;:::-;47835:4;47841:7;47850:5;47784:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47780:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48035:1;48018:6;:13;:18;48014:235;;;48064:40;;;;;;;;;;;;;;48014:235;48207:6;48201:13;48192:6;48188:2;48184:15;48177:38;47780:480;47913:45;;;47903:55;;;:6;:55;;;;47896:62;;;47600:667;;;;;;:::o;56902:108::-;56962:13;56995:7;56988:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56902:108;:::o;5546:723::-;5602:13;5832:1;5823:5;:10;5819:53;;;5850:10;;;;;;;;;;;;;;;;;;;;;5819:53;5882:12;5897:5;5882:20;;5913:14;5938:78;5953:1;5945:4;:9;5938:78;;5971:8;;;;;:::i;:::-;;;;6002:2;5994:10;;;;;:::i;:::-;;;5938:78;;;6026:19;6058:6;6048:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6026:39;;6076:154;6092:1;6083:5;:10;6076:154;;6120:1;6110:11;;;;;:::i;:::-;;;6187:2;6179:5;:10;;;;:::i;:::-;6166:2;:24;;;;:::i;:::-;6153:39;;6136:6;6143;6136:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6216:2;6207:11;;;;;:::i;:::-;;;6076:154;;;6254:6;6240:21;;;;;5546:723;;;;:::o;956:190::-;1081:4;1134;1105:25;1118:5;1125:4;1105:12;:25::i;:::-;:33;1098:40;;956:190;;;;;:::o;48915:159::-;;;;;:::o;49733:158::-;;;;;:::o;39404:163::-;39527:32;39533:2;39537:8;39547:5;39554:4;39527:5;:32::i;:::-;39404:163;;;:::o;1508:675::-;1591:7;1611:20;1634:4;1611:27;;1654:9;1649:497;1673:5;:12;1669:1;:16;1649:497;;;1707:20;1730:5;1736:1;1730:8;;;;;;;;:::i;:::-;;;;;;;;1707:31;;1773:12;1757;:28;1753:382;;1900:42;1915:12;1929;1900:14;:42::i;:::-;1885:57;;1753:382;;;2077:42;2092:12;2106;2077:14;:42::i;:::-;2062:57;;1753:382;1692:454;1687:3;;;;;:::i;:::-;;;;1649:497;;;;2163:12;2156:19;;;1508:675;;;;:::o;39826:1775::-;39965:20;39988:13;;39965:36;;40030:1;40016:16;;:2;:16;;;40012:48;;;40041:19;;;;;;;;;;;;;;40012:48;40087:1;40075:8;:13;40071:44;;;40097:18;;;;;;;;;;;;;;40071:44;40128:61;40158:1;40162:2;40166:12;40180:8;40128:21;:61::i;:::-;40501:8;40466:12;:16;40479:2;40466:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40565:8;40525:12;:16;40538:2;40525:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40624:2;40591:11;:25;40603:12;40591:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40691:15;40641:11;:25;40653:12;40641:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;40724:20;40747:12;40724:35;;40774:11;40803:8;40788:12;:23;40774:37;;40832:4;:23;;;;;40840:15;:2;:13;;;:15::i;:::-;40832:23;40828:641;;;40876:314;40932:12;40928:2;40907:38;;40924:1;40907:38;;;;;;;;;;;;40973:69;41012:1;41016:2;41020:14;;;;;;41036:5;40973:30;:69::i;:::-;40968:174;;41078:40;;;;;;;;;;;;;;40968:174;41185:3;41169:12;:19;;40876:314;;41271:12;41254:13;;:29;41250:43;;41285:8;;;41250:43;40828:641;;;41334:120;41390:14;;;;;;41386:2;41365:40;;41382:1;41365:40;;;;;;;;;;;;41449:3;41433:12;:19;;41334:120;;40828:641;41499:12;41483:13;:28;;;;40441:1082;;41533:60;41562:1;41566:2;41570:12;41584:8;41533:20;:60::i;:::-;39954:1647;39826:1775;;;;:::o;2191:224::-;2259:13;2322:1;2316:4;2309:15;2351:1;2345:4;2338:15;2392:4;2386;2376:21;2367:30;;2191:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:139::-;2309:5;2347:6;2334:20;2325:29;;2363:33;2390:5;2363:33;:::i;:::-;2263:139;;;;:::o;2408:137::-;2453:5;2491:6;2478:20;2469:29;;2507:32;2533:5;2507:32;:::i;:::-;2408:137;;;;:::o;2551:141::-;2607:5;2638:6;2632:13;2623:22;;2654:32;2680:5;2654:32;:::i;:::-;2551:141;;;;:::o;2711:338::-;2766:5;2815:3;2808:4;2800:6;2796:17;2792:27;2782:122;;2823:79;;:::i;:::-;2782:122;2940:6;2927:20;2965:78;3039:3;3031:6;3024:4;3016:6;3012:17;2965:78;:::i;:::-;2956:87;;2772:277;2711:338;;;;:::o;3069:340::-;3125:5;3174:3;3167:4;3159:6;3155:17;3151:27;3141:122;;3182:79;;:::i;:::-;3141:122;3299:6;3286:20;3324:79;3399:3;3391:6;3384:4;3376:6;3372:17;3324:79;:::i;:::-;3315:88;;3131:278;3069:340;;;;:::o;3415:139::-;3461:5;3499:6;3486:20;3477:29;;3515:33;3542:5;3515:33;:::i;:::-;3415:139;;;;:::o;3560:329::-;3619:6;3668:2;3656:9;3647:7;3643:23;3639:32;3636:119;;;3674:79;;:::i;:::-;3636:119;3794:1;3819:53;3864:7;3855:6;3844:9;3840:22;3819:53;:::i;:::-;3809:63;;3765:117;3560:329;;;;:::o;3895:474::-;3963:6;3971;4020:2;4008:9;3999:7;3995:23;3991:32;3988:119;;;4026:79;;:::i;:::-;3988:119;4146:1;4171:53;4216:7;4207:6;4196:9;4192:22;4171:53;:::i;:::-;4161:63;;4117:117;4273:2;4299:53;4344:7;4335:6;4324:9;4320:22;4299:53;:::i;:::-;4289:63;;4244:118;3895:474;;;;;:::o;4375:619::-;4452:6;4460;4468;4517:2;4505:9;4496:7;4492:23;4488:32;4485:119;;;4523:79;;:::i;:::-;4485:119;4643:1;4668:53;4713:7;4704:6;4693:9;4689:22;4668:53;:::i;:::-;4658:63;;4614:117;4770:2;4796:53;4841:7;4832:6;4821:9;4817:22;4796:53;:::i;:::-;4786:63;;4741:118;4898:2;4924:53;4969:7;4960:6;4949:9;4945:22;4924:53;:::i;:::-;4914:63;;4869:118;4375:619;;;;;:::o;5000:943::-;5095:6;5103;5111;5119;5168:3;5156:9;5147:7;5143:23;5139:33;5136:120;;;5175:79;;:::i;:::-;5136:120;5295:1;5320:53;5365:7;5356:6;5345:9;5341:22;5320:53;:::i;:::-;5310:63;;5266:117;5422:2;5448:53;5493:7;5484:6;5473:9;5469:22;5448:53;:::i;:::-;5438:63;;5393:118;5550:2;5576:53;5621:7;5612:6;5601:9;5597:22;5576:53;:::i;:::-;5566:63;;5521:118;5706:2;5695:9;5691:18;5678:32;5737:18;5729:6;5726:30;5723:117;;;5759:79;;:::i;:::-;5723:117;5864:62;5918:7;5909:6;5898:9;5894:22;5864:62;:::i;:::-;5854:72;;5649:287;5000:943;;;;;;;:::o;5949:468::-;6014:6;6022;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:53;6267:7;6258:6;6247:9;6243:22;6222:53;:::i;:::-;6212:63;;6168:117;6324:2;6350:50;6392:7;6383:6;6372:9;6368:22;6350:50;:::i;:::-;6340:60;;6295:115;5949:468;;;;;:::o;6423:474::-;6491:6;6499;6548:2;6536:9;6527:7;6523:23;6519:32;6516:119;;;6554:79;;:::i;:::-;6516:119;6674:1;6699:53;6744:7;6735:6;6724:9;6720:22;6699:53;:::i;:::-;6689:63;;6645:117;6801:2;6827:53;6872:7;6863:6;6852:9;6848:22;6827:53;:::i;:::-;6817:63;;6772:118;6423:474;;;;;:::o;6903:684::-;6996:6;7004;7053:2;7041:9;7032:7;7028:23;7024:32;7021:119;;;7059:79;;:::i;:::-;7021:119;7207:1;7196:9;7192:17;7179:31;7237:18;7229:6;7226:30;7223:117;;;7259:79;;:::i;:::-;7223:117;7364:78;7434:7;7425:6;7414:9;7410:22;7364:78;:::i;:::-;7354:88;;7150:302;7491:2;7517:53;7562:7;7553:6;7542:9;7538:22;7517:53;:::i;:::-;7507:63;;7462:118;6903:684;;;;;:::o;7593:323::-;7649:6;7698:2;7686:9;7677:7;7673:23;7669:32;7666:119;;;7704:79;;:::i;:::-;7666:119;7824:1;7849:50;7891:7;7882:6;7871:9;7867:22;7849:50;:::i;:::-;7839:60;;7795:114;7593:323;;;;:::o;7922:327::-;7980:6;8029:2;8017:9;8008:7;8004:23;8000:32;7997:119;;;8035:79;;:::i;:::-;7997:119;8155:1;8180:52;8224:7;8215:6;8204:9;8200:22;8180:52;:::i;:::-;8170:62;;8126:116;7922:327;;;;:::o;8255:349::-;8324:6;8373:2;8361:9;8352:7;8348:23;8344:32;8341:119;;;8379:79;;:::i;:::-;8341:119;8499:1;8524:63;8579:7;8570:6;8559:9;8555:22;8524:63;:::i;:::-;8514:73;;8470:127;8255:349;;;;:::o;8610:509::-;8679:6;8728:2;8716:9;8707:7;8703:23;8699:32;8696:119;;;8734:79;;:::i;:::-;8696:119;8882:1;8871:9;8867:17;8854:31;8912:18;8904:6;8901:30;8898:117;;;8934:79;;:::i;:::-;8898:117;9039:63;9094:7;9085:6;9074:9;9070:22;9039:63;:::i;:::-;9029:73;;8825:287;8610:509;;;;:::o;9125:329::-;9184:6;9233:2;9221:9;9212:7;9208:23;9204:32;9201:119;;;9239:79;;:::i;:::-;9201:119;9359:1;9384:53;9429:7;9420:6;9409:9;9405:22;9384:53;:::i;:::-;9374:63;;9330:117;9125:329;;;;:::o;9460:684::-;9553:6;9561;9610:2;9598:9;9589:7;9585:23;9581:32;9578:119;;;9616:79;;:::i;:::-;9578:119;9736:1;9761:53;9806:7;9797:6;9786:9;9782:22;9761:53;:::i;:::-;9751:63;;9707:117;9891:2;9880:9;9876:18;9863:32;9922:18;9914:6;9911:30;9908:117;;;9944:79;;:::i;:::-;9908:117;10049:78;10119:7;10110:6;10099:9;10095:22;10049:78;:::i;:::-;10039:88;;9834:303;9460:684;;;;;:::o;10150:179::-;10219:10;10240:46;10282:3;10274:6;10240:46;:::i;:::-;10318:4;10313:3;10309:14;10295:28;;10150:179;;;;:::o;10335:118::-;10422:24;10440:5;10422:24;:::i;:::-;10417:3;10410:37;10335:118;;:::o;10459:157::-;10564:45;10584:24;10602:5;10584:24;:::i;:::-;10564:45;:::i;:::-;10559:3;10552:58;10459:157;;:::o;10652:732::-;10771:3;10800:54;10848:5;10800:54;:::i;:::-;10870:86;10949:6;10944:3;10870:86;:::i;:::-;10863:93;;10980:56;11030:5;10980:56;:::i;:::-;11059:7;11090:1;11075:284;11100:6;11097:1;11094:13;11075:284;;;11176:6;11170:13;11203:63;11262:3;11247:13;11203:63;:::i;:::-;11196:70;;11289:60;11342:6;11289:60;:::i;:::-;11279:70;;11135:224;11122:1;11119;11115:9;11110:14;;11075:284;;;11079:14;11375:3;11368:10;;10776:608;;;10652:732;;;;:::o;11390:109::-;11471:21;11486:5;11471:21;:::i;:::-;11466:3;11459:34;11390:109;;:::o;11505:118::-;11592:24;11610:5;11592:24;:::i;:::-;11587:3;11580:37;11505:118;;:::o;11629:360::-;11715:3;11743:38;11775:5;11743:38;:::i;:::-;11797:70;11860:6;11855:3;11797:70;:::i;:::-;11790:77;;11876:52;11921:6;11916:3;11909:4;11902:5;11898:16;11876:52;:::i;:::-;11953:29;11975:6;11953:29;:::i;:::-;11948:3;11944:39;11937:46;;11719:270;11629:360;;;;:::o;11995:364::-;12083:3;12111:39;12144:5;12111:39;:::i;:::-;12166:71;12230:6;12225:3;12166:71;:::i;:::-;12159:78;;12246:52;12291:6;12286:3;12279:4;12272:5;12268:16;12246:52;:::i;:::-;12323:29;12345:6;12323:29;:::i;:::-;12318:3;12314:39;12307:46;;12087:272;11995:364;;;;:::o;12365:377::-;12471:3;12499:39;12532:5;12499:39;:::i;:::-;12554:89;12636:6;12631:3;12554:89;:::i;:::-;12547:96;;12652:52;12697:6;12692:3;12685:4;12678:5;12674:16;12652:52;:::i;:::-;12729:6;12724:3;12720:16;12713:23;;12475:267;12365:377;;;;:::o;12772:845::-;12875:3;12912:5;12906:12;12941:36;12967:9;12941:36;:::i;:::-;12993:89;13075:6;13070:3;12993:89;:::i;:::-;12986:96;;13113:1;13102:9;13098:17;13129:1;13124:137;;;;13275:1;13270:341;;;;13091:520;;13124:137;13208:4;13204:9;13193;13189:25;13184:3;13177:38;13244:6;13239:3;13235:16;13228:23;;13124:137;;13270:341;13337:38;13369:5;13337:38;:::i;:::-;13397:1;13411:154;13425:6;13422:1;13419:13;13411:154;;;13499:7;13493:14;13489:1;13484:3;13480:11;13473:35;13549:1;13540:7;13536:15;13525:26;;13447:4;13444:1;13440:12;13435:17;;13411:154;;;13594:6;13589:3;13585:16;13578:23;;13277:334;;13091:520;;12879:738;;12772:845;;;;:::o;13623:366::-;13765:3;13786:67;13850:2;13845:3;13786:67;:::i;:::-;13779:74;;13862:93;13951:3;13862:93;:::i;:::-;13980:2;13975:3;13971:12;13964:19;;13623:366;;;:::o;13995:::-;14137:3;14158:67;14222:2;14217:3;14158:67;:::i;:::-;14151:74;;14234:93;14323:3;14234:93;:::i;:::-;14352:2;14347:3;14343:12;14336:19;;13995:366;;;:::o;14367:::-;14509:3;14530:67;14594:2;14589:3;14530:67;:::i;:::-;14523:74;;14606:93;14695:3;14606:93;:::i;:::-;14724:2;14719:3;14715:12;14708:19;;14367:366;;;:::o;14739:::-;14881:3;14902:67;14966:2;14961:3;14902:67;:::i;:::-;14895:74;;14978:93;15067:3;14978:93;:::i;:::-;15096:2;15091:3;15087:12;15080:19;;14739:366;;;:::o;15111:::-;15253:3;15274:67;15338:2;15333:3;15274:67;:::i;:::-;15267:74;;15350:93;15439:3;15350:93;:::i;:::-;15468:2;15463:3;15459:12;15452:19;;15111:366;;;:::o;15483:::-;15625:3;15646:67;15710:2;15705:3;15646:67;:::i;:::-;15639:74;;15722:93;15811:3;15722:93;:::i;:::-;15840:2;15835:3;15831:12;15824:19;;15483:366;;;:::o;15855:::-;15997:3;16018:67;16082:2;16077:3;16018:67;:::i;:::-;16011:74;;16094:93;16183:3;16094:93;:::i;:::-;16212:2;16207:3;16203:12;16196:19;;15855:366;;;:::o;16227:::-;16369:3;16390:67;16454:2;16449:3;16390:67;:::i;:::-;16383:74;;16466:93;16555:3;16466:93;:::i;:::-;16584:2;16579:3;16575:12;16568:19;;16227:366;;;:::o;16599:::-;16741:3;16762:67;16826:2;16821:3;16762:67;:::i;:::-;16755:74;;16838:93;16927:3;16838:93;:::i;:::-;16956:2;16951:3;16947:12;16940:19;;16599:366;;;:::o;16971:::-;17113:3;17134:67;17198:2;17193:3;17134:67;:::i;:::-;17127:74;;17210:93;17299:3;17210:93;:::i;:::-;17328:2;17323:3;17319:12;17312:19;;16971:366;;;:::o;17343:::-;17485:3;17506:67;17570:2;17565:3;17506:67;:::i;:::-;17499:74;;17582:93;17671:3;17582:93;:::i;:::-;17700:2;17695:3;17691:12;17684:19;;17343:366;;;:::o;17715:::-;17857:3;17878:67;17942:2;17937:3;17878:67;:::i;:::-;17871:74;;17954:93;18043:3;17954:93;:::i;:::-;18072:2;18067:3;18063:12;18056:19;;17715:366;;;:::o;18087:::-;18229:3;18250:67;18314:2;18309:3;18250:67;:::i;:::-;18243:74;;18326:93;18415:3;18326:93;:::i;:::-;18444:2;18439:3;18435:12;18428:19;;18087:366;;;:::o;18459:::-;18601:3;18622:67;18686:2;18681:3;18622:67;:::i;:::-;18615:74;;18698:93;18787:3;18698:93;:::i;:::-;18816:2;18811:3;18807:12;18800:19;;18459:366;;;:::o;18831:::-;18973:3;18994:67;19058:2;19053:3;18994:67;:::i;:::-;18987:74;;19070:93;19159:3;19070:93;:::i;:::-;19188:2;19183:3;19179:12;19172:19;;18831:366;;;:::o;19203:398::-;19362:3;19383:83;19464:1;19459:3;19383:83;:::i;:::-;19376:90;;19475:93;19564:3;19475:93;:::i;:::-;19593:1;19588:3;19584:11;19577:18;;19203:398;;;:::o;19607:366::-;19749:3;19770:67;19834:2;19829:3;19770:67;:::i;:::-;19763:74;;19846:93;19935:3;19846:93;:::i;:::-;19964:2;19959:3;19955:12;19948:19;;19607:366;;;:::o;19979:::-;20121:3;20142:67;20206:2;20201:3;20142:67;:::i;:::-;20135:74;;20218:93;20307:3;20218:93;:::i;:::-;20336:2;20331:3;20327:12;20320:19;;19979:366;;;:::o;20351:::-;20493:3;20514:67;20578:2;20573:3;20514:67;:::i;:::-;20507:74;;20590:93;20679:3;20590:93;:::i;:::-;20708:2;20703:3;20699:12;20692:19;;20351:366;;;:::o;20723:::-;20865:3;20886:67;20950:2;20945:3;20886:67;:::i;:::-;20879:74;;20962:93;21051:3;20962:93;:::i;:::-;21080:2;21075:3;21071:12;21064:19;;20723:366;;;:::o;21095:::-;21237:3;21258:67;21322:2;21317:3;21258:67;:::i;:::-;21251:74;;21334:93;21423:3;21334:93;:::i;:::-;21452:2;21447:3;21443:12;21436:19;;21095:366;;;:::o;21467:108::-;21544:24;21562:5;21544:24;:::i;:::-;21539:3;21532:37;21467:108;;:::o;21581:118::-;21668:24;21686:5;21668:24;:::i;:::-;21663:3;21656:37;21581:118;;:::o;21705:256::-;21817:3;21832:75;21903:3;21894:6;21832:75;:::i;:::-;21932:2;21927:3;21923:12;21916:19;;21952:3;21945:10;;21705:256;;;;:::o;21967:589::-;22192:3;22214:95;22305:3;22296:6;22214:95;:::i;:::-;22207:102;;22326:95;22417:3;22408:6;22326:95;:::i;:::-;22319:102;;22438:92;22526:3;22517:6;22438:92;:::i;:::-;22431:99;;22547:3;22540:10;;21967:589;;;;;;:::o;22562:379::-;22746:3;22768:147;22911:3;22768:147;:::i;:::-;22761:154;;22932:3;22925:10;;22562:379;;;:::o;22947:222::-;23040:4;23078:2;23067:9;23063:18;23055:26;;23091:71;23159:1;23148:9;23144:17;23135:6;23091:71;:::i;:::-;22947:222;;;;:::o;23175:640::-;23370:4;23408:3;23397:9;23393:19;23385:27;;23422:71;23490:1;23479:9;23475:17;23466:6;23422:71;:::i;:::-;23503:72;23571:2;23560:9;23556:18;23547:6;23503:72;:::i;:::-;23585;23653:2;23642:9;23638:18;23629:6;23585:72;:::i;:::-;23704:9;23698:4;23694:20;23689:2;23678:9;23674:18;23667:48;23732:76;23803:4;23794:6;23732:76;:::i;:::-;23724:84;;23175:640;;;;;;;:::o;23821:373::-;23964:4;24002:2;23991:9;23987:18;23979:26;;24051:9;24045:4;24041:20;24037:1;24026:9;24022:17;24015:47;24079:108;24182:4;24173:6;24079:108;:::i;:::-;24071:116;;23821:373;;;;:::o;24200:210::-;24287:4;24325:2;24314:9;24310:18;24302:26;;24338:65;24400:1;24389:9;24385:17;24376:6;24338:65;:::i;:::-;24200:210;;;;:::o;24416:222::-;24509:4;24547:2;24536:9;24532:18;24524:26;;24560:71;24628:1;24617:9;24613:17;24604:6;24560:71;:::i;:::-;24416:222;;;;:::o;24644:313::-;24757:4;24795:2;24784:9;24780:18;24772:26;;24844:9;24838:4;24834:20;24830:1;24819:9;24815:17;24808:47;24872:78;24945:4;24936:6;24872:78;:::i;:::-;24864:86;;24644:313;;;;:::o;24963:419::-;25129:4;25167:2;25156:9;25152:18;25144:26;;25216:9;25210:4;25206:20;25202:1;25191:9;25187:17;25180:47;25244:131;25370:4;25244:131;:::i;:::-;25236:139;;24963:419;;;:::o;25388:::-;25554:4;25592:2;25581:9;25577:18;25569:26;;25641:9;25635:4;25631:20;25627:1;25616:9;25612:17;25605:47;25669:131;25795:4;25669:131;:::i;:::-;25661:139;;25388:419;;;:::o;25813:::-;25979:4;26017:2;26006:9;26002:18;25994:26;;26066:9;26060:4;26056:20;26052:1;26041:9;26037:17;26030:47;26094:131;26220:4;26094:131;:::i;:::-;26086:139;;25813:419;;;:::o;26238:::-;26404:4;26442:2;26431:9;26427:18;26419:26;;26491:9;26485:4;26481:20;26477:1;26466:9;26462:17;26455:47;26519:131;26645:4;26519:131;:::i;:::-;26511:139;;26238:419;;;:::o;26663:::-;26829:4;26867:2;26856:9;26852:18;26844:26;;26916:9;26910:4;26906:20;26902:1;26891:9;26887:17;26880:47;26944:131;27070:4;26944:131;:::i;:::-;26936:139;;26663:419;;;:::o;27088:::-;27254:4;27292:2;27281:9;27277:18;27269:26;;27341:9;27335:4;27331:20;27327:1;27316:9;27312:17;27305:47;27369:131;27495:4;27369:131;:::i;:::-;27361:139;;27088:419;;;:::o;27513:::-;27679:4;27717:2;27706:9;27702:18;27694:26;;27766:9;27760:4;27756:20;27752:1;27741:9;27737:17;27730:47;27794:131;27920:4;27794:131;:::i;:::-;27786:139;;27513:419;;;:::o;27938:::-;28104:4;28142:2;28131:9;28127:18;28119:26;;28191:9;28185:4;28181:20;28177:1;28166:9;28162:17;28155:47;28219:131;28345:4;28219:131;:::i;:::-;28211:139;;27938:419;;;:::o;28363:::-;28529:4;28567:2;28556:9;28552:18;28544:26;;28616:9;28610:4;28606:20;28602:1;28591:9;28587:17;28580:47;28644:131;28770:4;28644:131;:::i;:::-;28636:139;;28363:419;;;:::o;28788:::-;28954:4;28992:2;28981:9;28977:18;28969:26;;29041:9;29035:4;29031:20;29027:1;29016:9;29012:17;29005:47;29069:131;29195:4;29069:131;:::i;:::-;29061:139;;28788:419;;;:::o;29213:::-;29379:4;29417:2;29406:9;29402:18;29394:26;;29466:9;29460:4;29456:20;29452:1;29441:9;29437:17;29430:47;29494:131;29620:4;29494:131;:::i;:::-;29486:139;;29213:419;;;:::o;29638:::-;29804:4;29842:2;29831:9;29827:18;29819:26;;29891:9;29885:4;29881:20;29877:1;29866:9;29862:17;29855:47;29919:131;30045:4;29919:131;:::i;:::-;29911:139;;29638:419;;;:::o;30063:::-;30229:4;30267:2;30256:9;30252:18;30244:26;;30316:9;30310:4;30306:20;30302:1;30291:9;30287:17;30280:47;30344:131;30470:4;30344:131;:::i;:::-;30336:139;;30063:419;;;:::o;30488:::-;30654:4;30692:2;30681:9;30677:18;30669:26;;30741:9;30735:4;30731:20;30727:1;30716:9;30712:17;30705:47;30769:131;30895:4;30769:131;:::i;:::-;30761:139;;30488:419;;;:::o;30913:::-;31079:4;31117:2;31106:9;31102:18;31094:26;;31166:9;31160:4;31156:20;31152:1;31141:9;31137:17;31130:47;31194:131;31320:4;31194:131;:::i;:::-;31186:139;;30913:419;;;:::o;31338:::-;31504:4;31542:2;31531:9;31527:18;31519:26;;31591:9;31585:4;31581:20;31577:1;31566:9;31562:17;31555:47;31619:131;31745:4;31619:131;:::i;:::-;31611:139;;31338:419;;;:::o;31763:::-;31929:4;31967:2;31956:9;31952:18;31944:26;;32016:9;32010:4;32006:20;32002:1;31991:9;31987:17;31980:47;32044:131;32170:4;32044:131;:::i;:::-;32036:139;;31763:419;;;:::o;32188:::-;32354:4;32392:2;32381:9;32377:18;32369:26;;32441:9;32435:4;32431:20;32427:1;32416:9;32412:17;32405:47;32469:131;32595:4;32469:131;:::i;:::-;32461:139;;32188:419;;;:::o;32613:::-;32779:4;32817:2;32806:9;32802:18;32794:26;;32866:9;32860:4;32856:20;32852:1;32841:9;32837:17;32830:47;32894:131;33020:4;32894:131;:::i;:::-;32886:139;;32613:419;;;:::o;33038:::-;33204:4;33242:2;33231:9;33227:18;33219:26;;33291:9;33285:4;33281:20;33277:1;33266:9;33262:17;33255:47;33319:131;33445:4;33319:131;:::i;:::-;33311:139;;33038:419;;;:::o;33463:222::-;33556:4;33594:2;33583:9;33579:18;33571:26;;33607:71;33675:1;33664:9;33660:17;33651:6;33607:71;:::i;:::-;33463:222;;;;:::o;33691:129::-;33725:6;33752:20;;:::i;:::-;33742:30;;33781:33;33809:4;33801:6;33781:33;:::i;:::-;33691:129;;;:::o;33826:75::-;33859:6;33892:2;33886:9;33876:19;;33826:75;:::o;33907:311::-;33984:4;34074:18;34066:6;34063:30;34060:56;;;34096:18;;:::i;:::-;34060:56;34146:4;34138:6;34134:17;34126:25;;34206:4;34200;34196:15;34188:23;;33907:311;;;:::o;34224:307::-;34285:4;34375:18;34367:6;34364:30;34361:56;;;34397:18;;:::i;:::-;34361:56;34435:29;34457:6;34435:29;:::i;:::-;34427:37;;34519:4;34513;34509:15;34501:23;;34224:307;;;:::o;34537:308::-;34599:4;34689:18;34681:6;34678:30;34675:56;;;34711:18;;:::i;:::-;34675:56;34749:29;34771:6;34749:29;:::i;:::-;34741:37;;34833:4;34827;34823:15;34815:23;;34537:308;;;:::o;34851:132::-;34918:4;34941:3;34933:11;;34971:4;34966:3;34962:14;34954:22;;34851:132;;;:::o;34989:141::-;35038:4;35061:3;35053:11;;35084:3;35081:1;35074:14;35118:4;35115:1;35105:18;35097:26;;34989:141;;;:::o;35136:114::-;35203:6;35237:5;35231:12;35221:22;;35136:114;;;:::o;35256:98::-;35307:6;35341:5;35335:12;35325:22;;35256:98;;;:::o;35360:99::-;35412:6;35446:5;35440:12;35430:22;;35360:99;;;:::o;35465:113::-;35535:4;35567;35562:3;35558:14;35550:22;;35465:113;;;:::o;35584:184::-;35683:11;35717:6;35712:3;35705:19;35757:4;35752:3;35748:14;35733:29;;35584:184;;;;:::o;35774:168::-;35857:11;35891:6;35886:3;35879:19;35931:4;35926:3;35922:14;35907:29;;35774:168;;;;:::o;35948:147::-;36049:11;36086:3;36071:18;;35948:147;;;;:::o;36101:169::-;36185:11;36219:6;36214:3;36207:19;36259:4;36254:3;36250:14;36235:29;;36101:169;;;;:::o;36276:148::-;36378:11;36415:3;36400:18;;36276:148;;;;:::o;36430:305::-;36470:3;36489:20;36507:1;36489:20;:::i;:::-;36484:25;;36523:20;36541:1;36523:20;:::i;:::-;36518:25;;36677:1;36609:66;36605:74;36602:1;36599:81;36596:107;;;36683:18;;:::i;:::-;36596:107;36727:1;36724;36720:9;36713:16;;36430:305;;;;:::o;36741:185::-;36781:1;36798:20;36816:1;36798:20;:::i;:::-;36793:25;;36832:20;36850:1;36832:20;:::i;:::-;36827:25;;36871:1;36861:35;;36876:18;;:::i;:::-;36861:35;36918:1;36915;36911:9;36906:14;;36741:185;;;;:::o;36932:348::-;36972:7;36995:20;37013:1;36995:20;:::i;:::-;36990:25;;37029:20;37047:1;37029:20;:::i;:::-;37024:25;;37217:1;37149:66;37145:74;37142:1;37139:81;37134:1;37127:9;37120:17;37116:105;37113:131;;;37224:18;;:::i;:::-;37113:131;37272:1;37269;37265:9;37254:20;;36932:348;;;;:::o;37286:191::-;37326:4;37346:20;37364:1;37346:20;:::i;:::-;37341:25;;37380:20;37398:1;37380:20;:::i;:::-;37375:25;;37419:1;37416;37413:8;37410:34;;;37424:18;;:::i;:::-;37410:34;37469:1;37466;37462:9;37454:17;;37286:191;;;;:::o;37483:96::-;37520:7;37549:24;37567:5;37549:24;:::i;:::-;37538:35;;37483:96;;;:::o;37585:90::-;37619:7;37662:5;37655:13;37648:21;37637:32;;37585:90;;;:::o;37681:77::-;37718:7;37747:5;37736:16;;37681:77;;;:::o;37764:149::-;37800:7;37840:66;37833:5;37829:78;37818:89;;37764:149;;;:::o;37919:126::-;37956:7;37996:42;37989:5;37985:54;37974:65;;37919:126;;;:::o;38051:77::-;38088:7;38117:5;38106:16;;38051:77;;;:::o;38134:154::-;38218:6;38213:3;38208;38195:30;38280:1;38271:6;38266:3;38262:16;38255:27;38134:154;;;:::o;38294:307::-;38362:1;38372:113;38386:6;38383:1;38380:13;38372:113;;;38471:1;38466:3;38462:11;38456:18;38452:1;38447:3;38443:11;38436:39;38408:2;38405:1;38401:10;38396:15;;38372:113;;;38503:6;38500:1;38497:13;38494:101;;;38583:1;38574:6;38569:3;38565:16;38558:27;38494:101;38343:258;38294:307;;;:::o;38607:320::-;38651:6;38688:1;38682:4;38678:12;38668:22;;38735:1;38729:4;38725:12;38756:18;38746:81;;38812:4;38804:6;38800:17;38790:27;;38746:81;38874:2;38866:6;38863:14;38843:18;38840:38;38837:84;;;38893:18;;:::i;:::-;38837:84;38658:269;38607:320;;;:::o;38933:281::-;39016:27;39038:4;39016:27;:::i;:::-;39008:6;39004:40;39146:6;39134:10;39131:22;39110:18;39098:10;39095:34;39092:62;39089:88;;;39157:18;;:::i;:::-;39089:88;39197:10;39193:2;39186:22;38976:238;38933:281;;:::o;39220:233::-;39259:3;39282:24;39300:5;39282:24;:::i;:::-;39273:33;;39328:66;39321:5;39318:77;39315:103;;;39398:18;;:::i;:::-;39315:103;39445:1;39438:5;39434:13;39427:20;;39220:233;;;:::o;39459:100::-;39498:7;39527:26;39547:5;39527:26;:::i;:::-;39516:37;;39459:100;;;:::o;39565:94::-;39604:7;39633:20;39647:5;39633:20;:::i;:::-;39622:31;;39565:94;;;:::o;39665:176::-;39697:1;39714:20;39732:1;39714:20;:::i;:::-;39709:25;;39748:20;39766:1;39748:20;:::i;:::-;39743:25;;39787:1;39777:35;;39792:18;;:::i;:::-;39777:35;39833:1;39830;39826:9;39821:14;;39665:176;;;;:::o;39847:180::-;39895:77;39892:1;39885:88;39992:4;39989:1;39982:15;40016:4;40013:1;40006:15;40033:180;40081:77;40078:1;40071:88;40178:4;40175:1;40168:15;40202:4;40199:1;40192:15;40219:180;40267:77;40264:1;40257:88;40364:4;40361:1;40354:15;40388:4;40385:1;40378:15;40405:180;40453:77;40450:1;40443:88;40550:4;40547:1;40540:15;40574:4;40571:1;40564:15;40591:180;40639:77;40636:1;40629:88;40736:4;40733:1;40726:15;40760:4;40757:1;40750:15;40777:117;40886:1;40883;40876:12;40900:117;41009:1;41006;40999:12;41023:117;41132:1;41129;41122:12;41146:117;41255:1;41252;41245:12;41269:117;41378:1;41375;41368:12;41392:102;41433:6;41484:2;41480:7;41475:2;41468:5;41464:14;41460:28;41450:38;;41392:102;;;:::o;41500:94::-;41533:8;41581:5;41577:2;41573:14;41552:35;;41500:94;;;:::o;41600:233::-;41740:34;41736:1;41728:6;41724:14;41717:58;41809:16;41804:2;41796:6;41792:15;41785:41;41600:233;:::o;41839:225::-;41979:34;41975:1;41967:6;41963:14;41956:58;42048:8;42043:2;42035:6;42031:15;42024:33;41839:225;:::o;42070:180::-;42210:32;42206:1;42198:6;42194:14;42187:56;42070:180;:::o;42256:229::-;42396:34;42392:1;42384:6;42380:14;42373:58;42465:12;42460:2;42452:6;42448:15;42441:37;42256:229;:::o;42491:182::-;42631:34;42627:1;42619:6;42615:14;42608:58;42491:182;:::o;42679:223::-;42819:34;42815:1;42807:6;42803:14;42796:58;42888:6;42883:2;42875:6;42871:15;42864:31;42679:223;:::o;42908:235::-;43048:34;43044:1;43036:6;43032:14;43025:58;43117:18;43112:2;43104:6;43100:15;43093:43;42908:235;:::o;43149:171::-;43289:23;43285:1;43277:6;43273:14;43266:47;43149:171;:::o;43326:172::-;43466:24;43462:1;43454:6;43450:14;43443:48;43326:172;:::o;43504:170::-;43644:22;43640:1;43632:6;43628:14;43621:46;43504:170;:::o;43680:167::-;43820:19;43816:1;43808:6;43804:14;43797:43;43680:167;:::o;43853:182::-;43993:34;43989:1;43981:6;43977:14;43970:58;43853:182;:::o;44041:173::-;44181:25;44177:1;44169:6;44165:14;44158:49;44041:173;:::o;44220:234::-;44360:34;44356:1;44348:6;44344:14;44337:58;44429:17;44424:2;44416:6;44412:15;44405:42;44220:234;:::o;44460:178::-;44600:30;44596:1;44588:6;44584:14;44577:54;44460:178;:::o;44644:114::-;;:::o;44764:166::-;44904:18;44900:1;44892:6;44888:14;44881:42;44764:166;:::o;44936:171::-;45076:23;45072:1;45064:6;45060:14;45053:47;44936:171;:::o;45113:234::-;45253:34;45249:1;45241:6;45237:14;45230:58;45322:17;45317:2;45309:6;45305:15;45298:42;45113:234;:::o;45353:238::-;45493:34;45489:1;45481:6;45477:14;45470:58;45562:21;45557:2;45549:6;45545:15;45538:46;45353:238;:::o;45597:::-;45737:34;45733:1;45725:6;45721:14;45714:58;45806:21;45801:2;45793:6;45789:15;45782:46;45597:238;:::o;45841:122::-;45914:24;45932:5;45914:24;:::i;:::-;45907:5;45904:35;45894:63;;45953:1;45950;45943:12;45894:63;45841:122;:::o;45969:116::-;46039:21;46054:5;46039:21;:::i;:::-;46032:5;46029:32;46019:60;;46075:1;46072;46065:12;46019:60;45969:116;:::o;46091:122::-;46164:24;46182:5;46164:24;:::i;:::-;46157:5;46154:35;46144:63;;46203:1;46200;46193:12;46144:63;46091:122;:::o;46219:120::-;46291:23;46308:5;46291:23;:::i;:::-;46284:5;46281:34;46271:62;;46329:1;46326;46319:12;46271:62;46219:120;:::o;46345:122::-;46418:24;46436:5;46418:24;:::i;:::-;46411:5;46408:35;46398:63;;46457:1;46454;46447:12;46398:63;46345:122;:::o

Swarm Source

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

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