ETH Price: $2,989.14 (-2.17%)
Gas: 2 Gwei

Hypercards by HyperCard (HCARD)
 

Overview

TokenID

28

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
Hypercard

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// 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 (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

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

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

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

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

// File: contracts/ERC721A.sol



pragma solidity ^0.8.4;










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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 private currentIndex = 0;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

        uint256 updatedIndex = startTokenId;

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    uint256 public nextOwnerToExplicitlySet = 0;

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

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

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

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

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



pragma solidity ^0.8.4;



contract Hypercard is Ownable, ERC721A, ReentrancyGuard {

    constructor() ERC721A("Hypercards by HyperCard", "HCARD", 2, 999) {}

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }
    function publicSaleMint(uint256 quantity)
        external
        payable
        callerIsUser
    {
        require(isPublicSaleOn(), "The sale is not active yet");
        require(totalSupply() + quantity <= 999, "There are not enough items left for you to mint");
        require(quantity <= 2, "Only 2 items per transaction!");
        require(numberMinted(msg.sender) + quantity <= 2, "Only 2 items per wallet!");
        _safeMint(msg.sender, quantity);
    }
    function devMint(uint256 quantity) external onlyOwner {
        for (uint256 i = 0; i < quantity; i++) {
            _safeMint(msg.sender, 2);
        }
    }
    string private _baseTokenURI;
    bool private _isPublicSaleActive;

    function isPublicSaleOn() public view returns (bool) {
        return _isPublicSaleActive;
    }
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }
    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }
    function setPublicSaleState(bool state) external onlyOwner {
        _isPublicSaleActive = state;
    }
    function withdrawMoney() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }
    function setOwnersExplicit(uint256 quantity)
        external
        onlyOwner
        nonReentrant
    {
        _setOwnersExplicit(quantity);
    }
    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }
    function getOwnershipData(uint256 tokenId)
        external
        view
        returns (TokenOwnership memory)
    {
        return ownershipOf(tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setPublicSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052600060015560006008553480156200001b57600080fd5b506040518060400160405280601781526020017f48797065726361726473206279204879706572436172640000000000000000008152506040518060400160405280600581526020017f484341524400000000000000000000000000000000000000000000000000000081525060026103e7620000ad620000a16200018d60201b60201c565b6200019560201b60201c565b60008111620000f3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000ea9062000379565b60405180910390fd5b6000821162000139576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001309062000357565b60405180910390fd5b83600290805190602001906200015192919062000259565b5082600390805190602001906200016a92919062000259565b508160a081815250508060808181525050505050506001600981905550620004af565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200026790620003ac565b90600052602060002090601f0160209004810192826200028b5760008555620002d7565b82601f10620002a657805160ff1916838001178555620002d7565b82800160010185558215620002d7579182015b82811115620002d6578251825591602001919060010190620002b9565b5b509050620002e69190620002ea565b5090565b5b8082111562000305576000816000905550600101620002eb565b5090565b6000620003186027836200039b565b9150620003258262000411565b604082019050919050565b60006200033f602e836200039b565b91506200034c8262000460565b604082019050919050565b60006020820190508181036000830152620003728162000309565b9050919050565b60006020820190508181036000830152620003948162000330565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620003c557607f821691505b60208210811415620003dc57620003db620003e2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60805160a051614955620004ea600039600081816120d1015281816120fa0152612885015260008181611e3b0152611e6f01526149556000f3fe6080604052600436106101c25760003560e01c806370a08231116100f7578063ac44600211610095578063d7224ba011610064578063d7224ba014610641578063dc33e6811461066c578063e985e9c5146106a9578063f2fde38b146106e6576101c2565b8063ac446002146105a8578063b3ab66b0146105bf578063b88d4fde146105db578063c87b56dd14610604576101c2565b80639231ab2a116100d15780639231ab2a146104ee5780639293a5c71461052b57806395d89b4114610554578063a22cb4651461057f576101c2565b806370a082311461046f578063715018a6146104ac5780638da5cb5b146104c3576101c2565b80632f745c591161016457806342842e0e1161013e57806342842e0e146103a35780634f6ccce7146103cc57806355f804b3146104095780636352211e14610432576101c2565b80632f745c5914610312578063375a069a1461034f5780633f5e474114610378576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c05780632d20fb60146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906130c2565b61070f565b6040516101fb91906137be565b60405180910390f35b34801561021057600080fd5b50610219610859565b60405161022691906137d9565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190613169565b6108eb565b6040516102639190613757565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190613055565b610970565b005b3480156102a157600080fd5b506102aa610a89565b6040516102b79190613bd6565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e29190612f3f565b610a93565b005b3480156102f557600080fd5b50610310600480360381019061030b9190613169565b610aa3565b005b34801561031e57600080fd5b5061033960048036038101906103349190613055565b610b0d565b6040516103469190613bd6565b60405180910390f35b34801561035b57600080fd5b5061037660048036038101906103719190613169565b610d0b565b005b34801561038457600080fd5b5061038d610d40565b60405161039a91906137be565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190612f3f565b610d57565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613169565b610d77565b6040516104009190613bd6565b60405180910390f35b34801561041557600080fd5b50610430600480360381019061042b919061311c565b610dca565b005b34801561043e57600080fd5b5061045960048036038101906104549190613169565b610de8565b6040516104669190613757565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190612ed2565b610dfe565b6040516104a39190613bd6565b60405180910390f35b3480156104b857600080fd5b506104c1610ee7565b005b3480156104cf57600080fd5b506104d8610efb565b6040516104e59190613757565b60405180910390f35b3480156104fa57600080fd5b5061051560048036038101906105109190613169565b610f24565b6040516105229190613bbb565b60405180910390f35b34801561053757600080fd5b50610552600480360381019061054d9190613095565b610f3c565b005b34801561056057600080fd5b50610569610f61565b60405161057691906137d9565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a19190613015565b610ff3565b005b3480156105b457600080fd5b506105bd611174565b005b6105d960048036038101906105d49190613169565b611281565b005b3480156105e757600080fd5b5061060260048036038101906105fd9190612f92565b611435565b005b34801561061057600080fd5b5061062b60048036038101906106269190613169565b611491565b60405161063891906137d9565b60405180910390f35b34801561064d57600080fd5b50610656611538565b6040516106639190613bd6565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190612ed2565b61153e565b6040516106a09190613bd6565b60405180910390f35b3480156106b557600080fd5b506106d060048036038101906106cb9190612eff565b611550565b6040516106dd91906137be565b60405180910390f35b3480156106f257600080fd5b5061070d60048036038101906107089190612ed2565b6115e4565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107da57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061084257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610852575061085182611668565b5b9050919050565b60606002805461086890613eda565b80601f016020809104026020016040519081016040528092919081815260200182805461089490613eda565b80156108e15780601f106108b6576101008083540402835291602001916108e1565b820191906000526020600020905b8154815290600101906020018083116108c457829003601f168201915b5050505050905090565b60006108f6826116d2565b610935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092c90613b7b565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061097b82610de8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e390613a5b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a0b6116e0565b73ffffffffffffffffffffffffffffffffffffffff161480610a3a5750610a3981610a346116e0565b611550565b5b610a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a709061393b565b60405180910390fd5b610a848383836116e8565b505050565b6000600154905090565b610a9e83838361179a565b505050565b610aab611d53565b60026009541415610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae890613b3b565b60405180910390fd5b6002600981905550610b0281611dd1565b600160098190555050565b6000610b1883610dfe565b8210610b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b50906137fb565b60405180910390fd5b6000610b63610a89565b905060008060005b83811015610cc9576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610c5d57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb55786841415610ca6578195505050505050610d05565b8380610cb190613f3d565b9450505b508080610cc190613f3d565b915050610b6b565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfc90613afb565b60405180910390fd5b92915050565b610d13611d53565b60005b81811015610d3c57610d2933600261205f565b8080610d3490613f3d565b915050610d16565b5050565b6000600b60009054906101000a900460ff16905090565b610d7283838360405180602001604052806000815250611435565b505050565b6000610d81610a89565b8210610dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db99061385b565b60405180910390fd5b819050919050565b610dd2611d53565b8181600a9190610de3929190612cc6565b505050565b6000610df38261207d565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e669061397b565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610eef611d53565b610ef96000612280565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f2c612d4c565b610f358261207d565b9050919050565b610f44611d53565b80600b60006101000a81548160ff02191690831515021790555050565b606060038054610f7090613eda565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9c90613eda565b8015610fe95780601f10610fbe57610100808354040283529160200191610fe9565b820191906000526020600020905b815481529060010190602001808311610fcc57829003601f168201915b5050505050905090565b610ffb6116e0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611069576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611060906139fb565b60405180910390fd5b80600760006110766116e0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111236116e0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161116891906137be565b60405180910390a35050565b61117c611d53565b600260095414156111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b990613b3b565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516111f090613742565b60006040518083038185875af1925050503d806000811461122d576040519150601f19603f3d011682016040523d82523d6000602084013e611232565b606091505b5050905080611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d90613a7b565b60405180910390fd5b506001600981905550565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e6906138fb565b60405180910390fd5b6112f7610d40565b611336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132d9061387b565b60405180910390fd5b6103e781611342610a89565b61134c9190613cdb565b111561138d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113849061391b565b60405180910390fd5b60028111156113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c890613a3b565b60405180910390fd5b6002816113dd3361153e565b6113e79190613cdb565b1115611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f906138db565b60405180910390fd5b611432338261205f565b50565b61144084848461179a565b61144c84848484612344565b61148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148290613a9b565b60405180910390fd5b50505050565b606061149c826116d2565b6114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d2906139db565b60405180910390fd5b60006114e56124db565b905060008151116115055760405180602001604052806000815250611530565b8061150f8461256d565b604051602001611520929190613713565b6040516020818303038152906040525b915050919050565b60085481565b6000611549826126ce565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115ec611d53565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561165c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116539061381b565b60405180910390fd5b61166581612280565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006117a58261207d565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166117cc6116e0565b73ffffffffffffffffffffffffffffffffffffffff16148061182857506117f16116e0565b73ffffffffffffffffffffffffffffffffffffffff16611810846108eb565b73ffffffffffffffffffffffffffffffffffffffff16145b806118445750611843826000015161183e6116e0565b611550565b5b905080611886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187d90613a1b565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ef9061399b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f9061389b565b60405180910390fd5b61197585858560016127b7565b61198560008484600001516116e8565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166119f39190613d62565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611a979190613c95565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184611b9d9190613cdb565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ce357611c13816116d2565b15611ce2576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d4b86868660016127bd565b505050505050565b611d5b6116e0565b73ffffffffffffffffffffffffffffffffffffffff16611d79610efb565b73ffffffffffffffffffffffffffffffffffffffff1614611dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc6906139bb565b60405180910390fd5b565b6000600854905060008211611e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e129061395b565b60405180910390fd5b600060018383611e2b9190613cdb565b611e359190613d96565b905060017f0000000000000000000000000000000000000000000000000000000000000000611e649190613d96565b811115611e9b5760017f0000000000000000000000000000000000000000000000000000000000000000611e989190613d96565b90505b611ea4816116d2565b611ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eda90613b1b565b60405180910390fd5b60008290505b81811161204657600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612033576000611f668261207d565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b808061203e90613f3d565b915050611ee9565b506001816120549190613cdb565b600881905550505050565b6120798282604051806020016040528060008152506127c3565b5050565b612085612d4c565b61208e826116d2565b6120cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c49061383b565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106121315760017f0000000000000000000000000000000000000000000000000000000000000000846121249190613d96565b61212e9190613cdb565b90505b60008390505b81811061223f576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461222b5780935050505061227b565b50808061223790613eb0565b915050612137565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227290613b5b565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006123658473ffffffffffffffffffffffffffffffffffffffff16612ca3565b156124ce578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261238e6116e0565b8786866040518563ffffffff1660e01b81526004016123b09493929190613772565b602060405180830381600087803b1580156123ca57600080fd5b505af19250505080156123fb57506040513d601f19601f820116820180604052508101906123f891906130ef565b60015b61247e573d806000811461242b576040519150601f19603f3d011682016040523d82523d6000602084013e612430565b606091505b50600081511415612476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246d90613a9b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124d3565b600190505b949350505050565b6060600a80546124ea90613eda565b80601f016020809104026020016040519081016040528092919081815260200182805461251690613eda565b80156125635780601f1061253857610100808354040283529160200191612563565b820191906000526020600020905b81548152906001019060200180831161254657829003601f168201915b5050505050905090565b606060008214156125b5576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126c9565b600082905060005b600082146125e75780806125d090613f3d565b915050600a826125e09190613d31565b91506125bd565b60008167ffffffffffffffff81111561260357612602614073565b5b6040519080825280601f01601f1916602001820160405280156126355781602001600182028036833780820191505090505b5090505b600085146126c25760018261264e9190613d96565b9150600a8561265d9190613f86565b60306126699190613cdb565b60f81b81838151811061267f5761267e614044565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126bb9190613d31565b9450612639565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561273f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612736906138bb565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561283a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283190613adb565b60405180910390fd5b612843816116d2565b15612883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287a90613abb565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156128e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128dd90613b9b565b60405180910390fd5b6128f360008583866127b7565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516129f09190613c95565b6fffffffffffffffffffffffffffffffff168152602001858360200151612a179190613c95565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612c8657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c266000888488612344565b612c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5c90613a9b565b60405180910390fd5b8180612c7090613f3d565b9250508080612c7e90613f3d565b915050612bb5565b5080600181905550612c9b60008785886127bd565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612cd290613eda565b90600052602060002090601f016020900481019282612cf45760008555612d3b565b82601f10612d0d57803560ff1916838001178555612d3b565b82800160010185558215612d3b579182015b82811115612d3a578235825591602001919060010190612d1f565b5b509050612d489190612d86565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612d9f576000816000905550600101612d87565b5090565b6000612db6612db184613c16565b613bf1565b905082815260208101848484011115612dd257612dd16140b1565b5b612ddd848285613e6e565b509392505050565b600081359050612df4816148c3565b92915050565b600081359050612e09816148da565b92915050565b600081359050612e1e816148f1565b92915050565b600081519050612e33816148f1565b92915050565b600082601f830112612e4e57612e4d6140a7565b5b8135612e5e848260208601612da3565b91505092915050565b60008083601f840112612e7d57612e7c6140a7565b5b8235905067ffffffffffffffff811115612e9a57612e996140a2565b5b602083019150836001820283011115612eb657612eb56140ac565b5b9250929050565b600081359050612ecc81614908565b92915050565b600060208284031215612ee857612ee76140bb565b5b6000612ef684828501612de5565b91505092915050565b60008060408385031215612f1657612f156140bb565b5b6000612f2485828601612de5565b9250506020612f3585828601612de5565b9150509250929050565b600080600060608486031215612f5857612f576140bb565b5b6000612f6686828701612de5565b9350506020612f7786828701612de5565b9250506040612f8886828701612ebd565b9150509250925092565b60008060008060808587031215612fac57612fab6140bb565b5b6000612fba87828801612de5565b9450506020612fcb87828801612de5565b9350506040612fdc87828801612ebd565b925050606085013567ffffffffffffffff811115612ffd57612ffc6140b6565b5b61300987828801612e39565b91505092959194509250565b6000806040838503121561302c5761302b6140bb565b5b600061303a85828601612de5565b925050602061304b85828601612dfa565b9150509250929050565b6000806040838503121561306c5761306b6140bb565b5b600061307a85828601612de5565b925050602061308b85828601612ebd565b9150509250929050565b6000602082840312156130ab576130aa6140bb565b5b60006130b984828501612dfa565b91505092915050565b6000602082840312156130d8576130d76140bb565b5b60006130e684828501612e0f565b91505092915050565b600060208284031215613105576131046140bb565b5b600061311384828501612e24565b91505092915050565b60008060208385031215613133576131326140bb565b5b600083013567ffffffffffffffff811115613151576131506140b6565b5b61315d85828601612e67565b92509250509250929050565b60006020828403121561317f5761317e6140bb565b5b600061318d84828501612ebd565b91505092915050565b61319f81613dca565b82525050565b6131ae81613dca565b82525050565b6131bd81613ddc565b82525050565b60006131ce82613c47565b6131d88185613c5d565b93506131e8818560208601613e7d565b6131f1816140c0565b840191505092915050565b600061320782613c52565b6132118185613c79565b9350613221818560208601613e7d565b61322a816140c0565b840191505092915050565b600061324082613c52565b61324a8185613c8a565b935061325a818560208601613e7d565b80840191505092915050565b6000613273602283613c79565b915061327e826140d1565b604082019050919050565b6000613296602683613c79565b91506132a182614120565b604082019050919050565b60006132b9602a83613c79565b91506132c48261416f565b604082019050919050565b60006132dc602383613c79565b91506132e7826141be565b604082019050919050565b60006132ff601a83613c79565b915061330a8261420d565b602082019050919050565b6000613322602583613c79565b915061332d82614236565b604082019050919050565b6000613345603183613c79565b915061335082614285565b604082019050919050565b6000613368601883613c79565b9150613373826142d4565b602082019050919050565b600061338b601e83613c79565b9150613396826142fd565b602082019050919050565b60006133ae602f83613c79565b91506133b982614326565b604082019050919050565b60006133d1603983613c79565b91506133dc82614375565b604082019050919050565b60006133f4601883613c79565b91506133ff826143c4565b602082019050919050565b6000613417602b83613c79565b9150613422826143ed565b604082019050919050565b600061343a602683613c79565b91506134458261443c565b604082019050919050565b600061345d600583613c8a565b91506134688261448b565b600582019050919050565b6000613480602083613c79565b915061348b826144b4565b602082019050919050565b60006134a3602f83613c79565b91506134ae826144dd565b604082019050919050565b60006134c6601a83613c79565b91506134d18261452c565b602082019050919050565b60006134e9603283613c79565b91506134f482614555565b604082019050919050565b600061350c601d83613c79565b9150613517826145a4565b602082019050919050565b600061352f602283613c79565b915061353a826145cd565b604082019050919050565b6000613552600083613c6e565b915061355d8261461c565b600082019050919050565b6000613575601083613c79565b91506135808261461f565b602082019050919050565b6000613598603383613c79565b91506135a382614648565b604082019050919050565b60006135bb601d83613c79565b91506135c682614697565b602082019050919050565b60006135de602183613c79565b91506135e9826146c0565b604082019050919050565b6000613601602e83613c79565b915061360c8261470f565b604082019050919050565b6000613624602683613c79565b915061362f8261475e565b604082019050919050565b6000613647601f83613c79565b9150613652826147ad565b602082019050919050565b600061366a602f83613c79565b9150613675826147d6565b604082019050919050565b600061368d602d83613c79565b915061369882614825565b604082019050919050565b60006136b0602283613c79565b91506136bb82614874565b604082019050919050565b6040820160008201516136dc6000850182613196565b5060208201516136ef6020850182613704565b50505050565b6136fe81613e50565b82525050565b61370d81613e5a565b82525050565b600061371f8285613235565b915061372b8284613235565b915061373682613450565b91508190509392505050565b600061374d82613545565b9150819050919050565b600060208201905061376c60008301846131a5565b92915050565b600060808201905061378760008301876131a5565b61379460208301866131a5565b6137a160408301856136f5565b81810360608301526137b381846131c3565b905095945050505050565b60006020820190506137d360008301846131b4565b92915050565b600060208201905081810360008301526137f381846131fc565b905092915050565b6000602082019050818103600083015261381481613266565b9050919050565b6000602082019050818103600083015261383481613289565b9050919050565b60006020820190508181036000830152613854816132ac565b9050919050565b60006020820190508181036000830152613874816132cf565b9050919050565b60006020820190508181036000830152613894816132f2565b9050919050565b600060208201905081810360008301526138b481613315565b9050919050565b600060208201905081810360008301526138d481613338565b9050919050565b600060208201905081810360008301526138f48161335b565b9050919050565b600060208201905081810360008301526139148161337e565b9050919050565b60006020820190508181036000830152613934816133a1565b9050919050565b60006020820190508181036000830152613954816133c4565b9050919050565b60006020820190508181036000830152613974816133e7565b9050919050565b600060208201905081810360008301526139948161340a565b9050919050565b600060208201905081810360008301526139b48161342d565b9050919050565b600060208201905081810360008301526139d481613473565b9050919050565b600060208201905081810360008301526139f481613496565b9050919050565b60006020820190508181036000830152613a14816134b9565b9050919050565b60006020820190508181036000830152613a34816134dc565b9050919050565b60006020820190508181036000830152613a54816134ff565b9050919050565b60006020820190508181036000830152613a7481613522565b9050919050565b60006020820190508181036000830152613a9481613568565b9050919050565b60006020820190508181036000830152613ab48161358b565b9050919050565b60006020820190508181036000830152613ad4816135ae565b9050919050565b60006020820190508181036000830152613af4816135d1565b9050919050565b60006020820190508181036000830152613b14816135f4565b9050919050565b60006020820190508181036000830152613b3481613617565b9050919050565b60006020820190508181036000830152613b548161363a565b9050919050565b60006020820190508181036000830152613b748161365d565b9050919050565b60006020820190508181036000830152613b9481613680565b9050919050565b60006020820190508181036000830152613bb4816136a3565b9050919050565b6000604082019050613bd060008301846136c6565b92915050565b6000602082019050613beb60008301846136f5565b92915050565b6000613bfb613c0c565b9050613c078282613f0c565b919050565b6000604051905090565b600067ffffffffffffffff821115613c3157613c30614073565b5b613c3a826140c0565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ca082613e14565b9150613cab83613e14565b9250826fffffffffffffffffffffffffffffffff03821115613cd057613ccf613fb7565b5b828201905092915050565b6000613ce682613e50565b9150613cf183613e50565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d2657613d25613fb7565b5b828201905092915050565b6000613d3c82613e50565b9150613d4783613e50565b925082613d5757613d56613fe6565b5b828204905092915050565b6000613d6d82613e14565b9150613d7883613e14565b925082821015613d8b57613d8a613fb7565b5b828203905092915050565b6000613da182613e50565b9150613dac83613e50565b925082821015613dbf57613dbe613fb7565b5b828203905092915050565b6000613dd582613e30565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613e9b578082015181840152602081019050613e80565b83811115613eaa576000848401525b50505050565b6000613ebb82613e50565b91506000821415613ecf57613ece613fb7565b5b600182039050919050565b60006002820490506001821680613ef257607f821691505b60208210811415613f0657613f05614015565b5b50919050565b613f15826140c0565b810181811067ffffffffffffffff82111715613f3457613f33614073565b5b80604052505050565b6000613f4882613e50565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f7b57613f7a613fb7565b5b600182019050919050565b6000613f9182613e50565b9150613f9c83613e50565b925082613fac57613fab613fe6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f5468652073616c65206973206e6f742061637469766520796574000000000000600082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f4f6e6c792032206974656d73207065722077616c6c6574210000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f546865726520617265206e6f7420656e6f756768206974656d73206c6566742060008201527f666f7220796f7520746f206d696e740000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4f6e6c792032206974656d7320706572207472616e73616374696f6e21000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008201527f6c65616e75700000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6148cc81613dca565b81146148d757600080fd5b50565b6148e381613ddc565b81146148ee57600080fd5b50565b6148fa81613de8565b811461490557600080fd5b50565b61491181613e50565b811461491c57600080fd5b5056fea26469706673582212207f88d02fc5c7098b5a8aedb8e6855607038d54f565a9b04c10cb58401bb3047b64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101c25760003560e01c806370a08231116100f7578063ac44600211610095578063d7224ba011610064578063d7224ba014610641578063dc33e6811461066c578063e985e9c5146106a9578063f2fde38b146106e6576101c2565b8063ac446002146105a8578063b3ab66b0146105bf578063b88d4fde146105db578063c87b56dd14610604576101c2565b80639231ab2a116100d15780639231ab2a146104ee5780639293a5c71461052b57806395d89b4114610554578063a22cb4651461057f576101c2565b806370a082311461046f578063715018a6146104ac5780638da5cb5b146104c3576101c2565b80632f745c591161016457806342842e0e1161013e57806342842e0e146103a35780634f6ccce7146103cc57806355f804b3146104095780636352211e14610432576101c2565b80632f745c5914610312578063375a069a1461034f5780633f5e474114610378576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd1461029557806323b872dd146102c05780632d20fb60146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e991906130c2565b61070f565b6040516101fb91906137be565b60405180910390f35b34801561021057600080fd5b50610219610859565b60405161022691906137d9565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190613169565b6108eb565b6040516102639190613757565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190613055565b610970565b005b3480156102a157600080fd5b506102aa610a89565b6040516102b79190613bd6565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e29190612f3f565b610a93565b005b3480156102f557600080fd5b50610310600480360381019061030b9190613169565b610aa3565b005b34801561031e57600080fd5b5061033960048036038101906103349190613055565b610b0d565b6040516103469190613bd6565b60405180910390f35b34801561035b57600080fd5b5061037660048036038101906103719190613169565b610d0b565b005b34801561038457600080fd5b5061038d610d40565b60405161039a91906137be565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190612f3f565b610d57565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613169565b610d77565b6040516104009190613bd6565b60405180910390f35b34801561041557600080fd5b50610430600480360381019061042b919061311c565b610dca565b005b34801561043e57600080fd5b5061045960048036038101906104549190613169565b610de8565b6040516104669190613757565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190612ed2565b610dfe565b6040516104a39190613bd6565b60405180910390f35b3480156104b857600080fd5b506104c1610ee7565b005b3480156104cf57600080fd5b506104d8610efb565b6040516104e59190613757565b60405180910390f35b3480156104fa57600080fd5b5061051560048036038101906105109190613169565b610f24565b6040516105229190613bbb565b60405180910390f35b34801561053757600080fd5b50610552600480360381019061054d9190613095565b610f3c565b005b34801561056057600080fd5b50610569610f61565b60405161057691906137d9565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a19190613015565b610ff3565b005b3480156105b457600080fd5b506105bd611174565b005b6105d960048036038101906105d49190613169565b611281565b005b3480156105e757600080fd5b5061060260048036038101906105fd9190612f92565b611435565b005b34801561061057600080fd5b5061062b60048036038101906106269190613169565b611491565b60405161063891906137d9565b60405180910390f35b34801561064d57600080fd5b50610656611538565b6040516106639190613bd6565b60405180910390f35b34801561067857600080fd5b50610693600480360381019061068e9190612ed2565b61153e565b6040516106a09190613bd6565b60405180910390f35b3480156106b557600080fd5b506106d060048036038101906106cb9190612eff565b611550565b6040516106dd91906137be565b60405180910390f35b3480156106f257600080fd5b5061070d60048036038101906107089190612ed2565b6115e4565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107da57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061084257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610852575061085182611668565b5b9050919050565b60606002805461086890613eda565b80601f016020809104026020016040519081016040528092919081815260200182805461089490613eda565b80156108e15780601f106108b6576101008083540402835291602001916108e1565b820191906000526020600020905b8154815290600101906020018083116108c457829003601f168201915b5050505050905090565b60006108f6826116d2565b610935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092c90613b7b565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061097b82610de8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e390613a5b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a0b6116e0565b73ffffffffffffffffffffffffffffffffffffffff161480610a3a5750610a3981610a346116e0565b611550565b5b610a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a709061393b565b60405180910390fd5b610a848383836116e8565b505050565b6000600154905090565b610a9e83838361179a565b505050565b610aab611d53565b60026009541415610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae890613b3b565b60405180910390fd5b6002600981905550610b0281611dd1565b600160098190555050565b6000610b1883610dfe565b8210610b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b50906137fb565b60405180910390fd5b6000610b63610a89565b905060008060005b83811015610cc9576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610c5d57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb55786841415610ca6578195505050505050610d05565b8380610cb190613f3d565b9450505b508080610cc190613f3d565b915050610b6b565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfc90613afb565b60405180910390fd5b92915050565b610d13611d53565b60005b81811015610d3c57610d2933600261205f565b8080610d3490613f3d565b915050610d16565b5050565b6000600b60009054906101000a900460ff16905090565b610d7283838360405180602001604052806000815250611435565b505050565b6000610d81610a89565b8210610dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db99061385b565b60405180910390fd5b819050919050565b610dd2611d53565b8181600a9190610de3929190612cc6565b505050565b6000610df38261207d565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e669061397b565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610eef611d53565b610ef96000612280565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f2c612d4c565b610f358261207d565b9050919050565b610f44611d53565b80600b60006101000a81548160ff02191690831515021790555050565b606060038054610f7090613eda565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9c90613eda565b8015610fe95780601f10610fbe57610100808354040283529160200191610fe9565b820191906000526020600020905b815481529060010190602001808311610fcc57829003601f168201915b5050505050905090565b610ffb6116e0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611069576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611060906139fb565b60405180910390fd5b80600760006110766116e0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111236116e0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161116891906137be565b60405180910390a35050565b61117c611d53565b600260095414156111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b990613b3b565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff16476040516111f090613742565b60006040518083038185875af1925050503d806000811461122d576040519150601f19603f3d011682016040523d82523d6000602084013e611232565b606091505b5050905080611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d90613a7b565b60405180910390fd5b506001600981905550565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e6906138fb565b60405180910390fd5b6112f7610d40565b611336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132d9061387b565b60405180910390fd5b6103e781611342610a89565b61134c9190613cdb565b111561138d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113849061391b565b60405180910390fd5b60028111156113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c890613a3b565b60405180910390fd5b6002816113dd3361153e565b6113e79190613cdb565b1115611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f906138db565b60405180910390fd5b611432338261205f565b50565b61144084848461179a565b61144c84848484612344565b61148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148290613a9b565b60405180910390fd5b50505050565b606061149c826116d2565b6114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d2906139db565b60405180910390fd5b60006114e56124db565b905060008151116115055760405180602001604052806000815250611530565b8061150f8461256d565b604051602001611520929190613713565b6040516020818303038152906040525b915050919050565b60085481565b6000611549826126ce565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115ec611d53565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561165c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116539061381b565b60405180910390fd5b61166581612280565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006117a58261207d565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166117cc6116e0565b73ffffffffffffffffffffffffffffffffffffffff16148061182857506117f16116e0565b73ffffffffffffffffffffffffffffffffffffffff16611810846108eb565b73ffffffffffffffffffffffffffffffffffffffff16145b806118445750611843826000015161183e6116e0565b611550565b5b905080611886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187d90613a1b565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ef9061399b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f9061389b565b60405180910390fd5b61197585858560016127b7565b61198560008484600001516116e8565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166119f39190613d62565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611a979190613c95565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184611b9d9190613cdb565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ce357611c13816116d2565b15611ce2576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d4b86868660016127bd565b505050505050565b611d5b6116e0565b73ffffffffffffffffffffffffffffffffffffffff16611d79610efb565b73ffffffffffffffffffffffffffffffffffffffff1614611dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc6906139bb565b60405180910390fd5b565b6000600854905060008211611e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e129061395b565b60405180910390fd5b600060018383611e2b9190613cdb565b611e359190613d96565b905060017f00000000000000000000000000000000000000000000000000000000000003e7611e649190613d96565b811115611e9b5760017f00000000000000000000000000000000000000000000000000000000000003e7611e989190613d96565b90505b611ea4816116d2565b611ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eda90613b1b565b60405180910390fd5b60008290505b81811161204657600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612033576000611f668261207d565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b808061203e90613f3d565b915050611ee9565b506001816120549190613cdb565b600881905550505050565b6120798282604051806020016040528060008152506127c3565b5050565b612085612d4c565b61208e826116d2565b6120cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c49061383b565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000283106121315760017f0000000000000000000000000000000000000000000000000000000000000002846121249190613d96565b61212e9190613cdb565b90505b60008390505b81811061223f576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461222b5780935050505061227b565b50808061223790613eb0565b915050612137565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227290613b5b565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006123658473ffffffffffffffffffffffffffffffffffffffff16612ca3565b156124ce578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261238e6116e0565b8786866040518563ffffffff1660e01b81526004016123b09493929190613772565b602060405180830381600087803b1580156123ca57600080fd5b505af19250505080156123fb57506040513d601f19601f820116820180604052508101906123f891906130ef565b60015b61247e573d806000811461242b576040519150601f19603f3d011682016040523d82523d6000602084013e612430565b606091505b50600081511415612476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246d90613a9b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124d3565b600190505b949350505050565b6060600a80546124ea90613eda565b80601f016020809104026020016040519081016040528092919081815260200182805461251690613eda565b80156125635780601f1061253857610100808354040283529160200191612563565b820191906000526020600020905b81548152906001019060200180831161254657829003601f168201915b5050505050905090565b606060008214156125b5576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126c9565b600082905060005b600082146125e75780806125d090613f3d565b915050600a826125e09190613d31565b91506125bd565b60008167ffffffffffffffff81111561260357612602614073565b5b6040519080825280601f01601f1916602001820160405280156126355781602001600182028036833780820191505090505b5090505b600085146126c25760018261264e9190613d96565b9150600a8561265d9190613f86565b60306126699190613cdb565b60f81b81838151811061267f5761267e614044565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126bb9190613d31565b9450612639565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561273f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612736906138bb565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561283a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283190613adb565b60405180910390fd5b612843816116d2565b15612883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287a90613abb565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000028311156128e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128dd90613b9b565b60405180910390fd5b6128f360008583866127b7565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516129f09190613c95565b6fffffffffffffffffffffffffffffffff168152602001858360200151612a179190613c95565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612c8657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c266000888488612344565b612c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5c90613a9b565b60405180910390fd5b8180612c7090613f3d565b9250508080612c7e90613f3d565b915050612bb5565b5080600181905550612c9b60008785886127bd565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612cd290613eda565b90600052602060002090601f016020900481019282612cf45760008555612d3b565b82601f10612d0d57803560ff1916838001178555612d3b565b82800160010185558215612d3b579182015b82811115612d3a578235825591602001919060010190612d1f565b5b509050612d489190612d86565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612d9f576000816000905550600101612d87565b5090565b6000612db6612db184613c16565b613bf1565b905082815260208101848484011115612dd257612dd16140b1565b5b612ddd848285613e6e565b509392505050565b600081359050612df4816148c3565b92915050565b600081359050612e09816148da565b92915050565b600081359050612e1e816148f1565b92915050565b600081519050612e33816148f1565b92915050565b600082601f830112612e4e57612e4d6140a7565b5b8135612e5e848260208601612da3565b91505092915050565b60008083601f840112612e7d57612e7c6140a7565b5b8235905067ffffffffffffffff811115612e9a57612e996140a2565b5b602083019150836001820283011115612eb657612eb56140ac565b5b9250929050565b600081359050612ecc81614908565b92915050565b600060208284031215612ee857612ee76140bb565b5b6000612ef684828501612de5565b91505092915050565b60008060408385031215612f1657612f156140bb565b5b6000612f2485828601612de5565b9250506020612f3585828601612de5565b9150509250929050565b600080600060608486031215612f5857612f576140bb565b5b6000612f6686828701612de5565b9350506020612f7786828701612de5565b9250506040612f8886828701612ebd565b9150509250925092565b60008060008060808587031215612fac57612fab6140bb565b5b6000612fba87828801612de5565b9450506020612fcb87828801612de5565b9350506040612fdc87828801612ebd565b925050606085013567ffffffffffffffff811115612ffd57612ffc6140b6565b5b61300987828801612e39565b91505092959194509250565b6000806040838503121561302c5761302b6140bb565b5b600061303a85828601612de5565b925050602061304b85828601612dfa565b9150509250929050565b6000806040838503121561306c5761306b6140bb565b5b600061307a85828601612de5565b925050602061308b85828601612ebd565b9150509250929050565b6000602082840312156130ab576130aa6140bb565b5b60006130b984828501612dfa565b91505092915050565b6000602082840312156130d8576130d76140bb565b5b60006130e684828501612e0f565b91505092915050565b600060208284031215613105576131046140bb565b5b600061311384828501612e24565b91505092915050565b60008060208385031215613133576131326140bb565b5b600083013567ffffffffffffffff811115613151576131506140b6565b5b61315d85828601612e67565b92509250509250929050565b60006020828403121561317f5761317e6140bb565b5b600061318d84828501612ebd565b91505092915050565b61319f81613dca565b82525050565b6131ae81613dca565b82525050565b6131bd81613ddc565b82525050565b60006131ce82613c47565b6131d88185613c5d565b93506131e8818560208601613e7d565b6131f1816140c0565b840191505092915050565b600061320782613c52565b6132118185613c79565b9350613221818560208601613e7d565b61322a816140c0565b840191505092915050565b600061324082613c52565b61324a8185613c8a565b935061325a818560208601613e7d565b80840191505092915050565b6000613273602283613c79565b915061327e826140d1565b604082019050919050565b6000613296602683613c79565b91506132a182614120565b604082019050919050565b60006132b9602a83613c79565b91506132c48261416f565b604082019050919050565b60006132dc602383613c79565b91506132e7826141be565b604082019050919050565b60006132ff601a83613c79565b915061330a8261420d565b602082019050919050565b6000613322602583613c79565b915061332d82614236565b604082019050919050565b6000613345603183613c79565b915061335082614285565b604082019050919050565b6000613368601883613c79565b9150613373826142d4565b602082019050919050565b600061338b601e83613c79565b9150613396826142fd565b602082019050919050565b60006133ae602f83613c79565b91506133b982614326565b604082019050919050565b60006133d1603983613c79565b91506133dc82614375565b604082019050919050565b60006133f4601883613c79565b91506133ff826143c4565b602082019050919050565b6000613417602b83613c79565b9150613422826143ed565b604082019050919050565b600061343a602683613c79565b91506134458261443c565b604082019050919050565b600061345d600583613c8a565b91506134688261448b565b600582019050919050565b6000613480602083613c79565b915061348b826144b4565b602082019050919050565b60006134a3602f83613c79565b91506134ae826144dd565b604082019050919050565b60006134c6601a83613c79565b91506134d18261452c565b602082019050919050565b60006134e9603283613c79565b91506134f482614555565b604082019050919050565b600061350c601d83613c79565b9150613517826145a4565b602082019050919050565b600061352f602283613c79565b915061353a826145cd565b604082019050919050565b6000613552600083613c6e565b915061355d8261461c565b600082019050919050565b6000613575601083613c79565b91506135808261461f565b602082019050919050565b6000613598603383613c79565b91506135a382614648565b604082019050919050565b60006135bb601d83613c79565b91506135c682614697565b602082019050919050565b60006135de602183613c79565b91506135e9826146c0565b604082019050919050565b6000613601602e83613c79565b915061360c8261470f565b604082019050919050565b6000613624602683613c79565b915061362f8261475e565b604082019050919050565b6000613647601f83613c79565b9150613652826147ad565b602082019050919050565b600061366a602f83613c79565b9150613675826147d6565b604082019050919050565b600061368d602d83613c79565b915061369882614825565b604082019050919050565b60006136b0602283613c79565b91506136bb82614874565b604082019050919050565b6040820160008201516136dc6000850182613196565b5060208201516136ef6020850182613704565b50505050565b6136fe81613e50565b82525050565b61370d81613e5a565b82525050565b600061371f8285613235565b915061372b8284613235565b915061373682613450565b91508190509392505050565b600061374d82613545565b9150819050919050565b600060208201905061376c60008301846131a5565b92915050565b600060808201905061378760008301876131a5565b61379460208301866131a5565b6137a160408301856136f5565b81810360608301526137b381846131c3565b905095945050505050565b60006020820190506137d360008301846131b4565b92915050565b600060208201905081810360008301526137f381846131fc565b905092915050565b6000602082019050818103600083015261381481613266565b9050919050565b6000602082019050818103600083015261383481613289565b9050919050565b60006020820190508181036000830152613854816132ac565b9050919050565b60006020820190508181036000830152613874816132cf565b9050919050565b60006020820190508181036000830152613894816132f2565b9050919050565b600060208201905081810360008301526138b481613315565b9050919050565b600060208201905081810360008301526138d481613338565b9050919050565b600060208201905081810360008301526138f48161335b565b9050919050565b600060208201905081810360008301526139148161337e565b9050919050565b60006020820190508181036000830152613934816133a1565b9050919050565b60006020820190508181036000830152613954816133c4565b9050919050565b60006020820190508181036000830152613974816133e7565b9050919050565b600060208201905081810360008301526139948161340a565b9050919050565b600060208201905081810360008301526139b48161342d565b9050919050565b600060208201905081810360008301526139d481613473565b9050919050565b600060208201905081810360008301526139f481613496565b9050919050565b60006020820190508181036000830152613a14816134b9565b9050919050565b60006020820190508181036000830152613a34816134dc565b9050919050565b60006020820190508181036000830152613a54816134ff565b9050919050565b60006020820190508181036000830152613a7481613522565b9050919050565b60006020820190508181036000830152613a9481613568565b9050919050565b60006020820190508181036000830152613ab48161358b565b9050919050565b60006020820190508181036000830152613ad4816135ae565b9050919050565b60006020820190508181036000830152613af4816135d1565b9050919050565b60006020820190508181036000830152613b14816135f4565b9050919050565b60006020820190508181036000830152613b3481613617565b9050919050565b60006020820190508181036000830152613b548161363a565b9050919050565b60006020820190508181036000830152613b748161365d565b9050919050565b60006020820190508181036000830152613b9481613680565b9050919050565b60006020820190508181036000830152613bb4816136a3565b9050919050565b6000604082019050613bd060008301846136c6565b92915050565b6000602082019050613beb60008301846136f5565b92915050565b6000613bfb613c0c565b9050613c078282613f0c565b919050565b6000604051905090565b600067ffffffffffffffff821115613c3157613c30614073565b5b613c3a826140c0565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ca082613e14565b9150613cab83613e14565b9250826fffffffffffffffffffffffffffffffff03821115613cd057613ccf613fb7565b5b828201905092915050565b6000613ce682613e50565b9150613cf183613e50565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d2657613d25613fb7565b5b828201905092915050565b6000613d3c82613e50565b9150613d4783613e50565b925082613d5757613d56613fe6565b5b828204905092915050565b6000613d6d82613e14565b9150613d7883613e14565b925082821015613d8b57613d8a613fb7565b5b828203905092915050565b6000613da182613e50565b9150613dac83613e50565b925082821015613dbf57613dbe613fb7565b5b828203905092915050565b6000613dd582613e30565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613e9b578082015181840152602081019050613e80565b83811115613eaa576000848401525b50505050565b6000613ebb82613e50565b91506000821415613ecf57613ece613fb7565b5b600182039050919050565b60006002820490506001821680613ef257607f821691505b60208210811415613f0657613f05614015565b5b50919050565b613f15826140c0565b810181811067ffffffffffffffff82111715613f3457613f33614073565b5b80604052505050565b6000613f4882613e50565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f7b57613f7a613fb7565b5b600182019050919050565b6000613f9182613e50565b9150613f9c83613e50565b925082613fac57613fab613fe6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f5468652073616c65206973206e6f742061637469766520796574000000000000600082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f4f6e6c792032206974656d73207065722077616c6c6574210000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f546865726520617265206e6f7420656e6f756768206974656d73206c6566742060008201527f666f7220796f7520746f206d696e740000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4f6e6c792032206974656d7320706572207472616e73616374696f6e21000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008201527f6c65616e75700000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6148cc81613dca565b81146148d757600080fd5b50565b6148e381613ddc565b81146148ee57600080fd5b50565b6148fa81613de8565b811461490557600080fd5b50565b61491181613e50565b811461491c57600080fd5b5056fea26469706673582212207f88d02fc5c7098b5a8aedb8e6855607038d54f565a9b04c10cb58401bb3047b64736f6c63430008070033

Deployed Bytecode Sourcemap

45288:2089:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28522:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30483:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32187:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31708:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26878:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33214:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46926:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27586:864;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46038:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46282:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33447:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27055:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46506:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30292:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29008:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23593:103;;;;;;;;;;;;;:::i;:::-;;22945:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47207:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46618:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30652:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32551:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46729:191;;;;;;;;;;;;;:::i;:::-;;45556:476;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33695:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30827:477;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38576:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47088:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32933:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23851:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28522:422;28669:4;28726:25;28711:40;;;:11;:40;;;;:105;;;;28783:33;28768:48;;;:11;:48;;;;28711:105;:172;;;;28848:35;28833:50;;;:11;:50;;;;28711:172;:225;;;;28900:36;28924:11;28900:23;:36::i;:::-;28711:225;28691:245;;28522:422;;;:::o;30483:100::-;30537:13;30570:5;30563:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30483:100;:::o;32187:292::-;32291:7;32338:16;32346:7;32338;:16::i;:::-;32316:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32447:15;:24;32463:7;32447:24;;;;;;;;;;;;;;;;;;;;;32440:31;;32187:292;;;:::o;31708:413::-;31781:13;31797:24;31813:7;31797:15;:24::i;:::-;31781:40;;31846:5;31840:11;;:2;:11;;;;31832:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31941:5;31925:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31950:37;31967:5;31974:12;:10;:12::i;:::-;31950:16;:37::i;:::-;31925:62;31903:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;32085:28;32094:2;32098:7;32107:5;32085:8;:28::i;:::-;31770:351;31708:413;;:::o;26878:100::-;26931:7;26958:12;;26951:19;;26878:100;:::o;33214:162::-;33340:28;33350:4;33356:2;33360:7;33340:9;:28::i;:::-;33214:162;;;:::o;46926:156::-;22831:13;:11;:13::i;:::-;44268:1:::1;44866:7;;:19;;44858:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;44268:1;44999:7;:18;;;;47046:28:::2;47065:8;47046:18;:28::i;:::-;44224:1:::1;45178:7;:22;;;;46926:156:::0;:::o;27586:864::-;27711:7;27752:16;27762:5;27752:9;:16::i;:::-;27744:5;:24;27736:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;27818:22;27843:13;:11;:13::i;:::-;27818:38;;27867:19;27901:25;27955:9;27950:426;27974:14;27970:1;:18;27950:426;;;28010:31;28044:11;:14;28056:1;28044:14;;;;;;;;;;;28010:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28103:1;28077:28;;:9;:14;;;:28;;;28073:103;;28146:9;:14;;;28126:34;;28073:103;28215:5;28194:26;;:17;:26;;;28190:175;;;28260:5;28245:11;:20;28241:77;;;28297:1;28290:8;;;;;;;;;28241:77;28336:13;;;;;:::i;:::-;;;;28190:175;27995:381;27990:3;;;;;:::i;:::-;;;;27950:426;;;;28386:56;;;;;;;;;;:::i;:::-;;;;;;;;27586:864;;;;;:::o;46038:162::-;22831:13;:11;:13::i;:::-;46108:9:::1;46103:90;46127:8;46123:1;:12;46103:90;;;46157:24;46167:10;46179:1;46157:9;:24::i;:::-;46137:3;;;;;:::i;:::-;;;;46103:90;;;;46038:162:::0;:::o;46282:98::-;46329:4;46353:19;;;;;;;;;;;46346:26;;46282:98;:::o;33447:177::-;33577:39;33594:4;33600:2;33604:7;33577:39;;;;;;;;;;;;:16;:39::i;:::-;33447:177;;;:::o;27055:228::-;27158:7;27199:13;:11;:13::i;:::-;27191:5;:21;27183:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;27270:5;27263:12;;27055:228;;;:::o;46506:106::-;22831:13;:11;:13::i;:::-;46597:7:::1;;46581:13;:23;;;;;;;:::i;:::-;;46506:106:::0;;:::o;30292:124::-;30356:7;30383:20;30395:7;30383:11;:20::i;:::-;:25;;;30376:32;;30292:124;;;:::o;29008:258::-;29072:7;29131:1;29114:19;;:5;:19;;;;29092:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;29230:12;:19;29243:5;29230:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;29222:36;;29215:43;;29008:258;;;:::o;23593:103::-;22831:13;:11;:13::i;:::-;23658:30:::1;23685:1;23658:18;:30::i;:::-;23593:103::o:0;22945:87::-;22991:7;23018:6;;;;;;;;;;;23011:13;;22945:87;:::o;47207:167::-;47300:21;;:::i;:::-;47346:20;47358:7;47346:11;:20::i;:::-;47339:27;;47207:167;;;:::o;46618:105::-;22831:13;:11;:13::i;:::-;46710:5:::1;46688:19;;:27;;;;;;;;;;;;;;;;;;46618:105:::0;:::o;30652:104::-;30708:13;30741:7;30734:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30652:104;:::o;32551:311::-;32681:12;:10;:12::i;:::-;32669:24;;:8;:24;;;;32661:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;32782:8;32737:18;:32;32756:12;:10;:12::i;:::-;32737:32;;;;;;;;;;;;;;;:42;32770:8;32737:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32835:8;32806:48;;32821:12;:10;:12::i;:::-;32806:48;;;32845:8;32806:48;;;;;;:::i;:::-;;;;;;;;32551:311;;:::o;46729:191::-;22831:13;:11;:13::i;:::-;44268:1:::1;44866:7;;:19;;44858:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;44268:1;44999:7;:18;;;;46798:12:::2;46816:10;:15;;46839:21;46816:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46797:68;;;46884:7;46876:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;46786:134;44224:1:::1;45178:7;:22;;;;46729:191::o:0;45556:476::-;45485:10;45472:23;;:9;:23;;;45464:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45679:16:::1;:14;:16::i;:::-;45671:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;45773:3;45761:8;45745:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:31;;45737:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;45859:1;45847:8;:13;;45839:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;45952:1;45940:8;45913:24;45926:10;45913:12;:24::i;:::-;:35;;;;:::i;:::-;:40;;45905:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;45993:31;46003:10;46015:8;45993:9;:31::i;:::-;45556:476:::0;:::o;33695:355::-;33854:28;33864:4;33870:2;33874:7;33854:9;:28::i;:::-;33915:48;33938:4;33944:2;33948:7;33957:5;33915:22;:48::i;:::-;33893:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;33695:355;;;;:::o;30827:477::-;30945:13;30998:16;31006:7;30998;:16::i;:::-;30976:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;31102:21;31126:10;:8;:10::i;:::-;31102:34;;31191:1;31173:7;31167:21;:25;:129;;;;;;;;;;;;;;;;;31236:7;31245:18;:7;:16;:18::i;:::-;31219:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31167:129;31147:149;;;30827:477;;;:::o;38576:43::-;;;;:::o;47088:113::-;47146:7;47173:20;47187:5;47173:13;:20::i;:::-;47166:27;;47088:113;;;:::o;32933:214::-;33075:4;33104:18;:25;33123:5;33104:25;;;;;;;;;;;;;;;:35;33130:8;33104:35;;;;;;;;;;;;;;;;;;;;;;;;;33097:42;;32933:214;;;;:::o;23851:201::-;22831:13;:11;:13::i;:::-;23960:1:::1;23940:22;;:8;:22;;;;23932:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24016:28;24035:8;24016:18;:28::i;:::-;23851:201:::0;:::o;1782:157::-;1867:4;1906:25;1891:40;;;:11;:40;;;;1884:47;;1782:157;;;:::o;34305:111::-;34362:4;34396:12;;34386:7;:22;34379:29;;34305:111;;;:::o;21496:98::-;21549:7;21576:10;21569:17;;21496:98;:::o;38372:196::-;38514:2;38487:15;:24;38503:7;38487:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38552:7;38548:2;38532:28;;38541:5;38532:28;;;;;;;;;;;;38372:196;;;:::o;36545:1709::-;36660:35;36698:20;36710:7;36698:11;:20::i;:::-;36660:58;;36731:22;36773:13;:18;;;36757:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;36832:12;:10;:12::i;:::-;36808:36;;:20;36820:7;36808:11;:20::i;:::-;:36;;;36757:87;:154;;;;36861:50;36878:13;:18;;;36898:12;:10;:12::i;:::-;36861:16;:50::i;:::-;36757:154;36731:181;;36947:17;36925:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;37099:4;37077:26;;:13;:18;;;:26;;;37055:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;37202:1;37188:16;;:2;:16;;;;37180:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37259:43;37281:4;37287:2;37291:7;37300:1;37259:21;:43::i;:::-;37367:49;37384:1;37388:7;37397:13;:18;;;37367:8;:49::i;:::-;37459:1;37429:12;:18;37442:4;37429:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37499:1;37471:12;:16;37484:2;37471:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37534:43;;;;;;;;37549:2;37534:43;;;;;;37560:15;37534:43;;;;;37511:11;:20;37523:7;37511:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37817:19;37849:1;37839:7;:11;;;;:::i;:::-;37817:33;;37906:1;37865:43;;:11;:24;37877:11;37865:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;37861:288;;;37929:20;37937:11;37929:7;:20::i;:::-;37925:213;;;37997:125;;;;;;;;38034:13;:18;;;37997:125;;;;;;38075:13;:28;;;37997:125;;;;;37970:11;:24;37982:11;37970:24;;;;;;;;;;;:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37925:213;37861:288;38185:7;38181:2;38166:27;;38175:4;38166:27;;;;;;;;;;;;38204:42;38225:4;38231:2;38235:7;38244:1;38204:20;:42::i;:::-;36649:1605;;;36545:1709;;;:::o;23110:132::-;23185:12;:10;:12::i;:::-;23174:23;;:7;:5;:7::i;:::-;:23;;;23166:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23110:132::o;38732:950::-;38798:25;38826:24;;38798:52;;38880:1;38869:8;:12;38861:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;38921:16;38971:1;38960:8;38940:17;:28;;;;:::i;:::-;:32;;;;:::i;:::-;38921:51;;39015:1;38998:14;:18;;;;:::i;:::-;38987:8;:29;38983:91;;;39061:1;39044:14;:18;;;;:::i;:::-;39033:29;;38983:91;39197:17;39205:8;39197:7;:17::i;:::-;39189:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39273:9;39285:17;39273:29;;39268:357;39309:8;39304:1;:13;39268:357;;39374:1;39343:33;;:11;:14;39355:1;39343:14;;;;;;;;;;;:19;;;;;;;;;;;;:33;;;39339:275;;;39397:31;39431:14;39443:1;39431:11;:14::i;:::-;39397:48;;39481:117;;;;;;;;39518:9;:14;;;39481:117;;;;;;39555:9;:24;;;39481:117;;;;;39464:11;:14;39476:1;39464:14;;;;;;;;;;;:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39378:236;39339:275;39319:3;;;;;:::i;:::-;;;;39268:357;;;;39673:1;39662:8;:12;;;;:::i;:::-;39635:24;:39;;;;38787:895;;38732:950;:::o;34424:104::-;34493:27;34503:2;34507:8;34493:27;;;;;;;;;;;;:9;:27::i;:::-;34424:104;;:::o;29548:682::-;29636:21;;:::i;:::-;29683:16;29691:7;29683;:16::i;:::-;29675:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29759:26;29811:12;29800:7;:23;29796:103;;29886:1;29871:12;29861:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;29840:47;;29796:103;29916:12;29931:7;29916:22;;29911:242;29948:18;29940:4;:26;29911:242;;29991:31;30025:11;:17;30037:4;30025:17;;;;;;;;;;;29991:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30087:1;30061:28;;:9;:14;;;:28;;;30057:85;;30117:9;30110:16;;;;;;;30057:85;29976:177;29968:6;;;;;:::i;:::-;;;;29911:242;;;;30165:57;;;;;;;;;;:::i;:::-;;;;;;;;29548:682;;;;:::o;24212:191::-;24286:16;24305:6;;;;;;;;;;;24286:25;;24331:8;24322:6;;:17;;;;;;;;;;;;;;;;;;24386:8;24355:40;;24376:8;24355:40;;;;;;;;;;;;24275:128;24212:191;:::o;40247:985::-;40402:4;40423:15;:2;:13;;;:15::i;:::-;40419:806;;;40492:2;40476:36;;;40535:12;:10;:12::i;:::-;40570:4;40597:7;40627:5;40476:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40455:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40855:1;40838:6;:13;:18;40834:321;;;40881:109;;;;;;;;;;:::i;:::-;;;;;;;;40834:321;41105:6;41099:13;41090:6;41086:2;41082:15;41075:38;40455:715;40725:45;;;40715:55;;;:6;:55;;;;40708:62;;;;;40419:806;41209:4;41202:11;;40247:985;;;;;;;:::o;46386:114::-;46446:13;46479;46472:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46386:114;:::o;18750:723::-;18806:13;19036:1;19027:5;:10;19023:53;;;19054:10;;;;;;;;;;;;;;;;;;;;;19023:53;19086:12;19101:5;19086:20;;19117:14;19142:78;19157:1;19149:4;:9;19142:78;;19175:8;;;;;:::i;:::-;;;;19206:2;19198:10;;;;;:::i;:::-;;;19142:78;;;19230:19;19262:6;19252:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19230:39;;19280:154;19296:1;19287:5;:10;19280:154;;19324:1;19314:11;;;;;:::i;:::-;;;19391:2;19383:5;:10;;;;:::i;:::-;19370:2;:24;;;;:::i;:::-;19357:39;;19340:6;19347;19340:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;19420:2;19411:11;;;;;:::i;:::-;;;19280:154;;;19458:6;19444:21;;;;;18750:723;;;;:::o;29274:266::-;29335:7;29394:1;29377:19;;:5;:19;;;;29355:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;29499:12;:19;29512:5;29499:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;29491:41;;29484:48;;29274:266;;;:::o;41720:159::-;;;;;:::o;42291:158::-;;;;;:::o;34891:1400::-;35014:20;35037:12;;35014:35;;35082:1;35068:16;;:2;:16;;;;35060:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;35267:21;35275:12;35267:7;:21::i;:::-;35266:22;35258:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;35353:12;35341:8;:24;;35333:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;35417:61;35447:1;35451:2;35455:12;35469:8;35417:21;:61::i;:::-;35491:30;35524:12;:16;35537:2;35524:16;;;;;;;;;;;;;;;35491:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35570:135;;;;;;;;35626:8;35596:11;:19;;;:39;;;;:::i;:::-;35570:135;;;;;;35685:8;35650:11;:24;;;:44;;;;:::i;:::-;35570:135;;;;;35551:12;:16;35564:2;35551:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35744:43;;;;;;;;35759:2;35744:43;;;;;;35770:15;35744:43;;;;;35716:11;:25;35728:12;35716:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35800:20;35823:12;35800:35;;35853:9;35848:325;35872:8;35868:1;:12;35848:325;;;35932:12;35928:2;35907:38;;35924:1;35907:38;;;;;;;;;;;;35986:59;36017:1;36021:2;36025:12;36039:5;35986:22;:59::i;:::-;35960:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;36147:14;;;;;:::i;:::-;;;;35882:3;;;;;:::i;:::-;;;;35848:325;;;;36200:12;36185;:27;;;;36223:60;36252:1;36256:2;36260:12;36274:8;36223:20;:60::i;:::-;35003:1288;;;34891:1400;;;:::o;11000:326::-;11060:4;11317:1;11295:7;:19;;;:23;11288:30;;11000:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:323::-;5471:6;5520:2;5508:9;5499:7;5495:23;5491:32;5488:119;;;5526:79;;:::i;:::-;5488:119;5646:1;5671:50;5713:7;5704:6;5693:9;5689:22;5671:50;:::i;:::-;5661:60;;5617:114;5415:323;;;;:::o;5744:327::-;5802:6;5851:2;5839:9;5830:7;5826:23;5822:32;5819:119;;;5857:79;;:::i;:::-;5819:119;5977:1;6002:52;6046:7;6037:6;6026:9;6022:22;6002:52;:::i;:::-;5992:62;;5948:116;5744:327;;;;:::o;6077:349::-;6146:6;6195:2;6183:9;6174:7;6170:23;6166:32;6163:119;;;6201:79;;:::i;:::-;6163:119;6321:1;6346:63;6401:7;6392:6;6381:9;6377:22;6346:63;:::i;:::-;6336:73;;6292:127;6077:349;;;;:::o;6432:529::-;6503:6;6511;6560:2;6548:9;6539:7;6535:23;6531:32;6528:119;;;6566:79;;:::i;:::-;6528:119;6714:1;6703:9;6699:17;6686:31;6744:18;6736:6;6733:30;6730:117;;;6766:79;;:::i;:::-;6730:117;6879:65;6936:7;6927:6;6916:9;6912:22;6879:65;:::i;:::-;6861:83;;;;6657:297;6432:529;;;;;:::o;6967:329::-;7026:6;7075:2;7063:9;7054:7;7050:23;7046:32;7043:119;;;7081:79;;:::i;:::-;7043:119;7201:1;7226:53;7271:7;7262:6;7251:9;7247:22;7226:53;:::i;:::-;7216:63;;7172:117;6967:329;;;;:::o;7302:108::-;7379:24;7397:5;7379:24;:::i;:::-;7374:3;7367:37;7302:108;;:::o;7416:118::-;7503:24;7521:5;7503:24;:::i;:::-;7498:3;7491:37;7416:118;;:::o;7540:109::-;7621:21;7636:5;7621:21;:::i;:::-;7616:3;7609:34;7540:109;;:::o;7655:360::-;7741:3;7769:38;7801:5;7769:38;:::i;:::-;7823:70;7886:6;7881:3;7823:70;:::i;:::-;7816:77;;7902:52;7947:6;7942:3;7935:4;7928:5;7924:16;7902:52;:::i;:::-;7979:29;8001:6;7979:29;:::i;:::-;7974:3;7970:39;7963:46;;7745:270;7655:360;;;;:::o;8021:364::-;8109:3;8137:39;8170:5;8137:39;:::i;:::-;8192:71;8256:6;8251:3;8192:71;:::i;:::-;8185:78;;8272:52;8317:6;8312:3;8305:4;8298:5;8294:16;8272:52;:::i;:::-;8349:29;8371:6;8349:29;:::i;:::-;8344:3;8340:39;8333:46;;8113:272;8021:364;;;;:::o;8391:377::-;8497:3;8525:39;8558:5;8525:39;:::i;:::-;8580:89;8662:6;8657:3;8580:89;:::i;:::-;8573:96;;8678:52;8723:6;8718:3;8711:4;8704:5;8700:16;8678:52;:::i;:::-;8755:6;8750:3;8746:16;8739:23;;8501:267;8391:377;;;;:::o;8774:366::-;8916:3;8937:67;9001:2;8996:3;8937:67;:::i;:::-;8930:74;;9013:93;9102:3;9013:93;:::i;:::-;9131:2;9126:3;9122:12;9115:19;;8774:366;;;:::o;9146:::-;9288:3;9309:67;9373:2;9368:3;9309:67;:::i;:::-;9302:74;;9385:93;9474:3;9385:93;:::i;:::-;9503:2;9498:3;9494:12;9487:19;;9146:366;;;:::o;9518:::-;9660:3;9681:67;9745:2;9740:3;9681:67;:::i;:::-;9674:74;;9757:93;9846:3;9757:93;:::i;:::-;9875:2;9870:3;9866:12;9859:19;;9518:366;;;:::o;9890:::-;10032:3;10053:67;10117:2;10112:3;10053:67;:::i;:::-;10046:74;;10129:93;10218:3;10129:93;:::i;:::-;10247:2;10242:3;10238:12;10231:19;;9890:366;;;:::o;10262:::-;10404:3;10425:67;10489:2;10484:3;10425:67;:::i;:::-;10418:74;;10501:93;10590:3;10501:93;:::i;:::-;10619:2;10614:3;10610:12;10603:19;;10262:366;;;:::o;10634:::-;10776:3;10797:67;10861:2;10856:3;10797:67;:::i;:::-;10790:74;;10873:93;10962:3;10873:93;:::i;:::-;10991:2;10986:3;10982:12;10975:19;;10634:366;;;:::o;11006:::-;11148:3;11169:67;11233:2;11228:3;11169:67;:::i;:::-;11162:74;;11245:93;11334:3;11245:93;:::i;:::-;11363:2;11358:3;11354:12;11347:19;;11006:366;;;:::o;11378:::-;11520:3;11541:67;11605:2;11600:3;11541:67;:::i;:::-;11534:74;;11617:93;11706:3;11617:93;:::i;:::-;11735:2;11730:3;11726:12;11719:19;;11378:366;;;:::o;11750:::-;11892:3;11913:67;11977:2;11972:3;11913:67;:::i;:::-;11906:74;;11989:93;12078:3;11989:93;:::i;:::-;12107:2;12102:3;12098:12;12091:19;;11750:366;;;:::o;12122:::-;12264:3;12285:67;12349:2;12344:3;12285:67;:::i;:::-;12278:74;;12361:93;12450:3;12361:93;:::i;:::-;12479:2;12474:3;12470:12;12463:19;;12122:366;;;:::o;12494:::-;12636:3;12657:67;12721:2;12716:3;12657:67;:::i;:::-;12650:74;;12733:93;12822:3;12733:93;:::i;:::-;12851:2;12846:3;12842:12;12835:19;;12494:366;;;:::o;12866:::-;13008:3;13029:67;13093:2;13088:3;13029:67;:::i;:::-;13022:74;;13105:93;13194:3;13105:93;:::i;:::-;13223:2;13218:3;13214:12;13207:19;;12866:366;;;:::o;13238:::-;13380:3;13401:67;13465:2;13460:3;13401:67;:::i;:::-;13394:74;;13477:93;13566:3;13477:93;:::i;:::-;13595:2;13590:3;13586:12;13579:19;;13238:366;;;:::o;13610:::-;13752:3;13773:67;13837:2;13832:3;13773:67;:::i;:::-;13766:74;;13849:93;13938:3;13849:93;:::i;:::-;13967:2;13962:3;13958:12;13951:19;;13610:366;;;:::o;13982:400::-;14142:3;14163:84;14245:1;14240:3;14163:84;:::i;:::-;14156:91;;14256:93;14345:3;14256:93;:::i;:::-;14374:1;14369:3;14365:11;14358:18;;13982:400;;;:::o;14388:366::-;14530:3;14551:67;14615:2;14610:3;14551:67;:::i;:::-;14544:74;;14627:93;14716:3;14627:93;:::i;:::-;14745:2;14740:3;14736:12;14729:19;;14388:366;;;:::o;14760:::-;14902:3;14923:67;14987:2;14982:3;14923:67;:::i;:::-;14916:74;;14999:93;15088:3;14999:93;:::i;:::-;15117:2;15112:3;15108:12;15101:19;;14760:366;;;:::o;15132:::-;15274:3;15295:67;15359:2;15354:3;15295:67;:::i;:::-;15288:74;;15371:93;15460:3;15371:93;:::i;:::-;15489:2;15484:3;15480:12;15473:19;;15132:366;;;:::o;15504:::-;15646:3;15667:67;15731:2;15726:3;15667:67;:::i;:::-;15660:74;;15743:93;15832:3;15743:93;:::i;:::-;15861:2;15856:3;15852:12;15845:19;;15504:366;;;:::o;15876:::-;16018:3;16039:67;16103:2;16098:3;16039:67;:::i;:::-;16032:74;;16115:93;16204:3;16115:93;:::i;:::-;16233:2;16228:3;16224:12;16217:19;;15876:366;;;:::o;16248:::-;16390:3;16411:67;16475:2;16470:3;16411:67;:::i;:::-;16404:74;;16487:93;16576:3;16487:93;:::i;:::-;16605:2;16600:3;16596:12;16589:19;;16248:366;;;:::o;16620:398::-;16779:3;16800:83;16881:1;16876:3;16800:83;:::i;:::-;16793:90;;16892:93;16981:3;16892:93;:::i;:::-;17010:1;17005:3;17001:11;16994:18;;16620:398;;;:::o;17024:366::-;17166:3;17187:67;17251:2;17246:3;17187:67;:::i;:::-;17180:74;;17263:93;17352:3;17263:93;:::i;:::-;17381:2;17376:3;17372:12;17365:19;;17024:366;;;:::o;17396:::-;17538:3;17559:67;17623:2;17618:3;17559:67;:::i;:::-;17552:74;;17635:93;17724:3;17635:93;:::i;:::-;17753:2;17748:3;17744:12;17737:19;;17396:366;;;:::o;17768:::-;17910:3;17931:67;17995:2;17990:3;17931:67;:::i;:::-;17924:74;;18007:93;18096:3;18007:93;:::i;:::-;18125:2;18120:3;18116:12;18109:19;;17768:366;;;:::o;18140:::-;18282:3;18303:67;18367:2;18362:3;18303:67;:::i;:::-;18296:74;;18379:93;18468:3;18379:93;:::i;:::-;18497:2;18492:3;18488:12;18481:19;;18140:366;;;:::o;18512:::-;18654:3;18675:67;18739:2;18734:3;18675:67;:::i;:::-;18668:74;;18751:93;18840:3;18751:93;:::i;:::-;18869:2;18864:3;18860:12;18853:19;;18512:366;;;:::o;18884:::-;19026:3;19047:67;19111:2;19106:3;19047:67;:::i;:::-;19040:74;;19123:93;19212:3;19123:93;:::i;:::-;19241:2;19236:3;19232:12;19225:19;;18884:366;;;:::o;19256:::-;19398:3;19419:67;19483:2;19478:3;19419:67;:::i;:::-;19412:74;;19495:93;19584:3;19495:93;:::i;:::-;19613:2;19608:3;19604:12;19597:19;;19256:366;;;:::o;19628:::-;19770:3;19791:67;19855:2;19850:3;19791:67;:::i;:::-;19784:74;;19867:93;19956:3;19867:93;:::i;:::-;19985:2;19980:3;19976:12;19969:19;;19628:366;;;:::o;20000:::-;20142:3;20163:67;20227:2;20222:3;20163:67;:::i;:::-;20156:74;;20239:93;20328:3;20239:93;:::i;:::-;20357:2;20352:3;20348:12;20341:19;;20000:366;;;:::o;20372:::-;20514:3;20535:67;20599:2;20594:3;20535:67;:::i;:::-;20528:74;;20611:93;20700:3;20611:93;:::i;:::-;20729:2;20724:3;20720:12;20713:19;;20372:366;;;:::o;20814:527::-;20973:4;20968:3;20964:14;21060:4;21053:5;21049:16;21043:23;21079:63;21136:4;21131:3;21127:14;21113:12;21079:63;:::i;:::-;20988:164;21244:4;21237:5;21233:16;21227:23;21263:61;21318:4;21313:3;21309:14;21295:12;21263:61;:::i;:::-;21162:172;20942:399;20814:527;;:::o;21347:118::-;21434:24;21452:5;21434:24;:::i;:::-;21429:3;21422:37;21347:118;;:::o;21471:105::-;21546:23;21563:5;21546:23;:::i;:::-;21541:3;21534:36;21471:105;;:::o;21582:701::-;21863:3;21885:95;21976:3;21967:6;21885:95;:::i;:::-;21878:102;;21997:95;22088:3;22079:6;21997:95;:::i;:::-;21990:102;;22109:148;22253:3;22109:148;:::i;:::-;22102:155;;22274:3;22267:10;;21582:701;;;;;:::o;22289:379::-;22473:3;22495:147;22638:3;22495:147;:::i;:::-;22488:154;;22659:3;22652:10;;22289:379;;;:::o;22674:222::-;22767:4;22805:2;22794:9;22790:18;22782:26;;22818:71;22886:1;22875:9;22871:17;22862:6;22818:71;:::i;:::-;22674:222;;;;:::o;22902:640::-;23097:4;23135:3;23124:9;23120:19;23112:27;;23149:71;23217:1;23206:9;23202:17;23193:6;23149:71;:::i;:::-;23230:72;23298:2;23287:9;23283:18;23274:6;23230:72;:::i;:::-;23312;23380:2;23369:9;23365:18;23356:6;23312:72;:::i;:::-;23431:9;23425:4;23421:20;23416:2;23405:9;23401:18;23394:48;23459:76;23530:4;23521:6;23459:76;:::i;:::-;23451:84;;22902:640;;;;;;;:::o;23548:210::-;23635:4;23673:2;23662:9;23658:18;23650:26;;23686:65;23748:1;23737:9;23733:17;23724:6;23686:65;:::i;:::-;23548:210;;;;:::o;23764:313::-;23877:4;23915:2;23904:9;23900:18;23892:26;;23964:9;23958:4;23954:20;23950:1;23939:9;23935:17;23928:47;23992:78;24065:4;24056:6;23992:78;:::i;:::-;23984:86;;23764:313;;;;:::o;24083:419::-;24249:4;24287:2;24276:9;24272:18;24264:26;;24336:9;24330:4;24326:20;24322:1;24311:9;24307:17;24300:47;24364:131;24490:4;24364:131;:::i;:::-;24356:139;;24083:419;;;:::o;24508:::-;24674:4;24712:2;24701:9;24697:18;24689:26;;24761:9;24755:4;24751:20;24747:1;24736:9;24732:17;24725:47;24789:131;24915:4;24789:131;:::i;:::-;24781:139;;24508:419;;;:::o;24933:::-;25099:4;25137:2;25126:9;25122:18;25114:26;;25186:9;25180:4;25176:20;25172:1;25161:9;25157:17;25150:47;25214:131;25340:4;25214:131;:::i;:::-;25206:139;;24933:419;;;:::o;25358:::-;25524:4;25562:2;25551:9;25547:18;25539:26;;25611:9;25605:4;25601:20;25597:1;25586:9;25582:17;25575:47;25639:131;25765:4;25639:131;:::i;:::-;25631:139;;25358:419;;;:::o;25783:::-;25949:4;25987:2;25976:9;25972:18;25964:26;;26036:9;26030:4;26026:20;26022:1;26011:9;26007:17;26000:47;26064:131;26190:4;26064:131;:::i;:::-;26056:139;;25783:419;;;:::o;26208:::-;26374:4;26412:2;26401:9;26397:18;26389:26;;26461:9;26455:4;26451:20;26447:1;26436:9;26432:17;26425:47;26489:131;26615:4;26489:131;:::i;:::-;26481:139;;26208:419;;;:::o;26633:::-;26799:4;26837:2;26826:9;26822:18;26814:26;;26886:9;26880:4;26876:20;26872:1;26861:9;26857:17;26850:47;26914:131;27040:4;26914:131;:::i;:::-;26906:139;;26633:419;;;:::o;27058:::-;27224:4;27262:2;27251:9;27247:18;27239:26;;27311:9;27305:4;27301:20;27297:1;27286:9;27282:17;27275:47;27339:131;27465:4;27339:131;:::i;:::-;27331:139;;27058:419;;;:::o;27483:::-;27649:4;27687:2;27676:9;27672:18;27664:26;;27736:9;27730:4;27726:20;27722:1;27711:9;27707:17;27700:47;27764:131;27890:4;27764:131;:::i;:::-;27756:139;;27483:419;;;:::o;27908:::-;28074:4;28112:2;28101:9;28097:18;28089:26;;28161:9;28155:4;28151:20;28147:1;28136:9;28132:17;28125:47;28189:131;28315:4;28189:131;:::i;:::-;28181:139;;27908:419;;;:::o;28333:::-;28499:4;28537:2;28526:9;28522:18;28514:26;;28586:9;28580:4;28576:20;28572:1;28561:9;28557:17;28550:47;28614:131;28740:4;28614:131;:::i;:::-;28606:139;;28333:419;;;:::o;28758:::-;28924:4;28962:2;28951:9;28947:18;28939:26;;29011:9;29005:4;29001:20;28997:1;28986:9;28982:17;28975:47;29039:131;29165:4;29039:131;:::i;:::-;29031:139;;28758:419;;;:::o;29183:::-;29349:4;29387:2;29376:9;29372:18;29364:26;;29436:9;29430:4;29426:20;29422:1;29411:9;29407:17;29400:47;29464:131;29590:4;29464:131;:::i;:::-;29456:139;;29183:419;;;:::o;29608:::-;29774:4;29812:2;29801:9;29797:18;29789:26;;29861:9;29855:4;29851:20;29847:1;29836:9;29832:17;29825:47;29889:131;30015:4;29889:131;:::i;:::-;29881:139;;29608:419;;;:::o;30033:::-;30199:4;30237:2;30226:9;30222:18;30214:26;;30286:9;30280:4;30276:20;30272:1;30261:9;30257:17;30250:47;30314:131;30440:4;30314:131;:::i;:::-;30306:139;;30033:419;;;:::o;30458:::-;30624:4;30662:2;30651:9;30647:18;30639:26;;30711:9;30705:4;30701:20;30697:1;30686:9;30682:17;30675:47;30739:131;30865:4;30739:131;:::i;:::-;30731:139;;30458:419;;;:::o;30883:::-;31049:4;31087:2;31076:9;31072:18;31064:26;;31136:9;31130:4;31126:20;31122:1;31111:9;31107:17;31100:47;31164:131;31290:4;31164:131;:::i;:::-;31156:139;;30883:419;;;:::o;31308:::-;31474:4;31512:2;31501:9;31497:18;31489:26;;31561:9;31555:4;31551:20;31547:1;31536:9;31532:17;31525:47;31589:131;31715:4;31589:131;:::i;:::-;31581:139;;31308:419;;;:::o;31733:::-;31899:4;31937:2;31926:9;31922:18;31914:26;;31986:9;31980:4;31976:20;31972:1;31961:9;31957:17;31950:47;32014:131;32140:4;32014:131;:::i;:::-;32006:139;;31733:419;;;:::o;32158:::-;32324:4;32362:2;32351:9;32347:18;32339:26;;32411:9;32405:4;32401:20;32397:1;32386:9;32382:17;32375:47;32439:131;32565:4;32439:131;:::i;:::-;32431:139;;32158:419;;;:::o;32583:::-;32749:4;32787:2;32776:9;32772:18;32764:26;;32836:9;32830:4;32826:20;32822:1;32811:9;32807:17;32800:47;32864:131;32990:4;32864:131;:::i;:::-;32856:139;;32583:419;;;:::o;33008:::-;33174:4;33212:2;33201:9;33197:18;33189:26;;33261:9;33255:4;33251:20;33247:1;33236:9;33232:17;33225:47;33289:131;33415:4;33289:131;:::i;:::-;33281:139;;33008:419;;;:::o;33433:::-;33599:4;33637:2;33626:9;33622:18;33614:26;;33686:9;33680:4;33676:20;33672:1;33661:9;33657:17;33650:47;33714:131;33840:4;33714:131;:::i;:::-;33706:139;;33433:419;;;:::o;33858:::-;34024:4;34062:2;34051:9;34047:18;34039:26;;34111:9;34105:4;34101:20;34097:1;34086:9;34082:17;34075:47;34139:131;34265:4;34139:131;:::i;:::-;34131:139;;33858:419;;;:::o;34283:::-;34449:4;34487:2;34476:9;34472:18;34464:26;;34536:9;34530:4;34526:20;34522:1;34511:9;34507:17;34500:47;34564:131;34690:4;34564:131;:::i;:::-;34556:139;;34283:419;;;:::o;34708:::-;34874:4;34912:2;34901:9;34897:18;34889:26;;34961:9;34955:4;34951:20;34947:1;34936:9;34932:17;34925:47;34989:131;35115:4;34989:131;:::i;:::-;34981:139;;34708:419;;;:::o;35133:::-;35299:4;35337:2;35326:9;35322:18;35314:26;;35386:9;35380:4;35376:20;35372:1;35361:9;35357:17;35350:47;35414:131;35540:4;35414:131;:::i;:::-;35406:139;;35133:419;;;:::o;35558:::-;35724:4;35762:2;35751:9;35747:18;35739:26;;35811:9;35805:4;35801:20;35797:1;35786:9;35782:17;35775:47;35839:131;35965:4;35839:131;:::i;:::-;35831:139;;35558:419;;;:::o;35983:::-;36149:4;36187:2;36176:9;36172:18;36164:26;;36236:9;36230:4;36226:20;36222:1;36211:9;36207:17;36200:47;36264:131;36390:4;36264:131;:::i;:::-;36256:139;;35983:419;;;:::o;36408:::-;36574:4;36612:2;36601:9;36597:18;36589:26;;36661:9;36655:4;36651:20;36647:1;36636:9;36632:17;36625:47;36689:131;36815:4;36689:131;:::i;:::-;36681:139;;36408:419;;;:::o;36833:346::-;36988:4;37026:2;37015:9;37011:18;37003:26;;37039:133;37169:1;37158:9;37154:17;37145:6;37039:133;:::i;:::-;36833:346;;;;:::o;37185:222::-;37278:4;37316:2;37305:9;37301:18;37293:26;;37329:71;37397:1;37386:9;37382:17;37373:6;37329:71;:::i;:::-;37185:222;;;;:::o;37413:129::-;37447:6;37474:20;;:::i;:::-;37464:30;;37503:33;37531:4;37523:6;37503:33;:::i;:::-;37413:129;;;:::o;37548:75::-;37581:6;37614:2;37608:9;37598:19;;37548:75;:::o;37629:307::-;37690:4;37780:18;37772:6;37769:30;37766:56;;;37802:18;;:::i;:::-;37766:56;37840:29;37862:6;37840:29;:::i;:::-;37832:37;;37924:4;37918;37914:15;37906:23;;37629:307;;;:::o;37942:98::-;37993:6;38027:5;38021:12;38011:22;;37942:98;;;:::o;38046:99::-;38098:6;38132:5;38126:12;38116:22;;38046:99;;;:::o;38151:168::-;38234:11;38268:6;38263:3;38256:19;38308:4;38303:3;38299:14;38284:29;;38151:168;;;;:::o;38325:147::-;38426:11;38463:3;38448:18;;38325:147;;;;:::o;38478:169::-;38562:11;38596:6;38591:3;38584:19;38636:4;38631:3;38627:14;38612:29;;38478:169;;;;:::o;38653:148::-;38755:11;38792:3;38777:18;;38653:148;;;;:::o;38807:273::-;38847:3;38866:20;38884:1;38866:20;:::i;:::-;38861:25;;38900:20;38918:1;38900:20;:::i;:::-;38895:25;;39022:1;38986:34;38982:42;38979:1;38976:49;38973:75;;;39028:18;;:::i;:::-;38973:75;39072:1;39069;39065:9;39058:16;;38807:273;;;;:::o;39086:305::-;39126:3;39145:20;39163:1;39145:20;:::i;:::-;39140:25;;39179:20;39197:1;39179:20;:::i;:::-;39174:25;;39333:1;39265:66;39261:74;39258:1;39255:81;39252:107;;;39339:18;;:::i;:::-;39252:107;39383:1;39380;39376:9;39369:16;;39086:305;;;;:::o;39397:185::-;39437:1;39454:20;39472:1;39454:20;:::i;:::-;39449:25;;39488:20;39506:1;39488:20;:::i;:::-;39483:25;;39527:1;39517:35;;39532:18;;:::i;:::-;39517:35;39574:1;39571;39567:9;39562:14;;39397:185;;;;:::o;39588:191::-;39628:4;39648:20;39666:1;39648:20;:::i;:::-;39643:25;;39682:20;39700:1;39682:20;:::i;:::-;39677:25;;39721:1;39718;39715:8;39712:34;;;39726:18;;:::i;:::-;39712:34;39771:1;39768;39764:9;39756:17;;39588:191;;;;:::o;39785:::-;39825:4;39845:20;39863:1;39845:20;:::i;:::-;39840:25;;39879:20;39897:1;39879:20;:::i;:::-;39874:25;;39918:1;39915;39912:8;39909:34;;;39923:18;;:::i;:::-;39909:34;39968:1;39965;39961:9;39953:17;;39785:191;;;;:::o;39982:96::-;40019:7;40048:24;40066:5;40048:24;:::i;:::-;40037:35;;39982:96;;;:::o;40084:90::-;40118:7;40161:5;40154:13;40147:21;40136:32;;40084:90;;;:::o;40180:149::-;40216:7;40256:66;40249:5;40245:78;40234:89;;40180:149;;;:::o;40335:118::-;40372:7;40412:34;40405:5;40401:46;40390:57;;40335:118;;;:::o;40459:126::-;40496:7;40536:42;40529:5;40525:54;40514:65;;40459:126;;;:::o;40591:77::-;40628:7;40657:5;40646:16;;40591:77;;;:::o;40674:101::-;40710:7;40750:18;40743:5;40739:30;40728:41;;40674:101;;;:::o;40781:154::-;40865:6;40860:3;40855;40842:30;40927:1;40918:6;40913:3;40909:16;40902:27;40781:154;;;:::o;40941:307::-;41009:1;41019:113;41033:6;41030:1;41027:13;41019:113;;;41118:1;41113:3;41109:11;41103:18;41099:1;41094:3;41090:11;41083:39;41055:2;41052:1;41048:10;41043:15;;41019:113;;;41150:6;41147:1;41144:13;41141:101;;;41230:1;41221:6;41216:3;41212:16;41205:27;41141:101;40990:258;40941:307;;;:::o;41254:171::-;41293:3;41316:24;41334:5;41316:24;:::i;:::-;41307:33;;41362:4;41355:5;41352:15;41349:41;;;41370:18;;:::i;:::-;41349:41;41417:1;41410:5;41406:13;41399:20;;41254:171;;;:::o;41431:320::-;41475:6;41512:1;41506:4;41502:12;41492:22;;41559:1;41553:4;41549:12;41580:18;41570:81;;41636:4;41628:6;41624:17;41614:27;;41570:81;41698:2;41690:6;41687:14;41667:18;41664:38;41661:84;;;41717:18;;:::i;:::-;41661:84;41482:269;41431:320;;;:::o;41757:281::-;41840:27;41862:4;41840:27;:::i;:::-;41832:6;41828:40;41970:6;41958:10;41955:22;41934:18;41922:10;41919:34;41916:62;41913:88;;;41981:18;;:::i;:::-;41913:88;42021:10;42017:2;42010:22;41800:238;41757:281;;:::o;42044:233::-;42083:3;42106:24;42124:5;42106:24;:::i;:::-;42097:33;;42152:66;42145:5;42142:77;42139:103;;;42222:18;;:::i;:::-;42139:103;42269:1;42262:5;42258:13;42251:20;;42044:233;;;:::o;42283:176::-;42315:1;42332:20;42350:1;42332:20;:::i;:::-;42327:25;;42366:20;42384:1;42366:20;:::i;:::-;42361:25;;42405:1;42395:35;;42410:18;;:::i;:::-;42395:35;42451:1;42448;42444:9;42439:14;;42283:176;;;;:::o;42465:180::-;42513:77;42510:1;42503:88;42610:4;42607:1;42600:15;42634:4;42631:1;42624:15;42651:180;42699:77;42696:1;42689:88;42796:4;42793:1;42786:15;42820:4;42817:1;42810:15;42837:180;42885:77;42882:1;42875:88;42982:4;42979:1;42972:15;43006:4;43003:1;42996:15;43023:180;43071:77;43068:1;43061:88;43168:4;43165:1;43158:15;43192:4;43189:1;43182:15;43209:180;43257:77;43254:1;43247:88;43354:4;43351:1;43344:15;43378:4;43375:1;43368:15;43395:117;43504:1;43501;43494:12;43518:117;43627:1;43624;43617:12;43641:117;43750:1;43747;43740:12;43764:117;43873:1;43870;43863:12;43887:117;43996:1;43993;43986:12;44010:117;44119:1;44116;44109:12;44133:102;44174:6;44225:2;44221:7;44216:2;44209:5;44205:14;44201:28;44191:38;;44133:102;;;:::o;44241:221::-;44381:34;44377:1;44369:6;44365:14;44358:58;44450:4;44445:2;44437:6;44433:15;44426:29;44241:221;:::o;44468:225::-;44608:34;44604:1;44596:6;44592:14;44585:58;44677:8;44672:2;44664:6;44660:15;44653:33;44468:225;:::o;44699:229::-;44839:34;44835:1;44827:6;44823:14;44816:58;44908:12;44903:2;44895:6;44891:15;44884:37;44699:229;:::o;44934:222::-;45074:34;45070:1;45062:6;45058:14;45051:58;45143:5;45138:2;45130:6;45126:15;45119:30;44934:222;:::o;45162:176::-;45302:28;45298:1;45290:6;45286:14;45279:52;45162:176;:::o;45344:224::-;45484:34;45480:1;45472:6;45468:14;45461:58;45553:7;45548:2;45540:6;45536:15;45529:32;45344:224;:::o;45574:236::-;45714:34;45710:1;45702:6;45698:14;45691:58;45783:19;45778:2;45770:6;45766:15;45759:44;45574:236;:::o;45816:174::-;45956:26;45952:1;45944:6;45940:14;45933:50;45816:174;:::o;45996:180::-;46136:32;46132:1;46124:6;46120:14;46113:56;45996:180;:::o;46182:234::-;46322:34;46318:1;46310:6;46306:14;46299:58;46391:17;46386:2;46378:6;46374:15;46367:42;46182:234;:::o;46422:244::-;46562:34;46558:1;46550:6;46546:14;46539:58;46631:27;46626:2;46618:6;46614:15;46607:52;46422:244;:::o;46672:174::-;46812:26;46808:1;46800:6;46796:14;46789:50;46672:174;:::o;46852:230::-;46992:34;46988:1;46980:6;46976:14;46969:58;47061:13;47056:2;47048:6;47044:15;47037:38;46852:230;:::o;47088:225::-;47228:34;47224:1;47216:6;47212:14;47205:58;47297:8;47292:2;47284:6;47280:15;47273:33;47088:225;:::o;47319:155::-;47459:7;47455:1;47447:6;47443:14;47436:31;47319:155;:::o;47480:182::-;47620:34;47616:1;47608:6;47604:14;47597:58;47480:182;:::o;47668:234::-;47808:34;47804:1;47796:6;47792:14;47785:58;47877:17;47872:2;47864:6;47860:15;47853:42;47668:234;:::o;47908:176::-;48048:28;48044:1;48036:6;48032:14;48025:52;47908:176;:::o;48090:237::-;48230:34;48226:1;48218:6;48214:14;48207:58;48299:20;48294:2;48286:6;48282:15;48275:45;48090:237;:::o;48333:179::-;48473:31;48469:1;48461:6;48457:14;48450:55;48333:179;:::o;48518:221::-;48658:34;48654:1;48646:6;48642:14;48635:58;48727:4;48722:2;48714:6;48710:15;48703:29;48518:221;:::o;48745:114::-;;:::o;48865:166::-;49005:18;49001:1;48993:6;48989:14;48982:42;48865:166;:::o;49037:238::-;49177:34;49173:1;49165:6;49161:14;49154:58;49246:21;49241:2;49233:6;49229:15;49222:46;49037:238;:::o;49281:179::-;49421:31;49417:1;49409:6;49405:14;49398:55;49281:179;:::o;49466:220::-;49606:34;49602:1;49594:6;49590:14;49583:58;49675:3;49670:2;49662:6;49658:15;49651:28;49466:220;:::o;49692:233::-;49832:34;49828:1;49820:6;49816:14;49809:58;49901:16;49896:2;49888:6;49884:15;49877:41;49692:233;:::o;49931:225::-;50071:34;50067:1;50059:6;50055:14;50048:58;50140:8;50135:2;50127:6;50123:15;50116:33;49931:225;:::o;50162:181::-;50302:33;50298:1;50290:6;50286:14;50279:57;50162:181;:::o;50349:234::-;50489:34;50485:1;50477:6;50473:14;50466:58;50558:17;50553:2;50545:6;50541:15;50534:42;50349:234;:::o;50589:232::-;50729:34;50725:1;50717:6;50713:14;50706:58;50798:15;50793:2;50785:6;50781:15;50774:40;50589:232;:::o;50827:221::-;50967:34;50963:1;50955:6;50951:14;50944:58;51036:4;51031:2;51023:6;51019:15;51012:29;50827:221;:::o;51054:122::-;51127:24;51145:5;51127:24;:::i;:::-;51120:5;51117:35;51107:63;;51166:1;51163;51156:12;51107:63;51054:122;:::o;51182:116::-;51252:21;51267:5;51252:21;:::i;:::-;51245:5;51242:32;51232:60;;51288:1;51285;51278:12;51232:60;51182:116;:::o;51304:120::-;51376:23;51393:5;51376:23;:::i;:::-;51369:5;51366:34;51356:62;;51414:1;51411;51404:12;51356:62;51304:120;:::o;51430:122::-;51503:24;51521:5;51503:24;:::i;:::-;51496:5;51493:35;51483:63;;51542:1;51539;51532:12;51483:63;51430:122;:::o

Swarm Source

ipfs://7f88d02fc5c7098b5a8aedb8e6855607038d54f565a9b04c10cb58401bb3047b
Loading...
Loading
Loading...
Loading
[ 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.