ETH Price: $3,447.24 (-0.23%)
Gas: 5 Gwei

Token

NyanFrndz (NFRNDZ)
 

Overview

Max Total Supply

3,333 NFRNDZ

Holders

380

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
9 NFRNDZ
0x68bf9c6fcf5de122e230139c4d1430a9a4d31b8b
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:
NyanFrndz

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-23
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.0;









/**
 * @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..).
 *
 * 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 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.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_
    ) {
        require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
    }

    /**
     * @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(totalSupply). 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())) : "";
    }

    /**
     * @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:
     *
     * - `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 > currentIndex - 1) {
            endIndex = currentIndex - 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/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: NyanFrndz.sol



pragma solidity >=0.7.0 <0.9.0;




contract NyanFrndz is ERC721A, Ownable {
  using Strings for uint256;

  string public baseURI = "https://fd89784e59c72499525556f80289b2c7.nyanfrndz.xyz/";
  string public baseExtension = ".json";

  uint256 public cost = .015 ether;
  uint256 public maxSupply = 3333;

  bool public preSales = true;

  uint256 public freeMintMaxSupply = 333;

  uint256 private maxMintAmount = 10;
  
  bool public paused = true;

  uint256 public nftPerAddressLimit = 3;
  mapping(address => uint256) public addressMintedBalance;

  address[] public whitelistedAddresses;
  bool public enableWhitelist = false;

  bool public reveal = false;

  constructor(
    string memory _name,
    string memory _symbol
  ) ERC721A(_name, _symbol, maxMintAmount) {
  }

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

  modifier isSafeMint(uint256 _mintAmount){
    require(_mintAmount > 0, "need to mint at least 1 NFT");
    require(_mintAmount <= maxMintAmount, "max mint amount per session exceeded");

    uint256 supply = totalSupply();

    if(owner() != msg.sender){
      require(!paused, "the contract is paused");
      if(preSales){
        if(enableWhitelist){
          require(isWhitelisted(msg.sender), "user is not whitelisted");
        }
        require(supply + _mintAmount <= freeMintMaxSupply, "max FREE NFT limit exceeded");

        uint256 ownerMintedCount = addressMintedBalance[msg.sender];
        require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded");
      }else{
        require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");
        require(msg.value >= cost * _mintAmount, "insufficient funds");
      }
    }else{
      require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");
    }
    
    _;
  }

  // public
  function mint(uint256 _mintAmount) public payable isSafeMint(_mintAmount) {
    addressMintedBalance[msg.sender]+=_mintAmount;
    _safeMint(msg.sender, _mintAmount);
  }

  function setPreSales(bool _preSales) public onlyOwner{
    preSales = _preSales;
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokenIds;
  }
  
  function setMaxSupply(uint256 _maxSupply) public onlyOwner {
    maxSupply = _maxSupply;
  }
    
  function setFreeMintMaxSupply(uint256 _freeMintMaxSupply) public onlyOwner {
    freeMintMaxSupply = _freeMintMaxSupply;
  }

  function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
    nftPerAddressLimit = _limit;
  }
  
  function setCost(uint256 _newCost) public onlyOwner {
    cost = _newCost;
  }

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

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }
  function pause(bool _state) public onlyOwner {
    paused = _state;
  }

  function setEnableWhitelist(bool _enableWhitelist) public onlyOwner{
    enableWhitelist = _enableWhitelist;
  }

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

  function whitelistUsers(address[] calldata _users) public onlyOwner {
    delete whitelistedAddresses;
    whitelistedAddresses = _users;
  }

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

  /**
   * @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 currentBaseURI = _baseURI();

    if(reveal==false){
      return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, "hidden", baseExtension))
        : "";
    }
    
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
        : "";
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"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":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":[],"name":"nftPerAddressLimit","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":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSales","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enableWhitelist","type":"bool"}],"name":"setEnableWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_freeMintMaxSupply","type":"uint256"}],"name":"setFreeMintMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_preSales","type":"bool"}],"name":"setPreSales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_reveal","type":"bool"}],"name":"setReveal","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60a060405260008055600060075560405180606001604052806037815260200162005dd260379139600990805190602001906200003e929190620002cb565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90805190602001906200008c929190620002cb565b5066354a6ba7a18000600b55610d05600c556001600d60006101000a81548160ff02191690831515021790555061014d600e55600a600f556001601060006101000a81548160ff02191690831515021790555060036011556000601460006101000a81548160ff0219169083151502179055506000601460016101000a81548160ff0219169083151502179055503480156200012757600080fd5b5060405162005e0938038062005e0983398181016040528101906200014d9190620003f9565b8181600f546000811162000198576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018f90620004a5565b60405180910390fd5b8260019080519060200190620001b0929190620002cb565b508160029080519060200190620001c9929190620002cb565b508060808181525050505050620001f5620001e9620001fd60201b60201c565b6200020560201b60201c565b5050620006ab565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002d9906200056d565b90600052602060002090601f016020900481019282620002fd576000855562000349565b82601f106200031857805160ff191683800117855562000349565b8280016001018555821562000349579182015b82811115620003485782518255916020019190600101906200032b565b5b5090506200035891906200035c565b5090565b5b80821115620003775760008160009055506001016200035d565b5090565b6000620003926200038c84620004f0565b620004c7565b905082815260208101848484011115620003b157620003b06200063c565b5b620003be84828562000537565b509392505050565b600082601f830112620003de57620003dd62000637565b5b8151620003f08482602086016200037b565b91505092915050565b6000806040838503121562000413576200041262000646565b5b600083015167ffffffffffffffff81111562000434576200043362000641565b5b6200044285828601620003c6565b925050602083015167ffffffffffffffff81111562000466576200046562000641565b5b6200047485828601620003c6565b9150509250929050565b60006200048d60278362000526565b91506200049a826200065c565b604082019050919050565b60006020820190508181036000830152620004c0816200047e565b9050919050565b6000620004d3620004e6565b9050620004e18282620005a3565b919050565b6000604051905090565b600067ffffffffffffffff8211156200050e576200050d62000608565b5b62000519826200064b565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620005575780820151818401526020810190506200053a565b8381111562000567576000848401525b50505050565b600060028204905060018216806200058657607f821691505b602082108114156200059d576200059c620005d9565b5b50919050565b620005ae826200064b565b810181811067ffffffffffffffff82111715620005d057620005cf62000608565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b6080516156fd620006d560003960008181612d3901528181612d62015261342301526156fd6000f3fe6080604052600436106102885760003560e01c8063715018a61161015a578063ba4e5c49116100c1578063d5abeb011161007a578063d5abeb01146109d6578063d7224ba014610a01578063da3ef23f14610a2c578063e985e9c514610a55578063edec5f2714610a92578063f2fde38b14610abb57610288565b8063ba4e5c49146108b2578063ba7d2c76146108ef578063c66828621461091a578063c87b56dd14610945578063cdfb2b4e14610982578063d0eb26b0146109ad57610288565b8063958058591161011357806395805859146107c357806395d89b41146107ee578063a0712d6814610819578063a22cb46514610835578063a475b5dd1461085e578063b88d4fde1461088957610288565b8063715018a6146106db57806376896d8c146106f257806378f9ccf21461071b5780637ac3ad7d146107445780638da5cb5b1461076f57806391e58c781461079a57610288565b80633af32abf116101fe57806355f804b3116101b757806355f804b3146105b95780635c975abb146105e25780636352211e1461060d5780636c0360eb1461064a5780636f8b44b01461067557806370a082311461069e57610288565b80633af32abf146104a65780633ccfd60b146104e357806342842e0e146104ed578063438b63001461051657806344a0d68a146105535780634f6ccce71461057c57610288565b806313faede61161025057806313faede61461038457806318160ddd146103af57806318cae269146103da57806323b872dd146104175780632a3f300c146104405780632f745c591461046957610288565b806301ffc9a71461028d57806302329a29146102ca57806306fdde03146102f3578063081812fc1461031e578063095ea7b31461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613dde565b610ae4565b6040516102c1919061459a565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190613db1565b610c2e565b005b3480156102ff57600080fd5b50610308610cc7565b60405161031591906145b5565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190613e81565b610d59565b6040516103529190614511565b60405180910390f35b34801561036757600080fd5b50610382600480360381019061037d9190613d24565b610dde565b005b34801561039057600080fd5b50610399610ef7565b6040516103a69190614957565b60405180910390f35b3480156103bb57600080fd5b506103c4610efd565b6040516103d19190614957565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc9190613ba1565b610f06565b60405161040e9190614957565b60405180910390f35b34801561042357600080fd5b5061043e60048036038101906104399190613c0e565b610f1e565b005b34801561044c57600080fd5b5061046760048036038101906104629190613db1565b610f2e565b005b34801561047557600080fd5b50610490600480360381019061048b9190613d24565b610fc7565b60405161049d9190614957565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c89190613ba1565b6111c5565b6040516104da919061459a565b60405180910390f35b6104eb611274565b005b3480156104f957600080fd5b50610514600480360381019061050f9190613c0e565b611370565b005b34801561052257600080fd5b5061053d60048036038101906105389190613ba1565b611390565b60405161054a9190614578565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190613e81565b61143e565b005b34801561058857600080fd5b506105a3600480360381019061059e9190613e81565b6114c4565b6040516105b09190614957565b60405180910390f35b3480156105c557600080fd5b506105e060048036038101906105db9190613e38565b611517565b005b3480156105ee57600080fd5b506105f76115ad565b604051610604919061459a565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190613e81565b6115c0565b6040516106419190614511565b60405180910390f35b34801561065657600080fd5b5061065f6115d6565b60405161066c91906145b5565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190613e81565b611664565b005b3480156106aa57600080fd5b506106c560048036038101906106c09190613ba1565b6116ea565b6040516106d29190614957565b60405180910390f35b3480156106e757600080fd5b506106f06117d3565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613e81565b61185b565b005b34801561072757600080fd5b50610742600480360381019061073d9190613db1565b6118e1565b005b34801561075057600080fd5b5061075961197a565b6040516107669190614957565b60405180910390f35b34801561077b57600080fd5b50610784611980565b6040516107919190614511565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc9190613db1565b6119aa565b005b3480156107cf57600080fd5b506107d8611a43565b6040516107e5919061459a565b60405180910390f35b3480156107fa57600080fd5b50610803611a56565b60405161081091906145b5565b60405180910390f35b610833600480360381019061082e9190613e81565b611ae8565b005b34801561084157600080fd5b5061085c60048036038101906108579190613ce4565b611ec0565b005b34801561086a57600080fd5b50610873612041565b604051610880919061459a565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab9190613c61565b612054565b005b3480156108be57600080fd5b506108d960048036038101906108d49190613e81565b6120b0565b6040516108e69190614511565b60405180910390f35b3480156108fb57600080fd5b506109046120ef565b6040516109119190614957565b60405180910390f35b34801561092657600080fd5b5061092f6120f5565b60405161093c91906145b5565b60405180910390f35b34801561095157600080fd5b5061096c60048036038101906109679190613e81565b612183565b60405161097991906145b5565b60405180910390f35b34801561098e57600080fd5b50610997612294565b6040516109a4919061459a565b60405180910390f35b3480156109b957600080fd5b506109d460048036038101906109cf9190613e81565b6122a7565b005b3480156109e257600080fd5b506109eb61232d565b6040516109f89190614957565b60405180910390f35b348015610a0d57600080fd5b50610a16612333565b604051610a239190614957565b60405180910390f35b348015610a3857600080fd5b50610a536004803603810190610a4e9190613e38565b612339565b005b348015610a6157600080fd5b50610a7c6004803603810190610a779190613bce565b6123cf565b604051610a89919061459a565b60405180910390f35b348015610a9e57600080fd5b50610ab96004803603810190610ab49190613d64565b612463565b005b348015610ac757600080fd5b50610ae26004803603810190610add9190613ba1565b612503565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610baf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c1757507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c275750610c26826125fb565b5b9050919050565b610c36612665565b73ffffffffffffffffffffffffffffffffffffffff16610c54611980565b73ffffffffffffffffffffffffffffffffffffffff1614610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190614757565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b606060018054610cd690614d20565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0290614d20565b8015610d4f5780601f10610d2457610100808354040283529160200191610d4f565b820191906000526020600020905b815481529060010190602001808311610d3257829003601f168201915b5050505050905090565b6000610d648261266d565b610da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9a906148f7565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610de9826115c0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e51906147f7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e79612665565b73ffffffffffffffffffffffffffffffffffffffff161480610ea85750610ea781610ea2612665565b6123cf565b5b610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede906146b7565b60405180910390fd5b610ef283838361267a565b505050565b600b5481565b60008054905090565b60126020528060005260406000206000915090505481565b610f2983838361272c565b505050565b610f36612665565b73ffffffffffffffffffffffffffffffffffffffff16610f54611980565b73ffffffffffffffffffffffffffffffffffffffff1614610faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa190614757565b60405180910390fd5b80601460016101000a81548160ff02191690831515021790555050565b6000610fd2836116ea565b8210611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a906145d7565b60405180910390fd5b600061101d610efd565b905060008060005b83811015611183576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461111757806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561116f57868414156111605781955050505050506111bf565b838061116b90614d83565b9450505b50808061117b90614d83565b915050611025565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b690614897565b60405180910390fd5b92915050565b600080600090505b601380549050811015611269578273ffffffffffffffffffffffffffffffffffffffff166013828154811061120557611204614e8a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561125657600191505061126f565b808061126190614d83565b9150506111cd565b50600090505b919050565b61127c612665565b73ffffffffffffffffffffffffffffffffffffffff1661129a611980565b73ffffffffffffffffffffffffffffffffffffffff16146112f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e790614757565b60405180910390fd5b60006112fa611980565b73ffffffffffffffffffffffffffffffffffffffff164760405161131d906144fc565b60006040518083038185875af1925050503d806000811461135a576040519150601f19603f3d011682016040523d82523d6000602084013e61135f565b606091505b505090508061136d57600080fd5b50565b61138b83838360405180602001604052806000815250612054565b505050565b6060600061139d836116ea565b905060008167ffffffffffffffff8111156113bb576113ba614eb9565b5b6040519080825280602002602001820160405280156113e95781602001602082028036833780820191505090505b50905060005b82811015611433576114018582610fc7565b82828151811061141457611413614e8a565b5b602002602001018181525050808061142b90614d83565b9150506113ef565b508092505050919050565b611446612665565b73ffffffffffffffffffffffffffffffffffffffff16611464611980565b73ffffffffffffffffffffffffffffffffffffffff16146114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b190614757565b60405180910390fd5b80600b8190555050565b60006114ce610efd565b821061150f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150690614677565b60405180910390fd5b819050919050565b61151f612665565b73ffffffffffffffffffffffffffffffffffffffff1661153d611980565b73ffffffffffffffffffffffffffffffffffffffff1614611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a90614757565b60405180910390fd5b80600990805190602001906115a9929190613864565b5050565b601060009054906101000a900460ff1681565b60006115cb82612ce5565b600001519050919050565b600980546115e390614d20565b80601f016020809104026020016040519081016040528092919081815260200182805461160f90614d20565b801561165c5780601f106116315761010080835404028352916020019161165c565b820191906000526020600020905b81548152906001019060200180831161163f57829003601f168201915b505050505081565b61166c612665565b73ffffffffffffffffffffffffffffffffffffffff1661168a611980565b73ffffffffffffffffffffffffffffffffffffffff16146116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d790614757565b60405180910390fd5b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561175b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175290614717565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6117db612665565b73ffffffffffffffffffffffffffffffffffffffff166117f9611980565b73ffffffffffffffffffffffffffffffffffffffff161461184f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184690614757565b60405180910390fd5b6118596000612ee8565b565b611863612665565b73ffffffffffffffffffffffffffffffffffffffff16611881611980565b73ffffffffffffffffffffffffffffffffffffffff16146118d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ce90614757565b60405180910390fd5b80600e8190555050565b6118e9612665565b73ffffffffffffffffffffffffffffffffffffffff16611907611980565b73ffffffffffffffffffffffffffffffffffffffff161461195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195490614757565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b600e5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119b2612665565b73ffffffffffffffffffffffffffffffffffffffff166119d0611980565b73ffffffffffffffffffffffffffffffffffffffff1614611a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1d90614757565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b600d60009054906101000a900460ff1681565b606060028054611a6590614d20565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9190614d20565b8015611ade5780601f10611ab357610100808354040283529160200191611ade565b820191906000526020600020905b815481529060010190602001808311611ac157829003601f168201915b5050505050905090565b8060008111611b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2390614917565b60405180910390fd5b600f54811115611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b68906146f7565b60405180910390fd5b6000611b7b610efd565b90503373ffffffffffffffffffffffffffffffffffffffff16611b9c611980565b73ffffffffffffffffffffffffffffffffffffffff1614611e0a57601060009054906101000a900460ff1615611c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfe90614777565b60405180910390fd5b600d60009054906101000a900460ff1615611d6457601460009054906101000a900460ff1615611c7a57611c3a336111c5565b611c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c70906148b7565b60405180910390fd5b5b600e548282611c899190614adb565b1115611cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc190614637565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506011548382611d1d9190614adb565b1115611d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5590614657565b60405180910390fd5b50611e05565b600c548282611d739190614adb565b1115611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab906146d7565b60405180910390fd5b81600b54611dc29190614b62565b341015611e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfb90614817565b60405180910390fd5b5b611e5b565b600c548282611e199190614adb565b1115611e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e51906146d7565b60405180910390fd5b5b82601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eaa9190614adb565b92505081905550611ebb3384612fae565b505050565b611ec8612665565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d906147b7565b60405180910390fd5b8060066000611f43612665565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ff0612665565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612035919061459a565b60405180910390a35050565b601460019054906101000a900460ff1681565b61205f84848461272c565b61206b84848484612fcc565b6120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190614837565b60405180910390fd5b50505050565b601381815481106120c057600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b600a805461210290614d20565b80601f016020809104026020016040519081016040528092919081815260200182805461212e90614d20565b801561217b5780601f106121505761010080835404028352916020019161217b565b820191906000526020600020905b81548152906001019060200180831161215e57829003601f168201915b505050505081565b606061218e8261266d565b6121cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c490614797565b60405180910390fd5b60006121d7613163565b905060001515601460019054906101000a900460ff161515141561223f5760008151116122135760405180602001604052806000815250612237565b80600a6040516020016122279291906144cd565b6040516020818303038152906040525b91505061228f565b600081511161225d576040518060200160405280600081525061228b565b80612267846131f5565b600a60405160200161227b9392919061449c565b6040516020818303038152906040525b9150505b919050565b601460009054906101000a900460ff1681565b6122af612665565b73ffffffffffffffffffffffffffffffffffffffff166122cd611980565b73ffffffffffffffffffffffffffffffffffffffff1614612323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231a90614757565b60405180910390fd5b8060118190555050565b600c5481565b60075481565b612341612665565b73ffffffffffffffffffffffffffffffffffffffff1661235f611980565b73ffffffffffffffffffffffffffffffffffffffff16146123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac90614757565b60405180910390fd5b80600a90805190602001906123cb929190613864565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61246b612665565b73ffffffffffffffffffffffffffffffffffffffff16612489611980565b73ffffffffffffffffffffffffffffffffffffffff16146124df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d690614757565b60405180910390fd5b601360006124ed91906138ea565b8181601391906124fe92919061390b565b505050565b61250b612665565b73ffffffffffffffffffffffffffffffffffffffff16612529611980565b73ffffffffffffffffffffffffffffffffffffffff161461257f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257690614757565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e6906145f7565b60405180910390fd5b6125f881612ee8565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061273782612ce5565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661275e612665565b73ffffffffffffffffffffffffffffffffffffffff1614806127ba5750612783612665565b73ffffffffffffffffffffffffffffffffffffffff166127a284610d59565b73ffffffffffffffffffffffffffffffffffffffff16145b806127d657506127d582600001516127d0612665565b6123cf565b5b905080612818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280f906147d7565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461288a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288190614737565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156128fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f190614697565b60405180910390fd5b6129078585856001613356565b612917600084846000015161267a565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166129859190614bbc565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a299190614a95565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612b2f9190614adb565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c7557612ba58161266d565b15612c74576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cdd868686600161335c565b505050505050565b612ced6139ab565b612cf68261266d565b612d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2c90614617565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612d995760017f000000000000000000000000000000000000000000000000000000000000000084612d8c9190614bf0565b612d969190614adb565b90505b60008390505b818110612ea7576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e9357809350505050612ee3565b508080612e9f90614cf6565b915050612d9f565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eda906148d7565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fc8828260405180602001604052806000815250613362565b5050565b6000612fed8473ffffffffffffffffffffffffffffffffffffffff16613841565b15613156578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613016612665565b8786866040518563ffffffff1660e01b8152600401613038949392919061452c565b602060405180830381600087803b15801561305257600080fd5b505af192505050801561308357506040513d601f19601f820116820180604052508101906130809190613e0b565b60015b613106573d80600081146130b3576040519150601f19603f3d011682016040523d82523d6000602084013e6130b8565b606091505b506000815114156130fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f590614837565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061315b565b600190505b949350505050565b60606009805461317290614d20565b80601f016020809104026020016040519081016040528092919081815260200182805461319e90614d20565b80156131eb5780601f106131c0576101008083540402835291602001916131eb565b820191906000526020600020905b8154815290600101906020018083116131ce57829003601f168201915b5050505050905090565b6060600082141561323d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613351565b600082905060005b6000821461326f57808061325890614d83565b915050600a826132689190614b31565b9150613245565b60008167ffffffffffffffff81111561328b5761328a614eb9565b5b6040519080825280601f01601f1916602001820160405280156132bd5781602001600182028036833780820191505090505b5090505b6000851461334a576001826132d69190614bf0565b9150600a856132e59190614dcc565b60306132f19190614adb565b60f81b81838151811061330757613306614e8a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133439190614b31565b94506132c1565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cf90614877565b60405180910390fd5b6133e18161266d565b15613421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341890614857565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115613484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347b90614937565b60405180910390fd5b6134916000858386613356565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161358e9190614a95565b6fffffffffffffffffffffffffffffffff1681526020018583602001516135b59190614a95565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561382457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137c46000888488612fcc565b613803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137fa90614837565b60405180910390fd5b818061380e90614d83565b925050808061381c90614d83565b915050613753565b5080600081905550613839600087858861335c565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461387090614d20565b90600052602060002090601f01602090048101928261389257600085556138d9565b82601f106138ab57805160ff19168380011785556138d9565b828001600101855582156138d9579182015b828111156138d85782518255916020019190600101906138bd565b5b5090506138e691906139e5565b5090565b508054600082559060005260206000209081019061390891906139e5565b50565b82805482825590600052602060002090810192821561399a579160200282015b8281111561399957823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019061392b565b5b5090506139a791906139e5565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156139fe5760008160009055506001016139e6565b5090565b6000613a15613a1084614997565b614972565b905082815260208101848484011115613a3157613a30614ef7565b5b613a3c848285614cb4565b509392505050565b6000613a57613a52846149c8565b614972565b905082815260208101848484011115613a7357613a72614ef7565b5b613a7e848285614cb4565b509392505050565b600081359050613a958161566b565b92915050565b60008083601f840112613ab157613ab0614eed565b5b8235905067ffffffffffffffff811115613ace57613acd614ee8565b5b602083019150836020820283011115613aea57613ae9614ef2565b5b9250929050565b600081359050613b0081615682565b92915050565b600081359050613b1581615699565b92915050565b600081519050613b2a81615699565b92915050565b600082601f830112613b4557613b44614eed565b5b8135613b55848260208601613a02565b91505092915050565b600082601f830112613b7357613b72614eed565b5b8135613b83848260208601613a44565b91505092915050565b600081359050613b9b816156b0565b92915050565b600060208284031215613bb757613bb6614f01565b5b6000613bc584828501613a86565b91505092915050565b60008060408385031215613be557613be4614f01565b5b6000613bf385828601613a86565b9250506020613c0485828601613a86565b9150509250929050565b600080600060608486031215613c2757613c26614f01565b5b6000613c3586828701613a86565b9350506020613c4686828701613a86565b9250506040613c5786828701613b8c565b9150509250925092565b60008060008060808587031215613c7b57613c7a614f01565b5b6000613c8987828801613a86565b9450506020613c9a87828801613a86565b9350506040613cab87828801613b8c565b925050606085013567ffffffffffffffff811115613ccc57613ccb614efc565b5b613cd887828801613b30565b91505092959194509250565b60008060408385031215613cfb57613cfa614f01565b5b6000613d0985828601613a86565b9250506020613d1a85828601613af1565b9150509250929050565b60008060408385031215613d3b57613d3a614f01565b5b6000613d4985828601613a86565b9250506020613d5a85828601613b8c565b9150509250929050565b60008060208385031215613d7b57613d7a614f01565b5b600083013567ffffffffffffffff811115613d9957613d98614efc565b5b613da585828601613a9b565b92509250509250929050565b600060208284031215613dc757613dc6614f01565b5b6000613dd584828501613af1565b91505092915050565b600060208284031215613df457613df3614f01565b5b6000613e0284828501613b06565b91505092915050565b600060208284031215613e2157613e20614f01565b5b6000613e2f84828501613b1b565b91505092915050565b600060208284031215613e4e57613e4d614f01565b5b600082013567ffffffffffffffff811115613e6c57613e6b614efc565b5b613e7884828501613b5e565b91505092915050565b600060208284031215613e9757613e96614f01565b5b6000613ea584828501613b8c565b91505092915050565b6000613eba838361447e565b60208301905092915050565b613ecf81614c24565b82525050565b6000613ee082614a1e565b613eea8185614a4c565b9350613ef5836149f9565b8060005b83811015613f26578151613f0d8882613eae565b9750613f1883614a3f565b925050600181019050613ef9565b5085935050505092915050565b613f3c81614c36565b82525050565b6000613f4d82614a29565b613f578185614a5d565b9350613f67818560208601614cc3565b613f7081614f06565b840191505092915050565b6000613f8682614a34565b613f908185614a79565b9350613fa0818560208601614cc3565b613fa981614f06565b840191505092915050565b6000613fbf82614a34565b613fc98185614a8a565b9350613fd9818560208601614cc3565b80840191505092915050565b60008154613ff281614d20565b613ffc8186614a8a565b9450600182166000811461401757600181146140285761405b565b60ff1983168652818601935061405b565b61403185614a09565b60005b8381101561405357815481890152600182019150602081019050614034565b838801955050505b50505092915050565b6000614071602283614a79565b915061407c82614f17565b604082019050919050565b6000614094602683614a79565b915061409f82614f66565b604082019050919050565b60006140b7602a83614a79565b91506140c282614fb5565b604082019050919050565b60006140da601b83614a79565b91506140e582615004565b602082019050919050565b60006140fd601c83614a79565b91506141088261502d565b602082019050919050565b6000614120602383614a79565b915061412b82615056565b604082019050919050565b6000614143602583614a79565b915061414e826150a5565b604082019050919050565b6000614166603983614a79565b9150614171826150f4565b604082019050919050565b6000614189601683614a79565b915061419482615143565b602082019050919050565b60006141ac602483614a79565b91506141b78261516c565b604082019050919050565b60006141cf602b83614a79565b91506141da826151bb565b604082019050919050565b60006141f2602683614a79565b91506141fd8261520a565b604082019050919050565b6000614215602083614a79565b915061422082615259565b602082019050919050565b6000614238600683614a8a565b915061424382615282565b600682019050919050565b600061425b601683614a79565b9150614266826152ab565b602082019050919050565b600061427e602f83614a79565b9150614289826152d4565b604082019050919050565b60006142a1601a83614a79565b91506142ac82615323565b602082019050919050565b60006142c4603283614a79565b91506142cf8261534c565b604082019050919050565b60006142e7602283614a79565b91506142f28261539b565b604082019050919050565b600061430a600083614a6e565b9150614315826153ea565b600082019050919050565b600061432d601283614a79565b9150614338826153ed565b602082019050919050565b6000614350603383614a79565b915061435b82615416565b604082019050919050565b6000614373601d83614a79565b915061437e82615465565b602082019050919050565b6000614396602183614a79565b91506143a18261548e565b604082019050919050565b60006143b9602e83614a79565b91506143c4826154dd565b604082019050919050565b60006143dc601783614a79565b91506143e78261552c565b602082019050919050565b60006143ff602f83614a79565b915061440a82615555565b604082019050919050565b6000614422602d83614a79565b915061442d826155a4565b604082019050919050565b6000614445601b83614a79565b9150614450826155f3565b602082019050919050565b6000614468602283614a79565b91506144738261561c565b604082019050919050565b61448781614caa565b82525050565b61449681614caa565b82525050565b60006144a88286613fb4565b91506144b48285613fb4565b91506144c08284613fe5565b9150819050949350505050565b60006144d98285613fb4565b91506144e48261422b565b91506144f08284613fe5565b91508190509392505050565b6000614507826142fd565b9150819050919050565b60006020820190506145266000830184613ec6565b92915050565b60006080820190506145416000830187613ec6565b61454e6020830186613ec6565b61455b604083018561448d565b818103606083015261456d8184613f42565b905095945050505050565b600060208201905081810360008301526145928184613ed5565b905092915050565b60006020820190506145af6000830184613f33565b92915050565b600060208201905081810360008301526145cf8184613f7b565b905092915050565b600060208201905081810360008301526145f081614064565b9050919050565b6000602082019050818103600083015261461081614087565b9050919050565b60006020820190508181036000830152614630816140aa565b9050919050565b60006020820190508181036000830152614650816140cd565b9050919050565b60006020820190508181036000830152614670816140f0565b9050919050565b6000602082019050818103600083015261469081614113565b9050919050565b600060208201905081810360008301526146b081614136565b9050919050565b600060208201905081810360008301526146d081614159565b9050919050565b600060208201905081810360008301526146f08161417c565b9050919050565b600060208201905081810360008301526147108161419f565b9050919050565b60006020820190508181036000830152614730816141c2565b9050919050565b60006020820190508181036000830152614750816141e5565b9050919050565b6000602082019050818103600083015261477081614208565b9050919050565b600060208201905081810360008301526147908161424e565b9050919050565b600060208201905081810360008301526147b081614271565b9050919050565b600060208201905081810360008301526147d081614294565b9050919050565b600060208201905081810360008301526147f0816142b7565b9050919050565b60006020820190508181036000830152614810816142da565b9050919050565b6000602082019050818103600083015261483081614320565b9050919050565b6000602082019050818103600083015261485081614343565b9050919050565b6000602082019050818103600083015261487081614366565b9050919050565b6000602082019050818103600083015261489081614389565b9050919050565b600060208201905081810360008301526148b0816143ac565b9050919050565b600060208201905081810360008301526148d0816143cf565b9050919050565b600060208201905081810360008301526148f0816143f2565b9050919050565b6000602082019050818103600083015261491081614415565b9050919050565b6000602082019050818103600083015261493081614438565b9050919050565b600060208201905081810360008301526149508161445b565b9050919050565b600060208201905061496c600083018461448d565b92915050565b600061497c61498d565b90506149888282614d52565b919050565b6000604051905090565b600067ffffffffffffffff8211156149b2576149b1614eb9565b5b6149bb82614f06565b9050602081019050919050565b600067ffffffffffffffff8211156149e3576149e2614eb9565b5b6149ec82614f06565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614aa082614c6e565b9150614aab83614c6e565b9250826fffffffffffffffffffffffffffffffff03821115614ad057614acf614dfd565b5b828201905092915050565b6000614ae682614caa565b9150614af183614caa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b2657614b25614dfd565b5b828201905092915050565b6000614b3c82614caa565b9150614b4783614caa565b925082614b5757614b56614e2c565b5b828204905092915050565b6000614b6d82614caa565b9150614b7883614caa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bb157614bb0614dfd565b5b828202905092915050565b6000614bc782614c6e565b9150614bd283614c6e565b925082821015614be557614be4614dfd565b5b828203905092915050565b6000614bfb82614caa565b9150614c0683614caa565b925082821015614c1957614c18614dfd565b5b828203905092915050565b6000614c2f82614c8a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614ce1578082015181840152602081019050614cc6565b83811115614cf0576000848401525b50505050565b6000614d0182614caa565b91506000821415614d1557614d14614dfd565b5b600182039050919050565b60006002820490506001821680614d3857607f821691505b60208210811415614d4c57614d4b614e5b565b5b50919050565b614d5b82614f06565b810181811067ffffffffffffffff82111715614d7a57614d79614eb9565b5b80604052505050565b6000614d8e82614caa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614dc157614dc0614dfd565b5b600182019050919050565b6000614dd782614caa565b9150614de283614caa565b925082614df257614df1614e2c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f6d61782046524545204e4654206c696d69742065786365656465640000000000600082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f68696464656e0000000000000000000000000000000000000000000000000000600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b61567481614c24565b811461567f57600080fd5b50565b61568b81614c36565b811461569657600080fd5b50565b6156a281614c42565b81146156ad57600080fd5b50565b6156b981614caa565b81146156c457600080fd5b5056fea26469706673582212204a28f57ceb63febcad1edd61ebe2ebdd14f790ac7833633091610ed4d85308ff64736f6c6343000807003368747470733a2f2f66643839373834653539633732343939353235353536663830323839623263372e6e79616e66726e647a2e78797a2f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000094e79616e46726e647a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064e46524e445a0000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102885760003560e01c8063715018a61161015a578063ba4e5c49116100c1578063d5abeb011161007a578063d5abeb01146109d6578063d7224ba014610a01578063da3ef23f14610a2c578063e985e9c514610a55578063edec5f2714610a92578063f2fde38b14610abb57610288565b8063ba4e5c49146108b2578063ba7d2c76146108ef578063c66828621461091a578063c87b56dd14610945578063cdfb2b4e14610982578063d0eb26b0146109ad57610288565b8063958058591161011357806395805859146107c357806395d89b41146107ee578063a0712d6814610819578063a22cb46514610835578063a475b5dd1461085e578063b88d4fde1461088957610288565b8063715018a6146106db57806376896d8c146106f257806378f9ccf21461071b5780637ac3ad7d146107445780638da5cb5b1461076f57806391e58c781461079a57610288565b80633af32abf116101fe57806355f804b3116101b757806355f804b3146105b95780635c975abb146105e25780636352211e1461060d5780636c0360eb1461064a5780636f8b44b01461067557806370a082311461069e57610288565b80633af32abf146104a65780633ccfd60b146104e357806342842e0e146104ed578063438b63001461051657806344a0d68a146105535780634f6ccce71461057c57610288565b806313faede61161025057806313faede61461038457806318160ddd146103af57806318cae269146103da57806323b872dd146104175780632a3f300c146104405780632f745c591461046957610288565b806301ffc9a71461028d57806302329a29146102ca57806306fdde03146102f3578063081812fc1461031e578063095ea7b31461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613dde565b610ae4565b6040516102c1919061459a565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190613db1565b610c2e565b005b3480156102ff57600080fd5b50610308610cc7565b60405161031591906145b5565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190613e81565b610d59565b6040516103529190614511565b60405180910390f35b34801561036757600080fd5b50610382600480360381019061037d9190613d24565b610dde565b005b34801561039057600080fd5b50610399610ef7565b6040516103a69190614957565b60405180910390f35b3480156103bb57600080fd5b506103c4610efd565b6040516103d19190614957565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc9190613ba1565b610f06565b60405161040e9190614957565b60405180910390f35b34801561042357600080fd5b5061043e60048036038101906104399190613c0e565b610f1e565b005b34801561044c57600080fd5b5061046760048036038101906104629190613db1565b610f2e565b005b34801561047557600080fd5b50610490600480360381019061048b9190613d24565b610fc7565b60405161049d9190614957565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c89190613ba1565b6111c5565b6040516104da919061459a565b60405180910390f35b6104eb611274565b005b3480156104f957600080fd5b50610514600480360381019061050f9190613c0e565b611370565b005b34801561052257600080fd5b5061053d60048036038101906105389190613ba1565b611390565b60405161054a9190614578565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190613e81565b61143e565b005b34801561058857600080fd5b506105a3600480360381019061059e9190613e81565b6114c4565b6040516105b09190614957565b60405180910390f35b3480156105c557600080fd5b506105e060048036038101906105db9190613e38565b611517565b005b3480156105ee57600080fd5b506105f76115ad565b604051610604919061459a565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190613e81565b6115c0565b6040516106419190614511565b60405180910390f35b34801561065657600080fd5b5061065f6115d6565b60405161066c91906145b5565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190613e81565b611664565b005b3480156106aa57600080fd5b506106c560048036038101906106c09190613ba1565b6116ea565b6040516106d29190614957565b60405180910390f35b3480156106e757600080fd5b506106f06117d3565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613e81565b61185b565b005b34801561072757600080fd5b50610742600480360381019061073d9190613db1565b6118e1565b005b34801561075057600080fd5b5061075961197a565b6040516107669190614957565b60405180910390f35b34801561077b57600080fd5b50610784611980565b6040516107919190614511565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc9190613db1565b6119aa565b005b3480156107cf57600080fd5b506107d8611a43565b6040516107e5919061459a565b60405180910390f35b3480156107fa57600080fd5b50610803611a56565b60405161081091906145b5565b60405180910390f35b610833600480360381019061082e9190613e81565b611ae8565b005b34801561084157600080fd5b5061085c60048036038101906108579190613ce4565b611ec0565b005b34801561086a57600080fd5b50610873612041565b604051610880919061459a565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab9190613c61565b612054565b005b3480156108be57600080fd5b506108d960048036038101906108d49190613e81565b6120b0565b6040516108e69190614511565b60405180910390f35b3480156108fb57600080fd5b506109046120ef565b6040516109119190614957565b60405180910390f35b34801561092657600080fd5b5061092f6120f5565b60405161093c91906145b5565b60405180910390f35b34801561095157600080fd5b5061096c60048036038101906109679190613e81565b612183565b60405161097991906145b5565b60405180910390f35b34801561098e57600080fd5b50610997612294565b6040516109a4919061459a565b60405180910390f35b3480156109b957600080fd5b506109d460048036038101906109cf9190613e81565b6122a7565b005b3480156109e257600080fd5b506109eb61232d565b6040516109f89190614957565b60405180910390f35b348015610a0d57600080fd5b50610a16612333565b604051610a239190614957565b60405180910390f35b348015610a3857600080fd5b50610a536004803603810190610a4e9190613e38565b612339565b005b348015610a6157600080fd5b50610a7c6004803603810190610a779190613bce565b6123cf565b604051610a89919061459a565b60405180910390f35b348015610a9e57600080fd5b50610ab96004803603810190610ab49190613d64565b612463565b005b348015610ac757600080fd5b50610ae26004803603810190610add9190613ba1565b612503565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610baf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c1757507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c275750610c26826125fb565b5b9050919050565b610c36612665565b73ffffffffffffffffffffffffffffffffffffffff16610c54611980565b73ffffffffffffffffffffffffffffffffffffffff1614610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190614757565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b606060018054610cd690614d20565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0290614d20565b8015610d4f5780601f10610d2457610100808354040283529160200191610d4f565b820191906000526020600020905b815481529060010190602001808311610d3257829003601f168201915b5050505050905090565b6000610d648261266d565b610da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9a906148f7565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610de9826115c0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e51906147f7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e79612665565b73ffffffffffffffffffffffffffffffffffffffff161480610ea85750610ea781610ea2612665565b6123cf565b5b610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede906146b7565b60405180910390fd5b610ef283838361267a565b505050565b600b5481565b60008054905090565b60126020528060005260406000206000915090505481565b610f2983838361272c565b505050565b610f36612665565b73ffffffffffffffffffffffffffffffffffffffff16610f54611980565b73ffffffffffffffffffffffffffffffffffffffff1614610faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa190614757565b60405180910390fd5b80601460016101000a81548160ff02191690831515021790555050565b6000610fd2836116ea565b8210611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a906145d7565b60405180910390fd5b600061101d610efd565b905060008060005b83811015611183576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461111757806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561116f57868414156111605781955050505050506111bf565b838061116b90614d83565b9450505b50808061117b90614d83565b915050611025565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b690614897565b60405180910390fd5b92915050565b600080600090505b601380549050811015611269578273ffffffffffffffffffffffffffffffffffffffff166013828154811061120557611204614e8a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561125657600191505061126f565b808061126190614d83565b9150506111cd565b50600090505b919050565b61127c612665565b73ffffffffffffffffffffffffffffffffffffffff1661129a611980565b73ffffffffffffffffffffffffffffffffffffffff16146112f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e790614757565b60405180910390fd5b60006112fa611980565b73ffffffffffffffffffffffffffffffffffffffff164760405161131d906144fc565b60006040518083038185875af1925050503d806000811461135a576040519150601f19603f3d011682016040523d82523d6000602084013e61135f565b606091505b505090508061136d57600080fd5b50565b61138b83838360405180602001604052806000815250612054565b505050565b6060600061139d836116ea565b905060008167ffffffffffffffff8111156113bb576113ba614eb9565b5b6040519080825280602002602001820160405280156113e95781602001602082028036833780820191505090505b50905060005b82811015611433576114018582610fc7565b82828151811061141457611413614e8a565b5b602002602001018181525050808061142b90614d83565b9150506113ef565b508092505050919050565b611446612665565b73ffffffffffffffffffffffffffffffffffffffff16611464611980565b73ffffffffffffffffffffffffffffffffffffffff16146114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b190614757565b60405180910390fd5b80600b8190555050565b60006114ce610efd565b821061150f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150690614677565b60405180910390fd5b819050919050565b61151f612665565b73ffffffffffffffffffffffffffffffffffffffff1661153d611980565b73ffffffffffffffffffffffffffffffffffffffff1614611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a90614757565b60405180910390fd5b80600990805190602001906115a9929190613864565b5050565b601060009054906101000a900460ff1681565b60006115cb82612ce5565b600001519050919050565b600980546115e390614d20565b80601f016020809104026020016040519081016040528092919081815260200182805461160f90614d20565b801561165c5780601f106116315761010080835404028352916020019161165c565b820191906000526020600020905b81548152906001019060200180831161163f57829003601f168201915b505050505081565b61166c612665565b73ffffffffffffffffffffffffffffffffffffffff1661168a611980565b73ffffffffffffffffffffffffffffffffffffffff16146116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d790614757565b60405180910390fd5b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561175b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175290614717565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6117db612665565b73ffffffffffffffffffffffffffffffffffffffff166117f9611980565b73ffffffffffffffffffffffffffffffffffffffff161461184f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184690614757565b60405180910390fd5b6118596000612ee8565b565b611863612665565b73ffffffffffffffffffffffffffffffffffffffff16611881611980565b73ffffffffffffffffffffffffffffffffffffffff16146118d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ce90614757565b60405180910390fd5b80600e8190555050565b6118e9612665565b73ffffffffffffffffffffffffffffffffffffffff16611907611980565b73ffffffffffffffffffffffffffffffffffffffff161461195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195490614757565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b600e5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119b2612665565b73ffffffffffffffffffffffffffffffffffffffff166119d0611980565b73ffffffffffffffffffffffffffffffffffffffff1614611a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1d90614757565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b600d60009054906101000a900460ff1681565b606060028054611a6590614d20565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9190614d20565b8015611ade5780601f10611ab357610100808354040283529160200191611ade565b820191906000526020600020905b815481529060010190602001808311611ac157829003601f168201915b5050505050905090565b8060008111611b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2390614917565b60405180910390fd5b600f54811115611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b68906146f7565b60405180910390fd5b6000611b7b610efd565b90503373ffffffffffffffffffffffffffffffffffffffff16611b9c611980565b73ffffffffffffffffffffffffffffffffffffffff1614611e0a57601060009054906101000a900460ff1615611c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfe90614777565b60405180910390fd5b600d60009054906101000a900460ff1615611d6457601460009054906101000a900460ff1615611c7a57611c3a336111c5565b611c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c70906148b7565b60405180910390fd5b5b600e548282611c899190614adb565b1115611cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc190614637565b60405180910390fd5b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506011548382611d1d9190614adb565b1115611d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5590614657565b60405180910390fd5b50611e05565b600c548282611d739190614adb565b1115611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab906146d7565b60405180910390fd5b81600b54611dc29190614b62565b341015611e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfb90614817565b60405180910390fd5b5b611e5b565b600c548282611e199190614adb565b1115611e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e51906146d7565b60405180910390fd5b5b82601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eaa9190614adb565b92505081905550611ebb3384612fae565b505050565b611ec8612665565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d906147b7565b60405180910390fd5b8060066000611f43612665565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ff0612665565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612035919061459a565b60405180910390a35050565b601460019054906101000a900460ff1681565b61205f84848461272c565b61206b84848484612fcc565b6120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190614837565b60405180910390fd5b50505050565b601381815481106120c057600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b600a805461210290614d20565b80601f016020809104026020016040519081016040528092919081815260200182805461212e90614d20565b801561217b5780601f106121505761010080835404028352916020019161217b565b820191906000526020600020905b81548152906001019060200180831161215e57829003601f168201915b505050505081565b606061218e8261266d565b6121cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c490614797565b60405180910390fd5b60006121d7613163565b905060001515601460019054906101000a900460ff161515141561223f5760008151116122135760405180602001604052806000815250612237565b80600a6040516020016122279291906144cd565b6040516020818303038152906040525b91505061228f565b600081511161225d576040518060200160405280600081525061228b565b80612267846131f5565b600a60405160200161227b9392919061449c565b6040516020818303038152906040525b9150505b919050565b601460009054906101000a900460ff1681565b6122af612665565b73ffffffffffffffffffffffffffffffffffffffff166122cd611980565b73ffffffffffffffffffffffffffffffffffffffff1614612323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231a90614757565b60405180910390fd5b8060118190555050565b600c5481565b60075481565b612341612665565b73ffffffffffffffffffffffffffffffffffffffff1661235f611980565b73ffffffffffffffffffffffffffffffffffffffff16146123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac90614757565b60405180910390fd5b80600a90805190602001906123cb929190613864565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61246b612665565b73ffffffffffffffffffffffffffffffffffffffff16612489611980565b73ffffffffffffffffffffffffffffffffffffffff16146124df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d690614757565b60405180910390fd5b601360006124ed91906138ea565b8181601391906124fe92919061390b565b505050565b61250b612665565b73ffffffffffffffffffffffffffffffffffffffff16612529611980565b73ffffffffffffffffffffffffffffffffffffffff161461257f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257690614757565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e6906145f7565b60405180910390fd5b6125f881612ee8565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061273782612ce5565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661275e612665565b73ffffffffffffffffffffffffffffffffffffffff1614806127ba5750612783612665565b73ffffffffffffffffffffffffffffffffffffffff166127a284610d59565b73ffffffffffffffffffffffffffffffffffffffff16145b806127d657506127d582600001516127d0612665565b6123cf565b5b905080612818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280f906147d7565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461288a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288190614737565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156128fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f190614697565b60405180910390fd5b6129078585856001613356565b612917600084846000015161267a565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166129859190614bbc565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a299190614a95565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612b2f9190614adb565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c7557612ba58161266d565b15612c74576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cdd868686600161335c565b505050505050565b612ced6139ab565b612cf68261266d565b612d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2c90614617565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000a8310612d995760017f000000000000000000000000000000000000000000000000000000000000000a84612d8c9190614bf0565b612d969190614adb565b90505b60008390505b818110612ea7576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e9357809350505050612ee3565b508080612e9f90614cf6565b915050612d9f565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eda906148d7565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fc8828260405180602001604052806000815250613362565b5050565b6000612fed8473ffffffffffffffffffffffffffffffffffffffff16613841565b15613156578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613016612665565b8786866040518563ffffffff1660e01b8152600401613038949392919061452c565b602060405180830381600087803b15801561305257600080fd5b505af192505050801561308357506040513d601f19601f820116820180604052508101906130809190613e0b565b60015b613106573d80600081146130b3576040519150601f19603f3d011682016040523d82523d6000602084013e6130b8565b606091505b506000815114156130fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f590614837565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061315b565b600190505b949350505050565b60606009805461317290614d20565b80601f016020809104026020016040519081016040528092919081815260200182805461319e90614d20565b80156131eb5780601f106131c0576101008083540402835291602001916131eb565b820191906000526020600020905b8154815290600101906020018083116131ce57829003601f168201915b5050505050905090565b6060600082141561323d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613351565b600082905060005b6000821461326f57808061325890614d83565b915050600a826132689190614b31565b9150613245565b60008167ffffffffffffffff81111561328b5761328a614eb9565b5b6040519080825280601f01601f1916602001820160405280156132bd5781602001600182028036833780820191505090505b5090505b6000851461334a576001826132d69190614bf0565b9150600a856132e59190614dcc565b60306132f19190614adb565b60f81b81838151811061330757613306614e8a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133439190614b31565b94506132c1565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cf90614877565b60405180910390fd5b6133e18161266d565b15613421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341890614857565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a831115613484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347b90614937565b60405180910390fd5b6134916000858386613356565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161358e9190614a95565b6fffffffffffffffffffffffffffffffff1681526020018583602001516135b59190614a95565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561382457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137c46000888488612fcc565b613803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137fa90614837565b60405180910390fd5b818061380e90614d83565b925050808061381c90614d83565b915050613753565b5080600081905550613839600087858861335c565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461387090614d20565b90600052602060002090601f01602090048101928261389257600085556138d9565b82601f106138ab57805160ff19168380011785556138d9565b828001600101855582156138d9579182015b828111156138d85782518255916020019190600101906138bd565b5b5090506138e691906139e5565b5090565b508054600082559060005260206000209081019061390891906139e5565b50565b82805482825590600052602060002090810192821561399a579160200282015b8281111561399957823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019061392b565b5b5090506139a791906139e5565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156139fe5760008160009055506001016139e6565b5090565b6000613a15613a1084614997565b614972565b905082815260208101848484011115613a3157613a30614ef7565b5b613a3c848285614cb4565b509392505050565b6000613a57613a52846149c8565b614972565b905082815260208101848484011115613a7357613a72614ef7565b5b613a7e848285614cb4565b509392505050565b600081359050613a958161566b565b92915050565b60008083601f840112613ab157613ab0614eed565b5b8235905067ffffffffffffffff811115613ace57613acd614ee8565b5b602083019150836020820283011115613aea57613ae9614ef2565b5b9250929050565b600081359050613b0081615682565b92915050565b600081359050613b1581615699565b92915050565b600081519050613b2a81615699565b92915050565b600082601f830112613b4557613b44614eed565b5b8135613b55848260208601613a02565b91505092915050565b600082601f830112613b7357613b72614eed565b5b8135613b83848260208601613a44565b91505092915050565b600081359050613b9b816156b0565b92915050565b600060208284031215613bb757613bb6614f01565b5b6000613bc584828501613a86565b91505092915050565b60008060408385031215613be557613be4614f01565b5b6000613bf385828601613a86565b9250506020613c0485828601613a86565b9150509250929050565b600080600060608486031215613c2757613c26614f01565b5b6000613c3586828701613a86565b9350506020613c4686828701613a86565b9250506040613c5786828701613b8c565b9150509250925092565b60008060008060808587031215613c7b57613c7a614f01565b5b6000613c8987828801613a86565b9450506020613c9a87828801613a86565b9350506040613cab87828801613b8c565b925050606085013567ffffffffffffffff811115613ccc57613ccb614efc565b5b613cd887828801613b30565b91505092959194509250565b60008060408385031215613cfb57613cfa614f01565b5b6000613d0985828601613a86565b9250506020613d1a85828601613af1565b9150509250929050565b60008060408385031215613d3b57613d3a614f01565b5b6000613d4985828601613a86565b9250506020613d5a85828601613b8c565b9150509250929050565b60008060208385031215613d7b57613d7a614f01565b5b600083013567ffffffffffffffff811115613d9957613d98614efc565b5b613da585828601613a9b565b92509250509250929050565b600060208284031215613dc757613dc6614f01565b5b6000613dd584828501613af1565b91505092915050565b600060208284031215613df457613df3614f01565b5b6000613e0284828501613b06565b91505092915050565b600060208284031215613e2157613e20614f01565b5b6000613e2f84828501613b1b565b91505092915050565b600060208284031215613e4e57613e4d614f01565b5b600082013567ffffffffffffffff811115613e6c57613e6b614efc565b5b613e7884828501613b5e565b91505092915050565b600060208284031215613e9757613e96614f01565b5b6000613ea584828501613b8c565b91505092915050565b6000613eba838361447e565b60208301905092915050565b613ecf81614c24565b82525050565b6000613ee082614a1e565b613eea8185614a4c565b9350613ef5836149f9565b8060005b83811015613f26578151613f0d8882613eae565b9750613f1883614a3f565b925050600181019050613ef9565b5085935050505092915050565b613f3c81614c36565b82525050565b6000613f4d82614a29565b613f578185614a5d565b9350613f67818560208601614cc3565b613f7081614f06565b840191505092915050565b6000613f8682614a34565b613f908185614a79565b9350613fa0818560208601614cc3565b613fa981614f06565b840191505092915050565b6000613fbf82614a34565b613fc98185614a8a565b9350613fd9818560208601614cc3565b80840191505092915050565b60008154613ff281614d20565b613ffc8186614a8a565b9450600182166000811461401757600181146140285761405b565b60ff1983168652818601935061405b565b61403185614a09565b60005b8381101561405357815481890152600182019150602081019050614034565b838801955050505b50505092915050565b6000614071602283614a79565b915061407c82614f17565b604082019050919050565b6000614094602683614a79565b915061409f82614f66565b604082019050919050565b60006140b7602a83614a79565b91506140c282614fb5565b604082019050919050565b60006140da601b83614a79565b91506140e582615004565b602082019050919050565b60006140fd601c83614a79565b91506141088261502d565b602082019050919050565b6000614120602383614a79565b915061412b82615056565b604082019050919050565b6000614143602583614a79565b915061414e826150a5565b604082019050919050565b6000614166603983614a79565b9150614171826150f4565b604082019050919050565b6000614189601683614a79565b915061419482615143565b602082019050919050565b60006141ac602483614a79565b91506141b78261516c565b604082019050919050565b60006141cf602b83614a79565b91506141da826151bb565b604082019050919050565b60006141f2602683614a79565b91506141fd8261520a565b604082019050919050565b6000614215602083614a79565b915061422082615259565b602082019050919050565b6000614238600683614a8a565b915061424382615282565b600682019050919050565b600061425b601683614a79565b9150614266826152ab565b602082019050919050565b600061427e602f83614a79565b9150614289826152d4565b604082019050919050565b60006142a1601a83614a79565b91506142ac82615323565b602082019050919050565b60006142c4603283614a79565b91506142cf8261534c565b604082019050919050565b60006142e7602283614a79565b91506142f28261539b565b604082019050919050565b600061430a600083614a6e565b9150614315826153ea565b600082019050919050565b600061432d601283614a79565b9150614338826153ed565b602082019050919050565b6000614350603383614a79565b915061435b82615416565b604082019050919050565b6000614373601d83614a79565b915061437e82615465565b602082019050919050565b6000614396602183614a79565b91506143a18261548e565b604082019050919050565b60006143b9602e83614a79565b91506143c4826154dd565b604082019050919050565b60006143dc601783614a79565b91506143e78261552c565b602082019050919050565b60006143ff602f83614a79565b915061440a82615555565b604082019050919050565b6000614422602d83614a79565b915061442d826155a4565b604082019050919050565b6000614445601b83614a79565b9150614450826155f3565b602082019050919050565b6000614468602283614a79565b91506144738261561c565b604082019050919050565b61448781614caa565b82525050565b61449681614caa565b82525050565b60006144a88286613fb4565b91506144b48285613fb4565b91506144c08284613fe5565b9150819050949350505050565b60006144d98285613fb4565b91506144e48261422b565b91506144f08284613fe5565b91508190509392505050565b6000614507826142fd565b9150819050919050565b60006020820190506145266000830184613ec6565b92915050565b60006080820190506145416000830187613ec6565b61454e6020830186613ec6565b61455b604083018561448d565b818103606083015261456d8184613f42565b905095945050505050565b600060208201905081810360008301526145928184613ed5565b905092915050565b60006020820190506145af6000830184613f33565b92915050565b600060208201905081810360008301526145cf8184613f7b565b905092915050565b600060208201905081810360008301526145f081614064565b9050919050565b6000602082019050818103600083015261461081614087565b9050919050565b60006020820190508181036000830152614630816140aa565b9050919050565b60006020820190508181036000830152614650816140cd565b9050919050565b60006020820190508181036000830152614670816140f0565b9050919050565b6000602082019050818103600083015261469081614113565b9050919050565b600060208201905081810360008301526146b081614136565b9050919050565b600060208201905081810360008301526146d081614159565b9050919050565b600060208201905081810360008301526146f08161417c565b9050919050565b600060208201905081810360008301526147108161419f565b9050919050565b60006020820190508181036000830152614730816141c2565b9050919050565b60006020820190508181036000830152614750816141e5565b9050919050565b6000602082019050818103600083015261477081614208565b9050919050565b600060208201905081810360008301526147908161424e565b9050919050565b600060208201905081810360008301526147b081614271565b9050919050565b600060208201905081810360008301526147d081614294565b9050919050565b600060208201905081810360008301526147f0816142b7565b9050919050565b60006020820190508181036000830152614810816142da565b9050919050565b6000602082019050818103600083015261483081614320565b9050919050565b6000602082019050818103600083015261485081614343565b9050919050565b6000602082019050818103600083015261487081614366565b9050919050565b6000602082019050818103600083015261489081614389565b9050919050565b600060208201905081810360008301526148b0816143ac565b9050919050565b600060208201905081810360008301526148d0816143cf565b9050919050565b600060208201905081810360008301526148f0816143f2565b9050919050565b6000602082019050818103600083015261491081614415565b9050919050565b6000602082019050818103600083015261493081614438565b9050919050565b600060208201905081810360008301526149508161445b565b9050919050565b600060208201905061496c600083018461448d565b92915050565b600061497c61498d565b90506149888282614d52565b919050565b6000604051905090565b600067ffffffffffffffff8211156149b2576149b1614eb9565b5b6149bb82614f06565b9050602081019050919050565b600067ffffffffffffffff8211156149e3576149e2614eb9565b5b6149ec82614f06565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614aa082614c6e565b9150614aab83614c6e565b9250826fffffffffffffffffffffffffffffffff03821115614ad057614acf614dfd565b5b828201905092915050565b6000614ae682614caa565b9150614af183614caa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b2657614b25614dfd565b5b828201905092915050565b6000614b3c82614caa565b9150614b4783614caa565b925082614b5757614b56614e2c565b5b828204905092915050565b6000614b6d82614caa565b9150614b7883614caa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bb157614bb0614dfd565b5b828202905092915050565b6000614bc782614c6e565b9150614bd283614c6e565b925082821015614be557614be4614dfd565b5b828203905092915050565b6000614bfb82614caa565b9150614c0683614caa565b925082821015614c1957614c18614dfd565b5b828203905092915050565b6000614c2f82614c8a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614ce1578082015181840152602081019050614cc6565b83811115614cf0576000848401525b50505050565b6000614d0182614caa565b91506000821415614d1557614d14614dfd565b5b600182039050919050565b60006002820490506001821680614d3857607f821691505b60208210811415614d4c57614d4b614e5b565b5b50919050565b614d5b82614f06565b810181811067ffffffffffffffff82111715614d7a57614d79614eb9565b5b80604052505050565b6000614d8e82614caa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614dc157614dc0614dfd565b5b600182019050919050565b6000614dd782614caa565b9150614de283614caa565b925082614df257614df1614e2c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f6d61782046524545204e4654206c696d69742065786365656465640000000000600082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f68696464656e0000000000000000000000000000000000000000000000000000600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b61567481614c24565b811461567f57600080fd5b50565b61568b81614c36565b811461569657600080fd5b50565b6156a281614c42565b81146156ad57600080fd5b50565b6156b981614caa565b81146156c457600080fd5b5056fea26469706673582212204a28f57ceb63febcad1edd61ebe2ebdd14f790ac7833633091610ed4d85308ff64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000094e79616e46726e647a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064e46524e445a0000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): NyanFrndz
Arg [1] : _symbol (string): NFRNDZ

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [3] : 4e79616e46726e647a0000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 4e46524e445a0000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

62171:4708:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27405:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65387:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29210:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30771:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30292:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62377:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25846:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62648:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31647:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65981:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26510:823;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65586:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66067:145;;;:::i;:::-;;31880:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64367:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65071:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26023:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65157:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62574:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29019:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62247:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64723:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27841:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4763:103;;;;;;;;;;;;;:::i;:::-;;64827:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65466:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62486:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4112:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64275:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62452:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29379:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64096:173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31057:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62794:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32128:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62710:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62606;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62333;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66275:601;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62752:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64959:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62414:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36788:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65261:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31416:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65831:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5021:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27405:372;27507:4;27559:25;27544:40;;;:11;:40;;;;:105;;;;27616:33;27601:48;;;:11;:48;;;;27544:105;:172;;;;27681:35;27666:50;;;:11;:50;;;;27544:172;:225;;;;27733:36;27757:11;27733:23;:36::i;:::-;27544:225;27524:245;;27405:372;;;:::o;65387:73::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65448:6:::1;65439;;:15;;;;;;;;;;;;;;;;;;65387:73:::0;:::o;29210:100::-;29264:13;29297:5;29290:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29210:100;:::o;30771:214::-;30839:7;30867:16;30875:7;30867;:16::i;:::-;30859:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30953:15;:24;30969:7;30953:24;;;;;;;;;;;;;;;;;;;;;30946:31;;30771:214;;;:::o;30292:413::-;30365:13;30381:24;30397:7;30381:15;:24::i;:::-;30365:40;;30430:5;30424:11;;:2;:11;;;;30416:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30525:5;30509:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30534:37;30551:5;30558:12;:10;:12::i;:::-;30534:16;:37::i;:::-;30509:62;30487:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;30669:28;30678:2;30682:7;30691:5;30669:8;:28::i;:::-;30354:351;30292:413;;:::o;62377:32::-;;;;:::o;25846:100::-;25899:7;25926:12;;25919:19;;25846:100;:::o;62648:55::-;;;;;;;;;;;;;;;;;:::o;31647:162::-;31773:28;31783:4;31789:2;31793:7;31773:9;:28::i;:::-;31647:162;;;:::o;65981:79::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66047:7:::1;66038:6;;:16;;;;;;;;;;;;;;;;;;65981:79:::0;:::o;26510:823::-;26599:7;26635:16;26645:5;26635:9;:16::i;:::-;26627:5;:24;26619:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26701:22;26726:13;:11;:13::i;:::-;26701:38;;26750:19;26784:25;26838:9;26833:426;26857:14;26853:1;:18;26833:426;;;26893:31;26927:11;:14;26939:1;26927:14;;;;;;;;;;;26893:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26986:1;26960:28;;:9;:14;;;:28;;;26956:103;;27029:9;:14;;;27009:34;;26956:103;27098:5;27077:26;;:17;:26;;;27073:175;;;27143:5;27128:11;:20;27124:77;;;27180:1;27173:8;;;;;;;;;27124:77;27219:13;;;;;:::i;:::-;;;;27073:175;26878:381;26873:3;;;;;:::i;:::-;;;;26833:426;;;;27269:56;;;;;;;;;;:::i;:::-;;;;;;;;26510:823;;;;;:::o;65586:239::-;65645:4;65663:6;65672:1;65663:10;;65658:143;65679:20;:27;;;;65675:1;:31;65658:143;;;65753:5;65726:32;;:20;65747:1;65726:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:32;;;65722:72;;;65780:4;65773:11;;;;;65722:72;65708:3;;;;;:::i;:::-;;;;65658:143;;;;65814:5;65807:12;;65586:239;;;;:::o;66067:145::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66120:7:::1;66141;:5;:7::i;:::-;66133:21;;66162;66133:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66119:69;;;66203:2;66195:11;;;::::0;::::1;;66112:100;66067:145::o:0;31880:177::-;32010:39;32027:4;32033:2;32037:7;32010:39;;;;;;;;;;;;:16;:39::i;:::-;31880:177;;;:::o;64367:348::-;64442:16;64470:23;64496:17;64506:6;64496:9;:17::i;:::-;64470:43;;64520:25;64562:15;64548:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64520:58;;64590:9;64585:103;64605:15;64601:1;:19;64585:103;;;64650:30;64670:6;64678:1;64650:19;:30::i;:::-;64636:8;64645:1;64636:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;64622:3;;;;;:::i;:::-;;;;64585:103;;;;64701:8;64694:15;;;;64367:348;;;:::o;65071:80::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65137:8:::1;65130:4;:15;;;;65071:80:::0;:::o;26023:187::-;26090:7;26126:13;:11;:13::i;:::-;26118:5;:21;26110:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;26197:5;26190:12;;26023:187;;;:::o;65157:98::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65238:11:::1;65228:7;:21;;;;;;;;;;;;:::i;:::-;;65157:98:::0;:::o;62574:25::-;;;;;;;;;;;;;:::o;29019:124::-;29083:7;29110:20;29122:7;29110:11;:20::i;:::-;:25;;;29103:32;;29019:124;;;:::o;62247:81::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64723:94::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64801:10:::1;64789:9;:22;;;;64723:94:::0;:::o;27841:221::-;27905:7;27950:1;27933:19;;:5;:19;;;;27925:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;28026:12;:19;28039:5;28026:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28018:36;;28011:43;;27841:221;;;:::o;4763:103::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4828:30:::1;4855:1;4828:18;:30::i;:::-;4763:103::o:0;64827:126::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64929:18:::1;64909:17;:38;;;;64827:126:::0;:::o;65466:114::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65558:16:::1;65540:15;;:34;;;;;;;;;;;;;;;;;;65466:114:::0;:::o;62486:38::-;;;;:::o;4112:87::-;4158:7;4185:6;;;;;;;;;;;4178:13;;4112:87;:::o;64275:86::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64346:9:::1;64335:8;;:20;;;;;;;;;;;;;;;;;;64275:86:::0;:::o;62452:27::-;;;;;;;;;;;;;:::o;29379:104::-;29435:13;29468:7;29461:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29379:104;:::o;64096:173::-;64157:11;63141:1;63127:11;:15;63119:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;63204:13;;63189:11;:28;;63181:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;63267:14;63284:13;:11;:13::i;:::-;63267:30;;63320:10;63309:21;;:7;:5;:7::i;:::-;:21;;;63306:752;;63349:6;;;;;;;;;;;63348:7;63340:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63394:8;;;;;;;;;;;63391:571;;;63417:15;;;;;;;;;;;63414:105;;;63454:25;63468:10;63454:13;:25::i;:::-;63446:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;63414:105;63561:17;;63546:11;63537:6;:20;;;;:::i;:::-;:41;;63529:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;63623:24;63650:20;:32;63671:10;63650:32;;;;;;;;;;;;;;;;63623:59;;63735:18;;63720:11;63701:16;:30;;;;:::i;:::-;:52;;63693:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;63403:393;63391:571;;;63843:9;;63828:11;63819:6;:20;;;;:::i;:::-;:33;;63811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63918:11;63911:4;;:18;;;;:::i;:::-;63898:9;:31;;63890:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;63391:571;63306:752;;;64014:9;;63999:11;63990:6;:20;;;;:::i;:::-;:33;;63982:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63306:752;64211:11:::1;64177:20;:32;64198:10;64177:32;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;64229:34;64239:10;64251:11;64229:9;:34::i;:::-;63112:965:::0;64096:173;;:::o;31057:288::-;31164:12;:10;:12::i;:::-;31152:24;;:8;:24;;;;31144:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;31265:8;31220:18;:32;31239:12;:10;:12::i;:::-;31220:32;;;;;;;;;;;;;;;:42;31253:8;31220:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31318:8;31289:48;;31304:12;:10;:12::i;:::-;31289:48;;;31328:8;31289:48;;;;;;:::i;:::-;;;;;;;;31057:288;;:::o;62794:26::-;;;;;;;;;;;;;:::o;32128:355::-;32287:28;32297:4;32303:2;32307:7;32287:9;:28::i;:::-;32348:48;32371:4;32377:2;32381:7;32390:5;32348:22;:48::i;:::-;32326:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;32128:355;;;;:::o;62710:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62606:::-;;;;:::o;62333:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66275:601::-;66373:13;66414:16;66422:7;66414;:16::i;:::-;66398:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;66504:28;66535:10;:8;:10::i;:::-;66504:41;;66565:5;66557:13;;:6;;;;;;;;;;;:13;;;66554:164;;;66618:1;66593:14;66587:28;:32;:123;;;;;;;;;;;;;;;;;66655:14;66681:13;66638:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66587:123;66580:130;;;;;66554:164;66768:1;66743:14;66737:28;:32;:133;;;;;;;;;;;;;;;;;66805:14;66821:18;:7;:16;:18::i;:::-;66841:13;66788:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66737:133;66730:140;;;66275:601;;;;:::o;62752:35::-;;;;;;;;;;;;;:::o;64959:104::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65051:6:::1;65030:18;:27;;;;64959:104:::0;:::o;62414:31::-;;;;:::o;36788:43::-;;;;:::o;65261:122::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65360:17:::1;65344:13;:33;;;;;;;;;;;;:::i;:::-;;65261:122:::0;:::o;31416:164::-;31513:4;31537:18;:25;31556:5;31537:25;;;;;;;;;;;;;;;:35;31563:8;31537:35;;;;;;;;;;;;;;;;;;;;;;;;;31530:42;;31416:164;;;;:::o;65831:144::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65913:20:::1;;65906:27;;;;:::i;:::-;65963:6;;65940:20;:29;;;;;;;:::i;:::-;;65831:144:::0;;:::o;5021:201::-;4343:12;:10;:12::i;:::-;4332:23;;:7;:5;:7::i;:::-;:23;;;4324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5130:1:::1;5110:22;;:8;:22;;;;5102:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5186:28;5205:8;5186:18;:28::i;:::-;5021:201:::0;:::o;16896:157::-;16981:4;17020:25;17005:40;;;:11;:40;;;;16998:47;;16896:157;;;:::o;2836:98::-;2889:7;2916:10;2909:17;;2836:98;:::o;32738:111::-;32795:4;32829:12;;32819:7;:22;32812:29;;32738:111;;;:::o;36584:196::-;36726:2;36699:15;:24;36715:7;36699:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36764:7;36760:2;36744:28;;36753:5;36744:28;;;;;;;;;;;;36584:196;;;:::o;34892:1574::-;35007:35;35045:20;35057:7;35045:11;:20::i;:::-;35007:58;;35078:22;35120:13;:18;;;35104:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;35179:12;:10;:12::i;:::-;35155:36;;:20;35167:7;35155:11;:20::i;:::-;:36;;;35104:87;:154;;;;35208:50;35225:13;:18;;;35245:12;:10;:12::i;:::-;35208:16;:50::i;:::-;35104:154;35078:181;;35280:17;35272:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;35395:4;35373:26;;:13;:18;;;:26;;;35365:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;35475:1;35461:16;;:2;:16;;;;35453:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;35532:43;35554:4;35560:2;35564:7;35573:1;35532:21;:43::i;:::-;35640:49;35657:1;35661:7;35670:13;:18;;;35640:8;:49::i;:::-;35732:1;35702:12;:18;35715:4;35702:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35772:1;35744:12;:16;35757:2;35744:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35807:43;;;;;;;;35822:2;35807:43;;;;;;35833:15;35807:43;;;;;35784:11;:20;35796:7;35784:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36090:19;36122:1;36112:7;:11;;;;:::i;:::-;36090:33;;36179:1;36138:43;;:11;:24;36150:11;36138:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;36134:227;;;36202:20;36210:11;36202:7;:20::i;:::-;36198:152;;;36270:64;;;;;;;;36285:13;:18;;;36270:64;;;;;;36305:13;:28;;;36270:64;;;;;36243:11;:24;36255:11;36243:24;;;;;;;;;;;:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36198:152;36134:227;36397:7;36393:2;36378:27;;36387:4;36378:27;;;;;;;;;;;;36416:42;36437:4;36443:2;36447:7;36456:1;36416:20;:42::i;:::-;34996:1470;;;34892:1574;;;:::o;28307:650::-;28368:21;;:::i;:::-;28410:16;28418:7;28410;:16::i;:::-;28402:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;28486:26;28538:12;28527:7;:23;28523:103;;28613:1;28598:12;28588:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;28567:47;;28523:103;28643:12;28658:7;28643:22;;28638:242;28675:18;28667:4;:26;28638:242;;28718:31;28752:11;:17;28764:4;28752:17;;;;;;;;;;;28718:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28814:1;28788:28;;:9;:14;;;:28;;;28784:85;;28844:9;28837:16;;;;;;;28784:85;28703:177;28695:6;;;;;:::i;:::-;;;;28638:242;;;;28892:57;;;;;;;;;;:::i;:::-;;;;;;;;28307:650;;;;:::o;5382:191::-;5456:16;5475:6;;;;;;;;;;;5456:25;;5501:8;5492:6;;:17;;;;;;;;;;;;;;;;;;5556:8;5525:40;;5546:8;5525:40;;;;;;;;;;;;5445:128;5382:191;:::o;32857:104::-;32926:27;32936:2;32940:8;32926:27;;;;;;;;;;;;:9;:27::i;:::-;32857:104;;:::o;38394:804::-;38549:4;38570:15;:2;:13;;;:15::i;:::-;38566:625;;;38622:2;38606:36;;;38643:12;:10;:12::i;:::-;38657:4;38663:7;38672:5;38606:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38602:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38869:1;38852:6;:13;:18;38848:273;;;38895:61;;;;;;;;;;:::i;:::-;;;;;;;;38848:273;39071:6;39065:13;39056:6;39052:2;39048:15;39041:38;38602:534;38739:45;;;38729:55;;;:6;:55;;;;38722:62;;;;;38566:625;39175:4;39168:11;;38394:804;;;;;;;:::o;62964:102::-;63024:13;63053:7;63046:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62964:102;:::o;398:723::-;454:13;684:1;675:5;:10;671:53;;;702:10;;;;;;;;;;;;;;;;;;;;;671:53;734:12;749:5;734:20;;765:14;790:78;805:1;797:4;:9;790:78;;823:8;;;;;:::i;:::-;;;;854:2;846:10;;;;;:::i;:::-;;;790:78;;;878:19;910:6;900:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;878:39;;928:154;944:1;935:5;:10;928:154;;972:1;962:11;;;;;:::i;:::-;;;1039:2;1031:5;:10;;;;:::i;:::-;1018:2;:24;;;;:::i;:::-;1005:39;;988:6;995;988:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1068:2;1059:11;;;;;:::i;:::-;;;928:154;;;1106:6;1092:21;;;;;398:723;;;;:::o;39686:159::-;;;;;:::o;40257:158::-;;;;;:::o;33238:1400::-;33361:20;33384:12;;33361:35;;33429:1;33415:16;;:2;:16;;;;33407:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33614:21;33622:12;33614:7;:21::i;:::-;33613:22;33605:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33700:12;33688:8;:24;;33680:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33764:61;33794:1;33798:2;33802:12;33816:8;33764:21;:61::i;:::-;33838:30;33871:12;:16;33884:2;33871:16;;;;;;;;;;;;;;;33838:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33917:135;;;;;;;;33973:8;33943:11;:19;;;:39;;;;:::i;:::-;33917:135;;;;;;34032:8;33997:11;:24;;;:44;;;;:::i;:::-;33917:135;;;;;33898:12;:16;33911:2;33898:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34091:43;;;;;;;;34106:2;34091:43;;;;;;34117:15;34091:43;;;;;34063:11;:25;34075:12;34063:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34147:20;34170:12;34147:35;;34200:9;34195:325;34219:8;34215:1;:12;34195:325;;;34279:12;34275:2;34254:38;;34271:1;34254:38;;;;;;;;;;;;34333:59;34364:1;34368:2;34372:12;34386:5;34333:22;:59::i;:::-;34307:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;34494:14;;;;;:::i;:::-;;;;34229:3;;;;;:::i;:::-;;;;34195:325;;;;34547:12;34532;:27;;;;34570:60;34599:1;34603:2;34607:12;34621:8;34570:20;:60::i;:::-;33350:1288;;;33238:1400;;;:::o;6813:326::-;6873:4;7130:1;7108:7;:19;;;:23;7101:30;;6813:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:329::-;2927:6;2976:2;2964:9;2955:7;2951:23;2947:32;2944:119;;;2982:79;;:::i;:::-;2944:119;3102:1;3127:53;3172:7;3163:6;3152:9;3148:22;3127:53;:::i;:::-;3117:63;;3073:117;2868:329;;;;:::o;3203:474::-;3271:6;3279;3328:2;3316:9;3307:7;3303:23;3299:32;3296:119;;;3334:79;;:::i;:::-;3296:119;3454:1;3479:53;3524:7;3515:6;3504:9;3500:22;3479:53;:::i;:::-;3469:63;;3425:117;3581:2;3607:53;3652:7;3643:6;3632:9;3628:22;3607:53;:::i;:::-;3597:63;;3552:118;3203:474;;;;;:::o;3683:619::-;3760:6;3768;3776;3825:2;3813:9;3804:7;3800:23;3796:32;3793:119;;;3831:79;;:::i;:::-;3793:119;3951:1;3976:53;4021:7;4012:6;4001:9;3997:22;3976:53;:::i;:::-;3966:63;;3922:117;4078:2;4104:53;4149:7;4140:6;4129:9;4125:22;4104:53;:::i;:::-;4094:63;;4049:118;4206:2;4232:53;4277:7;4268:6;4257:9;4253:22;4232:53;:::i;:::-;4222:63;;4177:118;3683:619;;;;;:::o;4308:943::-;4403:6;4411;4419;4427;4476:3;4464:9;4455:7;4451:23;4447:33;4444:120;;;4483:79;;:::i;:::-;4444:120;4603:1;4628:53;4673:7;4664:6;4653:9;4649:22;4628:53;:::i;:::-;4618:63;;4574:117;4730:2;4756:53;4801:7;4792:6;4781:9;4777:22;4756:53;:::i;:::-;4746:63;;4701:118;4858:2;4884:53;4929:7;4920:6;4909:9;4905:22;4884:53;:::i;:::-;4874:63;;4829:118;5014:2;5003:9;4999:18;4986:32;5045:18;5037:6;5034:30;5031:117;;;5067:79;;:::i;:::-;5031:117;5172:62;5226:7;5217:6;5206:9;5202:22;5172:62;:::i;:::-;5162:72;;4957:287;4308:943;;;;;;;:::o;5257:468::-;5322:6;5330;5379:2;5367:9;5358:7;5354:23;5350:32;5347:119;;;5385:79;;:::i;:::-;5347:119;5505:1;5530:53;5575:7;5566:6;5555:9;5551:22;5530:53;:::i;:::-;5520:63;;5476:117;5632:2;5658:50;5700:7;5691:6;5680:9;5676:22;5658:50;:::i;:::-;5648:60;;5603:115;5257:468;;;;;:::o;5731:474::-;5799:6;5807;5856:2;5844:9;5835:7;5831:23;5827:32;5824:119;;;5862:79;;:::i;:::-;5824:119;5982:1;6007:53;6052:7;6043:6;6032:9;6028:22;6007:53;:::i;:::-;5997:63;;5953:117;6109:2;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6080:118;5731:474;;;;;:::o;6211:559::-;6297:6;6305;6354:2;6342:9;6333:7;6329:23;6325:32;6322:119;;;6360:79;;:::i;:::-;6322:119;6508:1;6497:9;6493:17;6480:31;6538:18;6530:6;6527:30;6524:117;;;6560:79;;:::i;:::-;6524:117;6673:80;6745:7;6736:6;6725:9;6721:22;6673:80;:::i;:::-;6655:98;;;;6451:312;6211:559;;;;;:::o;6776:323::-;6832:6;6881:2;6869:9;6860:7;6856:23;6852:32;6849:119;;;6887:79;;:::i;:::-;6849:119;7007:1;7032:50;7074:7;7065:6;7054:9;7050:22;7032:50;:::i;:::-;7022:60;;6978:114;6776:323;;;;:::o;7105:327::-;7163:6;7212:2;7200:9;7191:7;7187:23;7183:32;7180:119;;;7218:79;;:::i;:::-;7180:119;7338:1;7363:52;7407:7;7398:6;7387:9;7383:22;7363:52;:::i;:::-;7353:62;;7309:116;7105:327;;;;:::o;7438:349::-;7507:6;7556:2;7544:9;7535:7;7531:23;7527:32;7524:119;;;7562:79;;:::i;:::-;7524:119;7682:1;7707:63;7762:7;7753:6;7742:9;7738:22;7707:63;:::i;:::-;7697:73;;7653:127;7438:349;;;;:::o;7793:509::-;7862:6;7911:2;7899:9;7890:7;7886:23;7882:32;7879:119;;;7917:79;;:::i;:::-;7879:119;8065:1;8054:9;8050:17;8037:31;8095:18;8087:6;8084:30;8081:117;;;8117:79;;:::i;:::-;8081:117;8222:63;8277:7;8268:6;8257:9;8253:22;8222:63;:::i;:::-;8212:73;;8008:287;7793:509;;;;:::o;8308:329::-;8367:6;8416:2;8404:9;8395:7;8391:23;8387:32;8384:119;;;8422:79;;:::i;:::-;8384:119;8542:1;8567:53;8612:7;8603:6;8592:9;8588:22;8567:53;:::i;:::-;8557:63;;8513:117;8308:329;;;;:::o;8643:179::-;8712:10;8733:46;8775:3;8767:6;8733:46;:::i;:::-;8811:4;8806:3;8802:14;8788:28;;8643:179;;;;:::o;8828:118::-;8915:24;8933:5;8915:24;:::i;:::-;8910:3;8903:37;8828:118;;:::o;8982:732::-;9101:3;9130:54;9178:5;9130:54;:::i;:::-;9200:86;9279:6;9274:3;9200:86;:::i;:::-;9193:93;;9310:56;9360:5;9310:56;:::i;:::-;9389:7;9420:1;9405:284;9430:6;9427:1;9424:13;9405:284;;;9506:6;9500:13;9533:63;9592:3;9577:13;9533:63;:::i;:::-;9526:70;;9619:60;9672:6;9619:60;:::i;:::-;9609:70;;9465:224;9452:1;9449;9445:9;9440:14;;9405:284;;;9409:14;9705:3;9698:10;;9106:608;;;8982:732;;;;:::o;9720:109::-;9801:21;9816:5;9801:21;:::i;:::-;9796:3;9789:34;9720:109;;:::o;9835:360::-;9921:3;9949:38;9981:5;9949:38;:::i;:::-;10003:70;10066:6;10061:3;10003:70;:::i;:::-;9996:77;;10082:52;10127:6;10122:3;10115:4;10108:5;10104:16;10082:52;:::i;:::-;10159:29;10181:6;10159:29;:::i;:::-;10154:3;10150:39;10143:46;;9925:270;9835:360;;;;:::o;10201:364::-;10289:3;10317:39;10350:5;10317:39;:::i;:::-;10372:71;10436:6;10431:3;10372:71;:::i;:::-;10365:78;;10452:52;10497:6;10492:3;10485:4;10478:5;10474:16;10452:52;:::i;:::-;10529:29;10551:6;10529:29;:::i;:::-;10524:3;10520:39;10513:46;;10293:272;10201:364;;;;:::o;10571:377::-;10677:3;10705:39;10738:5;10705:39;:::i;:::-;10760:89;10842:6;10837:3;10760:89;:::i;:::-;10753:96;;10858:52;10903:6;10898:3;10891:4;10884:5;10880:16;10858:52;:::i;:::-;10935:6;10930:3;10926:16;10919:23;;10681:267;10571:377;;;;:::o;10978:845::-;11081:3;11118:5;11112:12;11147:36;11173:9;11147:36;:::i;:::-;11199:89;11281:6;11276:3;11199:89;:::i;:::-;11192:96;;11319:1;11308:9;11304:17;11335:1;11330:137;;;;11481:1;11476:341;;;;11297:520;;11330:137;11414:4;11410:9;11399;11395:25;11390:3;11383:38;11450:6;11445:3;11441:16;11434:23;;11330:137;;11476:341;11543:38;11575:5;11543:38;:::i;:::-;11603:1;11617:154;11631:6;11628:1;11625:13;11617:154;;;11705:7;11699:14;11695:1;11690:3;11686:11;11679:35;11755:1;11746:7;11742:15;11731:26;;11653:4;11650:1;11646:12;11641:17;;11617:154;;;11800:6;11795:3;11791:16;11784:23;;11483:334;;11297:520;;11085:738;;10978:845;;;;:::o;11829:366::-;11971:3;11992:67;12056:2;12051:3;11992:67;:::i;:::-;11985:74;;12068:93;12157:3;12068:93;:::i;:::-;12186:2;12181:3;12177:12;12170:19;;11829:366;;;:::o;12201:::-;12343:3;12364:67;12428:2;12423:3;12364:67;:::i;:::-;12357:74;;12440:93;12529:3;12440:93;:::i;:::-;12558:2;12553:3;12549:12;12542:19;;12201:366;;;:::o;12573:::-;12715:3;12736:67;12800:2;12795:3;12736:67;:::i;:::-;12729:74;;12812:93;12901:3;12812:93;:::i;:::-;12930:2;12925:3;12921:12;12914:19;;12573:366;;;:::o;12945:::-;13087:3;13108:67;13172:2;13167:3;13108:67;:::i;:::-;13101:74;;13184:93;13273:3;13184:93;:::i;:::-;13302:2;13297:3;13293:12;13286:19;;12945:366;;;:::o;13317:::-;13459:3;13480:67;13544:2;13539:3;13480:67;:::i;:::-;13473:74;;13556:93;13645:3;13556:93;:::i;:::-;13674:2;13669:3;13665:12;13658:19;;13317:366;;;:::o;13689:::-;13831:3;13852:67;13916:2;13911:3;13852:67;:::i;:::-;13845:74;;13928:93;14017:3;13928:93;:::i;:::-;14046:2;14041:3;14037:12;14030:19;;13689:366;;;:::o;14061:::-;14203:3;14224:67;14288:2;14283:3;14224:67;:::i;:::-;14217:74;;14300:93;14389:3;14300:93;:::i;:::-;14418:2;14413:3;14409:12;14402:19;;14061:366;;;:::o;14433:::-;14575:3;14596:67;14660:2;14655:3;14596:67;:::i;:::-;14589:74;;14672:93;14761:3;14672:93;:::i;:::-;14790:2;14785:3;14781:12;14774:19;;14433:366;;;:::o;14805:::-;14947:3;14968:67;15032:2;15027:3;14968:67;:::i;:::-;14961:74;;15044:93;15133:3;15044:93;:::i;:::-;15162:2;15157:3;15153:12;15146:19;;14805:366;;;:::o;15177:::-;15319:3;15340:67;15404:2;15399:3;15340:67;:::i;:::-;15333:74;;15416:93;15505:3;15416:93;:::i;:::-;15534:2;15529:3;15525:12;15518:19;;15177:366;;;:::o;15549:::-;15691:3;15712:67;15776:2;15771:3;15712:67;:::i;:::-;15705:74;;15788:93;15877:3;15788:93;:::i;:::-;15906:2;15901:3;15897:12;15890:19;;15549:366;;;:::o;15921:::-;16063:3;16084:67;16148:2;16143:3;16084:67;:::i;:::-;16077:74;;16160:93;16249:3;16160:93;:::i;:::-;16278:2;16273:3;16269:12;16262:19;;15921:366;;;:::o;16293:::-;16435:3;16456:67;16520:2;16515:3;16456:67;:::i;:::-;16449:74;;16532:93;16621:3;16532:93;:::i;:::-;16650:2;16645:3;16641:12;16634:19;;16293:366;;;:::o;16665:400::-;16825:3;16846:84;16928:1;16923:3;16846:84;:::i;:::-;16839:91;;16939:93;17028:3;16939:93;:::i;:::-;17057:1;17052:3;17048:11;17041:18;;16665:400;;;:::o;17071:366::-;17213:3;17234:67;17298:2;17293:3;17234:67;:::i;:::-;17227:74;;17310:93;17399:3;17310:93;:::i;:::-;17428:2;17423:3;17419:12;17412:19;;17071:366;;;:::o;17443:::-;17585:3;17606:67;17670:2;17665:3;17606:67;:::i;:::-;17599:74;;17682:93;17771:3;17682:93;:::i;:::-;17800:2;17795:3;17791:12;17784:19;;17443:366;;;:::o;17815:::-;17957:3;17978:67;18042:2;18037:3;17978:67;:::i;:::-;17971:74;;18054:93;18143:3;18054:93;:::i;:::-;18172:2;18167:3;18163:12;18156:19;;17815:366;;;:::o;18187:::-;18329:3;18350:67;18414:2;18409:3;18350:67;:::i;:::-;18343:74;;18426:93;18515:3;18426:93;:::i;:::-;18544:2;18539:3;18535:12;18528:19;;18187:366;;;:::o;18559:::-;18701:3;18722:67;18786:2;18781:3;18722:67;:::i;:::-;18715:74;;18798:93;18887:3;18798:93;:::i;:::-;18916:2;18911:3;18907:12;18900:19;;18559:366;;;:::o;18931:398::-;19090:3;19111:83;19192:1;19187:3;19111:83;:::i;:::-;19104:90;;19203:93;19292:3;19203:93;:::i;:::-;19321:1;19316:3;19312:11;19305:18;;18931:398;;;:::o;19335:366::-;19477:3;19498:67;19562:2;19557:3;19498:67;:::i;:::-;19491:74;;19574:93;19663:3;19574:93;:::i;:::-;19692:2;19687:3;19683:12;19676:19;;19335:366;;;:::o;19707:::-;19849:3;19870:67;19934:2;19929:3;19870:67;:::i;:::-;19863:74;;19946:93;20035:3;19946:93;:::i;:::-;20064:2;20059:3;20055:12;20048:19;;19707:366;;;:::o;20079:::-;20221:3;20242:67;20306:2;20301:3;20242:67;:::i;:::-;20235:74;;20318:93;20407:3;20318:93;:::i;:::-;20436:2;20431:3;20427:12;20420:19;;20079:366;;;:::o;20451:::-;20593:3;20614:67;20678:2;20673:3;20614:67;:::i;:::-;20607:74;;20690:93;20779:3;20690:93;:::i;:::-;20808:2;20803:3;20799:12;20792:19;;20451:366;;;:::o;20823:::-;20965:3;20986:67;21050:2;21045:3;20986:67;:::i;:::-;20979:74;;21062:93;21151:3;21062:93;:::i;:::-;21180:2;21175:3;21171:12;21164:19;;20823:366;;;:::o;21195:::-;21337:3;21358:67;21422:2;21417:3;21358:67;:::i;:::-;21351:74;;21434:93;21523:3;21434:93;:::i;:::-;21552:2;21547:3;21543:12;21536:19;;21195:366;;;:::o;21567:::-;21709:3;21730:67;21794:2;21789:3;21730:67;:::i;:::-;21723:74;;21806:93;21895:3;21806:93;:::i;:::-;21924:2;21919:3;21915:12;21908:19;;21567:366;;;:::o;21939:::-;22081:3;22102:67;22166:2;22161:3;22102:67;:::i;:::-;22095:74;;22178:93;22267:3;22178:93;:::i;:::-;22296:2;22291:3;22287:12;22280:19;;21939:366;;;:::o;22311:::-;22453:3;22474:67;22538:2;22533:3;22474:67;:::i;:::-;22467:74;;22550:93;22639:3;22550:93;:::i;:::-;22668:2;22663:3;22659:12;22652:19;;22311:366;;;:::o;22683:::-;22825:3;22846:67;22910:2;22905:3;22846:67;:::i;:::-;22839:74;;22922:93;23011:3;22922:93;:::i;:::-;23040:2;23035:3;23031:12;23024:19;;22683:366;;;:::o;23055:108::-;23132:24;23150:5;23132:24;:::i;:::-;23127:3;23120:37;23055:108;;:::o;23169:118::-;23256:24;23274:5;23256:24;:::i;:::-;23251:3;23244:37;23169:118;;:::o;23293:589::-;23518:3;23540:95;23631:3;23622:6;23540:95;:::i;:::-;23533:102;;23652:95;23743:3;23734:6;23652:95;:::i;:::-;23645:102;;23764:92;23852:3;23843:6;23764:92;:::i;:::-;23757:99;;23873:3;23866:10;;23293:589;;;;;;:::o;23888:695::-;24166:3;24188:95;24279:3;24270:6;24188:95;:::i;:::-;24181:102;;24300:148;24444:3;24300:148;:::i;:::-;24293:155;;24465:92;24553:3;24544:6;24465:92;:::i;:::-;24458:99;;24574:3;24567:10;;23888:695;;;;;:::o;24589:379::-;24773:3;24795:147;24938:3;24795:147;:::i;:::-;24788:154;;24959:3;24952:10;;24589:379;;;:::o;24974:222::-;25067:4;25105:2;25094:9;25090:18;25082:26;;25118:71;25186:1;25175:9;25171:17;25162:6;25118:71;:::i;:::-;24974:222;;;;:::o;25202:640::-;25397:4;25435:3;25424:9;25420:19;25412:27;;25449:71;25517:1;25506:9;25502:17;25493:6;25449:71;:::i;:::-;25530:72;25598:2;25587:9;25583:18;25574:6;25530:72;:::i;:::-;25612;25680:2;25669:9;25665:18;25656:6;25612:72;:::i;:::-;25731:9;25725:4;25721:20;25716:2;25705:9;25701:18;25694:48;25759:76;25830:4;25821:6;25759:76;:::i;:::-;25751:84;;25202:640;;;;;;;:::o;25848:373::-;25991:4;26029:2;26018:9;26014:18;26006:26;;26078:9;26072:4;26068:20;26064:1;26053:9;26049:17;26042:47;26106:108;26209:4;26200:6;26106:108;:::i;:::-;26098:116;;25848:373;;;;:::o;26227:210::-;26314:4;26352:2;26341:9;26337:18;26329:26;;26365:65;26427:1;26416:9;26412:17;26403:6;26365:65;:::i;:::-;26227:210;;;;:::o;26443:313::-;26556:4;26594:2;26583:9;26579:18;26571:26;;26643:9;26637:4;26633:20;26629:1;26618:9;26614:17;26607:47;26671:78;26744:4;26735:6;26671:78;:::i;:::-;26663:86;;26443:313;;;;:::o;26762:419::-;26928:4;26966:2;26955:9;26951:18;26943:26;;27015:9;27009:4;27005:20;27001:1;26990:9;26986:17;26979:47;27043:131;27169:4;27043:131;:::i;:::-;27035:139;;26762:419;;;:::o;27187:::-;27353:4;27391:2;27380:9;27376:18;27368:26;;27440:9;27434:4;27430:20;27426:1;27415:9;27411:17;27404:47;27468:131;27594:4;27468:131;:::i;:::-;27460:139;;27187:419;;;:::o;27612:::-;27778:4;27816:2;27805:9;27801:18;27793:26;;27865:9;27859:4;27855:20;27851:1;27840:9;27836:17;27829:47;27893:131;28019:4;27893:131;:::i;:::-;27885:139;;27612:419;;;:::o;28037:::-;28203:4;28241:2;28230:9;28226:18;28218:26;;28290:9;28284:4;28280:20;28276:1;28265:9;28261:17;28254:47;28318:131;28444:4;28318:131;:::i;:::-;28310:139;;28037:419;;;:::o;28462:::-;28628:4;28666:2;28655:9;28651:18;28643:26;;28715:9;28709:4;28705:20;28701:1;28690:9;28686:17;28679:47;28743:131;28869:4;28743:131;:::i;:::-;28735:139;;28462:419;;;:::o;28887:::-;29053:4;29091:2;29080:9;29076:18;29068:26;;29140:9;29134:4;29130:20;29126:1;29115:9;29111:17;29104:47;29168:131;29294:4;29168:131;:::i;:::-;29160:139;;28887:419;;;:::o;29312:::-;29478:4;29516:2;29505:9;29501:18;29493:26;;29565:9;29559:4;29555:20;29551:1;29540:9;29536:17;29529:47;29593:131;29719:4;29593:131;:::i;:::-;29585:139;;29312:419;;;:::o;29737:::-;29903:4;29941:2;29930:9;29926:18;29918:26;;29990:9;29984:4;29980:20;29976:1;29965:9;29961:17;29954:47;30018:131;30144:4;30018:131;:::i;:::-;30010:139;;29737:419;;;:::o;30162:::-;30328:4;30366:2;30355:9;30351:18;30343:26;;30415:9;30409:4;30405:20;30401:1;30390:9;30386:17;30379:47;30443:131;30569:4;30443:131;:::i;:::-;30435:139;;30162:419;;;:::o;30587:::-;30753:4;30791:2;30780:9;30776:18;30768:26;;30840:9;30834:4;30830:20;30826:1;30815:9;30811:17;30804:47;30868:131;30994:4;30868:131;:::i;:::-;30860:139;;30587:419;;;:::o;31012:::-;31178:4;31216:2;31205:9;31201:18;31193:26;;31265:9;31259:4;31255:20;31251:1;31240:9;31236:17;31229:47;31293:131;31419:4;31293:131;:::i;:::-;31285:139;;31012:419;;;:::o;31437:::-;31603:4;31641:2;31630:9;31626:18;31618:26;;31690:9;31684:4;31680:20;31676:1;31665:9;31661:17;31654:47;31718:131;31844:4;31718:131;:::i;:::-;31710:139;;31437:419;;;:::o;31862:::-;32028:4;32066:2;32055:9;32051:18;32043:26;;32115:9;32109:4;32105:20;32101:1;32090:9;32086:17;32079:47;32143:131;32269:4;32143:131;:::i;:::-;32135:139;;31862:419;;;:::o;32287:::-;32453:4;32491:2;32480:9;32476:18;32468:26;;32540:9;32534:4;32530:20;32526:1;32515:9;32511:17;32504:47;32568:131;32694:4;32568:131;:::i;:::-;32560:139;;32287:419;;;:::o;32712:::-;32878:4;32916:2;32905:9;32901:18;32893:26;;32965:9;32959:4;32955:20;32951:1;32940:9;32936:17;32929:47;32993:131;33119:4;32993:131;:::i;:::-;32985:139;;32712:419;;;:::o;33137:::-;33303:4;33341:2;33330:9;33326:18;33318:26;;33390:9;33384:4;33380:20;33376:1;33365:9;33361:17;33354:47;33418:131;33544:4;33418:131;:::i;:::-;33410:139;;33137:419;;;:::o;33562:::-;33728:4;33766:2;33755:9;33751:18;33743:26;;33815:9;33809:4;33805:20;33801:1;33790:9;33786:17;33779:47;33843:131;33969:4;33843:131;:::i;:::-;33835:139;;33562:419;;;:::o;33987:::-;34153:4;34191:2;34180:9;34176:18;34168:26;;34240:9;34234:4;34230:20;34226:1;34215:9;34211:17;34204:47;34268:131;34394:4;34268:131;:::i;:::-;34260:139;;33987:419;;;:::o;34412:::-;34578:4;34616:2;34605:9;34601:18;34593:26;;34665:9;34659:4;34655:20;34651:1;34640:9;34636:17;34629:47;34693:131;34819:4;34693:131;:::i;:::-;34685:139;;34412:419;;;:::o;34837:::-;35003:4;35041:2;35030:9;35026:18;35018:26;;35090:9;35084:4;35080:20;35076:1;35065:9;35061:17;35054:47;35118:131;35244:4;35118:131;:::i;:::-;35110:139;;34837:419;;;:::o;35262:::-;35428:4;35466:2;35455:9;35451:18;35443:26;;35515:9;35509:4;35505:20;35501:1;35490:9;35486:17;35479:47;35543:131;35669:4;35543:131;:::i;:::-;35535:139;;35262:419;;;:::o;35687:::-;35853:4;35891:2;35880:9;35876:18;35868:26;;35940:9;35934:4;35930:20;35926:1;35915:9;35911:17;35904:47;35968:131;36094:4;35968:131;:::i;:::-;35960:139;;35687:419;;;:::o;36112:::-;36278:4;36316:2;36305:9;36301:18;36293:26;;36365:9;36359:4;36355:20;36351:1;36340:9;36336:17;36329:47;36393:131;36519:4;36393:131;:::i;:::-;36385:139;;36112:419;;;:::o;36537:::-;36703:4;36741:2;36730:9;36726:18;36718:26;;36790:9;36784:4;36780:20;36776:1;36765:9;36761:17;36754:47;36818:131;36944:4;36818:131;:::i;:::-;36810:139;;36537:419;;;:::o;36962:::-;37128:4;37166:2;37155:9;37151:18;37143:26;;37215:9;37209:4;37205:20;37201:1;37190:9;37186:17;37179:47;37243:131;37369:4;37243:131;:::i;:::-;37235:139;;36962:419;;;:::o;37387:::-;37553:4;37591:2;37580:9;37576:18;37568:26;;37640:9;37634:4;37630:20;37626:1;37615:9;37611:17;37604:47;37668:131;37794:4;37668:131;:::i;:::-;37660:139;;37387:419;;;:::o;37812:::-;37978:4;38016:2;38005:9;38001:18;37993:26;;38065:9;38059:4;38055:20;38051:1;38040:9;38036:17;38029:47;38093:131;38219:4;38093:131;:::i;:::-;38085:139;;37812:419;;;:::o;38237:::-;38403:4;38441:2;38430:9;38426:18;38418:26;;38490:9;38484:4;38480:20;38476:1;38465:9;38461:17;38454:47;38518:131;38644:4;38518:131;:::i;:::-;38510:139;;38237:419;;;:::o;38662:222::-;38755:4;38793:2;38782:9;38778:18;38770:26;;38806:71;38874:1;38863:9;38859:17;38850:6;38806:71;:::i;:::-;38662:222;;;;:::o;38890:129::-;38924:6;38951:20;;:::i;:::-;38941:30;;38980:33;39008:4;39000:6;38980:33;:::i;:::-;38890:129;;;:::o;39025:75::-;39058:6;39091:2;39085:9;39075:19;;39025:75;:::o;39106:307::-;39167:4;39257:18;39249:6;39246:30;39243:56;;;39279:18;;:::i;:::-;39243:56;39317:29;39339:6;39317:29;:::i;:::-;39309:37;;39401:4;39395;39391:15;39383:23;;39106:307;;;:::o;39419:308::-;39481:4;39571:18;39563:6;39560:30;39557:56;;;39593:18;;:::i;:::-;39557:56;39631:29;39653:6;39631:29;:::i;:::-;39623:37;;39715:4;39709;39705:15;39697:23;;39419:308;;;:::o;39733:132::-;39800:4;39823:3;39815:11;;39853:4;39848:3;39844:14;39836:22;;39733:132;;;:::o;39871:141::-;39920:4;39943:3;39935:11;;39966:3;39963:1;39956:14;40000:4;39997:1;39987:18;39979:26;;39871:141;;;:::o;40018:114::-;40085:6;40119:5;40113:12;40103:22;;40018:114;;;:::o;40138:98::-;40189:6;40223:5;40217:12;40207:22;;40138:98;;;:::o;40242:99::-;40294:6;40328:5;40322:12;40312:22;;40242:99;;;:::o;40347:113::-;40417:4;40449;40444:3;40440:14;40432:22;;40347:113;;;:::o;40466:184::-;40565:11;40599:6;40594:3;40587:19;40639:4;40634:3;40630:14;40615:29;;40466:184;;;;:::o;40656:168::-;40739:11;40773:6;40768:3;40761:19;40813:4;40808:3;40804:14;40789:29;;40656:168;;;;:::o;40830:147::-;40931:11;40968:3;40953:18;;40830:147;;;;:::o;40983:169::-;41067:11;41101:6;41096:3;41089:19;41141:4;41136:3;41132:14;41117:29;;40983:169;;;;:::o;41158:148::-;41260:11;41297:3;41282:18;;41158:148;;;;:::o;41312:273::-;41352:3;41371:20;41389:1;41371:20;:::i;:::-;41366:25;;41405:20;41423:1;41405:20;:::i;:::-;41400:25;;41527:1;41491:34;41487:42;41484:1;41481:49;41478:75;;;41533:18;;:::i;:::-;41478:75;41577:1;41574;41570:9;41563:16;;41312:273;;;;:::o;41591:305::-;41631:3;41650:20;41668:1;41650:20;:::i;:::-;41645:25;;41684:20;41702:1;41684:20;:::i;:::-;41679:25;;41838:1;41770:66;41766:74;41763:1;41760:81;41757:107;;;41844:18;;:::i;:::-;41757:107;41888:1;41885;41881:9;41874:16;;41591:305;;;;:::o;41902:185::-;41942:1;41959:20;41977:1;41959:20;:::i;:::-;41954:25;;41993:20;42011:1;41993:20;:::i;:::-;41988:25;;42032:1;42022:35;;42037:18;;:::i;:::-;42022:35;42079:1;42076;42072:9;42067:14;;41902:185;;;;:::o;42093:348::-;42133:7;42156:20;42174:1;42156:20;:::i;:::-;42151:25;;42190:20;42208:1;42190:20;:::i;:::-;42185:25;;42378:1;42310:66;42306:74;42303:1;42300:81;42295:1;42288:9;42281:17;42277:105;42274:131;;;42385:18;;:::i;:::-;42274:131;42433:1;42430;42426:9;42415:20;;42093:348;;;;:::o;42447:191::-;42487:4;42507:20;42525:1;42507:20;:::i;:::-;42502:25;;42541:20;42559:1;42541:20;:::i;:::-;42536:25;;42580:1;42577;42574:8;42571:34;;;42585:18;;:::i;:::-;42571:34;42630:1;42627;42623:9;42615:17;;42447:191;;;;:::o;42644:::-;42684:4;42704:20;42722:1;42704:20;:::i;:::-;42699:25;;42738:20;42756:1;42738:20;:::i;:::-;42733:25;;42777:1;42774;42771:8;42768:34;;;42782:18;;:::i;:::-;42768:34;42827:1;42824;42820:9;42812:17;;42644:191;;;;:::o;42841:96::-;42878:7;42907:24;42925:5;42907:24;:::i;:::-;42896:35;;42841:96;;;:::o;42943:90::-;42977:7;43020:5;43013:13;43006:21;42995:32;;42943:90;;;:::o;43039:149::-;43075:7;43115:66;43108:5;43104:78;43093:89;;43039:149;;;:::o;43194:118::-;43231:7;43271:34;43264:5;43260:46;43249:57;;43194:118;;;:::o;43318:126::-;43355:7;43395:42;43388:5;43384:54;43373:65;;43318:126;;;:::o;43450:77::-;43487:7;43516:5;43505:16;;43450:77;;;:::o;43533:154::-;43617:6;43612:3;43607;43594:30;43679:1;43670:6;43665:3;43661:16;43654:27;43533:154;;;:::o;43693:307::-;43761:1;43771:113;43785:6;43782:1;43779:13;43771:113;;;43870:1;43865:3;43861:11;43855:18;43851:1;43846:3;43842:11;43835:39;43807:2;43804:1;43800:10;43795:15;;43771:113;;;43902:6;43899:1;43896:13;43893:101;;;43982:1;43973:6;43968:3;43964:16;43957:27;43893:101;43742:258;43693:307;;;:::o;44006:171::-;44045:3;44068:24;44086:5;44068:24;:::i;:::-;44059:33;;44114:4;44107:5;44104:15;44101:41;;;44122:18;;:::i;:::-;44101:41;44169:1;44162:5;44158:13;44151:20;;44006:171;;;:::o;44183:320::-;44227:6;44264:1;44258:4;44254:12;44244:22;;44311:1;44305:4;44301:12;44332:18;44322:81;;44388:4;44380:6;44376:17;44366:27;;44322:81;44450:2;44442:6;44439:14;44419:18;44416:38;44413:84;;;44469:18;;:::i;:::-;44413:84;44234:269;44183:320;;;:::o;44509:281::-;44592:27;44614:4;44592:27;:::i;:::-;44584:6;44580:40;44722:6;44710:10;44707:22;44686:18;44674:10;44671:34;44668:62;44665:88;;;44733:18;;:::i;:::-;44665:88;44773:10;44769:2;44762:22;44552:238;44509:281;;:::o;44796:233::-;44835:3;44858:24;44876:5;44858:24;:::i;:::-;44849:33;;44904:66;44897:5;44894:77;44891:103;;;44974:18;;:::i;:::-;44891:103;45021:1;45014:5;45010:13;45003:20;;44796:233;;;:::o;45035:176::-;45067:1;45084:20;45102:1;45084:20;:::i;:::-;45079:25;;45118:20;45136:1;45118:20;:::i;:::-;45113:25;;45157:1;45147:35;;45162:18;;:::i;:::-;45147:35;45203:1;45200;45196:9;45191:14;;45035:176;;;;:::o;45217:180::-;45265:77;45262:1;45255:88;45362:4;45359:1;45352:15;45386:4;45383:1;45376:15;45403:180;45451:77;45448:1;45441:88;45548:4;45545:1;45538:15;45572:4;45569:1;45562:15;45589:180;45637:77;45634:1;45627:88;45734:4;45731:1;45724:15;45758:4;45755:1;45748:15;45775:180;45823:77;45820:1;45813:88;45920:4;45917:1;45910:15;45944:4;45941:1;45934:15;45961:180;46009:77;46006:1;45999:88;46106:4;46103:1;46096:15;46130:4;46127:1;46120:15;46147:117;46256:1;46253;46246:12;46270:117;46379:1;46376;46369:12;46393:117;46502:1;46499;46492:12;46516:117;46625:1;46622;46615:12;46639:117;46748:1;46745;46738:12;46762:117;46871:1;46868;46861:12;46885:102;46926:6;46977:2;46973:7;46968:2;46961:5;46957:14;46953:28;46943:38;;46885:102;;;:::o;46993:221::-;47133:34;47129:1;47121:6;47117:14;47110:58;47202:4;47197:2;47189:6;47185:15;47178:29;46993:221;:::o;47220:225::-;47360:34;47356:1;47348:6;47344:14;47337:58;47429:8;47424:2;47416:6;47412:15;47405:33;47220:225;:::o;47451:229::-;47591:34;47587:1;47579:6;47575:14;47568:58;47660:12;47655:2;47647:6;47643:15;47636:37;47451:229;:::o;47686:177::-;47826:29;47822:1;47814:6;47810:14;47803:53;47686:177;:::o;47869:178::-;48009:30;48005:1;47997:6;47993:14;47986:54;47869:178;:::o;48053:222::-;48193:34;48189:1;48181:6;48177:14;48170:58;48262:5;48257:2;48249:6;48245:15;48238:30;48053:222;:::o;48281:224::-;48421:34;48417:1;48409:6;48405:14;48398:58;48490:7;48485:2;48477:6;48473:15;48466:32;48281:224;:::o;48511:244::-;48651:34;48647:1;48639:6;48635:14;48628:58;48720:27;48715:2;48707:6;48703:15;48696:52;48511:244;:::o;48761:172::-;48901:24;48897:1;48889:6;48885:14;48878:48;48761:172;:::o;48939:223::-;49079:34;49075:1;49067:6;49063:14;49056:58;49148:6;49143:2;49135:6;49131:15;49124:31;48939:223;:::o;49168:230::-;49308:34;49304:1;49296:6;49292:14;49285:58;49377:13;49372:2;49364:6;49360:15;49353:38;49168:230;:::o;49404:225::-;49544:34;49540:1;49532:6;49528:14;49521:58;49613:8;49608:2;49600:6;49596:15;49589:33;49404:225;:::o;49635:182::-;49775:34;49771:1;49763:6;49759:14;49752:58;49635:182;:::o;49823:156::-;49963:8;49959:1;49951:6;49947:14;49940:32;49823:156;:::o;49985:172::-;50125:24;50121:1;50113:6;50109:14;50102:48;49985:172;:::o;50163:234::-;50303:34;50299:1;50291:6;50287:14;50280:58;50372:17;50367:2;50359:6;50355:15;50348:42;50163:234;:::o;50403:176::-;50543:28;50539:1;50531:6;50527:14;50520:52;50403:176;:::o;50585:237::-;50725:34;50721:1;50713:6;50709:14;50702:58;50794:20;50789:2;50781:6;50777:15;50770:45;50585:237;:::o;50828:221::-;50968:34;50964:1;50956:6;50952:14;50945:58;51037:4;51032:2;51024:6;51020:15;51013:29;50828:221;:::o;51055:114::-;;:::o;51175:168::-;51315:20;51311:1;51303:6;51299:14;51292:44;51175:168;:::o;51349:238::-;51489:34;51485:1;51477:6;51473:14;51466:58;51558:21;51553:2;51545:6;51541:15;51534:46;51349:238;:::o;51593:179::-;51733:31;51729:1;51721:6;51717:14;51710:55;51593:179;:::o;51778:220::-;51918:34;51914:1;51906:6;51902:14;51895:58;51987:3;51982:2;51974:6;51970:15;51963:28;51778:220;:::o;52004:233::-;52144:34;52140:1;52132:6;52128:14;52121:58;52213:16;52208:2;52200:6;52196:15;52189:41;52004:233;:::o;52243:173::-;52383:25;52379:1;52371:6;52367:14;52360:49;52243:173;:::o;52422:234::-;52562:34;52558:1;52550:6;52546:14;52539:58;52631:17;52626:2;52618:6;52614:15;52607:42;52422:234;:::o;52662:232::-;52802:34;52798:1;52790:6;52786:14;52779:58;52871:15;52866:2;52858:6;52854:15;52847:40;52662:232;:::o;52900:177::-;53040:29;53036:1;53028:6;53024:14;53017:53;52900:177;:::o;53083:221::-;53223:34;53219:1;53211:6;53207:14;53200:58;53292:4;53287:2;53279:6;53275:15;53268:29;53083:221;:::o;53310:122::-;53383:24;53401:5;53383:24;:::i;:::-;53376:5;53373:35;53363:63;;53422:1;53419;53412:12;53363:63;53310:122;:::o;53438:116::-;53508:21;53523:5;53508:21;:::i;:::-;53501:5;53498:32;53488:60;;53544:1;53541;53534:12;53488:60;53438:116;:::o;53560:120::-;53632:23;53649:5;53632:23;:::i;:::-;53625:5;53622:34;53612:62;;53670:1;53667;53660:12;53612:62;53560:120;:::o;53686:122::-;53759:24;53777:5;53759:24;:::i;:::-;53752:5;53749:35;53739:63;;53798:1;53795;53788:12;53739:63;53686:122;:::o

Swarm Source

ipfs://4a28f57ceb63febcad1edd61ebe2ebdd14f790ac7833633091610ed4d85308ff
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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