ETH Price: $2,394.43 (-3.02%)
Gas: 7.85 Gwei
 

Overview

Max Total Supply

1,056 CryptoPirds

Holders

896

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 CryptoPirds
0x91a5334135e54dc4f2855a0f146f2ecd3c3730bd
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:
CryptoPirds

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// 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/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: contracts/new.sol




pragma solidity ^0.8.4;








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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

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);
    }
}
pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}
pragma solidity ^0.8.13;



abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !(
                    operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)
                        && operatorFilterRegistry.isOperatorAllowed(address(this), from)
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}
pragma solidity ^0.8.13;



abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
    pragma solidity ^0.8.7;
    
    contract CryptoPirds is ERC721A,DefaultOperatorFilterer , Ownable {
    using Strings for uint256;


  string private uriPrefix = "ipfs://bafybeih6kcr2uzb4mwqba56yao4jyzwyadmfuk7l3cwsp37bzszozgj6j4/";
  string private uriSuffix = ".json";

  uint256 public cost = 0.001 ether;  
  uint16 public maxSupply = 1000;
  uint8 public maxMintAmountPerTx = 10;
  uint8 public maxMintAmountPerWallet = 10;
  uint8 public maxFreeMintAmountPerWallet = 1;

  mapping (address => uint8) public NFTPerPublicAddress;
 
  constructor() ERC721A("C r y p t o P i r d s", "CryptoPirds") {
  }

  function Mint(uint8 _mintAmount) external payable  {
     uint16 totalSupply = uint16(totalSupply());
     uint8 nft = NFTPerPublicAddress[msg.sender];
    require(totalSupply + _mintAmount <= maxSupply, "Exceeds max supply.");
    require(_mintAmount + nft <= maxMintAmountPerWallet, "Exceeds max per Wallet.");
    require(_mintAmount  <= maxMintAmountPerTx, "Exceeds max per Wallet.");
    
      if(nft >= maxFreeMintAmountPerWallet)
    {
    require(msg.value >= cost * _mintAmount, "Insufficient funds!");
    }
    else {
         uint8 costAmount = _mintAmount + nft;
        if(costAmount > maxFreeMintAmountPerWallet)
       {
        costAmount = costAmount - maxFreeMintAmountPerWallet;
        require(msg.value >= cost * costAmount, "Insufficient funds!");
       }
       
         
    }
    
    _safeMint(msg.sender , _mintAmount);

    NFTPerPublicAddress[msg.sender] = _mintAmount + nft;
     
     delete totalSupply;
     delete _mintAmount;
  }
  
  function Reserve(uint16 _mintAmount, address _receiver) external onlyOwner {
     uint16 totalSupply = uint16(totalSupply());
    require(totalSupply + _mintAmount <= maxSupply, "Exceeds max supply.");
     _safeMint(_receiver , _mintAmount);
     delete _mintAmount;
     delete _receiver;
     delete totalSupply;
  }

  function setMaxSupply(uint16 _maxSupply) external onlyOwner {
      maxSupply = _maxSupply;
  }
  
  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );    

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

  function setFreeMaxLimitPerAddress(uint8 _limit) external onlyOwner{
    maxFreeMintAmountPerWallet = _limit;
    delete _limit;
  }

  function setUriPrefix(string memory _uriPrefix) external onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setCost(uint _cost) external onlyOwner{
      cost = _cost;
  }

  function setMaxMintAmountPerTx(uint8 _maxtx) external onlyOwner{
      maxMintAmountPerTx = _maxtx;
  }
  
  function setMaxMintAmountPerWallet(uint8 _maxtx) external onlyOwner{
      maxMintAmountPerWallet = _maxtx;
  }

  function withdraw() external onlyOwner {
  uint _balance = address(this).balance;
     payable(msg.sender).transfer(_balance );       
  }

  function _baseURI() internal view  override returns (string memory) {
    return uriPrefix;
  }
   
    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"NFTPerPublicAddress","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_mintAmount","type":"uint16"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"Reserve","outputs":[],"stateMutability":"nonpayable","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":"cost","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":[],"name":"maxFreeMintAmountPerWallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerWallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_limit","type":"uint8"}],"name":"setFreeMaxLimitPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxtx","type":"uint8"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxtx","type":"uint8"}],"name":"setMaxMintAmountPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxSupply","type":"uint16"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060800160405280604381526020016200486d604391396009908051906020019062000035929190620004cd565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a908051906020019062000083929190620004cd565b5066038d7ea4c68000600b556103e8600c60006101000a81548161ffff021916908361ffff160217905550600a600c60026101000a81548160ff021916908360ff160217905550600a600c60036101000a81548160ff021916908360ff1602179055506001600c60046101000a81548160ff021916908360ff1602179055503480156200010f57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601581526020017f432072207920702074206f2050206920722064207300000000000000000000008152506040518060400160405280600b81526020017f43727970746f50697264730000000000000000000000000000000000000000008152508160029080519060200190620001ab929190620004cd565b508060039080519060200190620001c4929190620004cd565b50620001d5620003fa60201b60201c565b600081905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003d257801562000298576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200025e929190620005c2565b600060405180830381600087803b1580156200027957600080fd5b505af11580156200028e573d6000803e3d6000fd5b50505050620003d1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000352576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b815260040162000318929190620005c2565b600060405180830381600087803b1580156200033357600080fd5b505af115801562000348573d6000803e3d6000fd5b50505050620003d0565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200039b9190620005ef565b600060405180830381600087803b158015620003b657600080fd5b505af1158015620003cb573d6000803e3d6000fd5b505050505b5b5b5050620003f4620003e8620003ff60201b60201c565b6200040760201b60201c565b62000670565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004db906200063b565b90600052602060002090601f016020900481019282620004ff57600085556200054b565b82601f106200051a57805160ff19168380011785556200054b565b828001600101855582156200054b579182015b828111156200054a5782518255916020019190600101906200052d565b5b5090506200055a91906200055e565b5090565b5b80821115620005795760008160009055506001016200055f565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005aa826200057d565b9050919050565b620005bc816200059d565b82525050565b6000604082019050620005d96000830185620005b1565b620005e86020830184620005b1565b9392505050565b6000602082019050620006066000830184620005b1565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200065457607f821691505b6020821081036200066a57620006696200060c565b5b50919050565b6141ed80620006806000396000f3fe6080604052600436106101e35760003560e01c8063715018a611610102578063b88d4fde11610095578063e94053c711610064578063e94053c7146106a7578063e985e9c5146106e4578063f2fde38b14610721578063f8bf51721461074a576101e3565b8063b88d4fde146105eb578063bc951b9114610614578063c87b56dd1461063f578063d5abeb011461067c576101e3565b806395d89b41116100d157806395d89b4114610552578063a22cb4651461057d578063a2522d2d146105a6578063aa062290146105c2576101e3565b8063715018a6146104bc5780637ec4a659146104d35780638da5cb5b146104fc57806394354fd014610527576101e3565b806328b60d151161017a57806344a0d68a1161014957806344a0d68a146103f05780634d9c1848146104195780636352211e1461044257806370a082311461047f576101e3565b806328b60d151461035e5780632f6f98e1146103875780633ccfd60b146103b057806342842e0e146103c7576101e3565b8063095ea7b3116101b6578063095ea7b3146102b657806313faede6146102df57806318160ddd1461030a57806323b872dd14610335576101e3565b806301ffc9a7146101e857806306421c2f1461022557806306fdde031461024e578063081812fc14610279575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906131d4565b610775565b60405161021c919061321c565b60405180910390f35b34801561023157600080fd5b5061024c60048036038101906102479190613271565b610857565b005b34801561025a57600080fd5b506102636108f3565b6040516102709190613337565b60405180910390f35b34801561028557600080fd5b506102a0600480360381019061029b919061338f565b610985565b6040516102ad91906133fd565b60405180910390f35b3480156102c257600080fd5b506102dd60048036038101906102d89190613444565b610a01565b005b3480156102eb57600080fd5b506102f4610b0b565b6040516103019190613493565b60405180910390f35b34801561031657600080fd5b5061031f610b11565b60405161032c9190613493565b60405180910390f35b34801561034157600080fd5b5061035c600480360381019061035791906134ae565b610b28565b005b34801561036a57600080fd5b506103856004803603810190610380919061353a565b610d0a565b005b34801561039357600080fd5b506103ae60048036038101906103a99190613567565b610da4565b005b3480156103bc57600080fd5b506103c5610eb1565b005b3480156103d357600080fd5b506103ee60048036038101906103e991906134ae565b610f7c565b005b3480156103fc57600080fd5b506104176004803603810190610412919061338f565b61115e565b005b34801561042557600080fd5b50610440600480360381019061043b919061353a565b6111e4565b005b34801561044e57600080fd5b506104696004803603810190610464919061338f565b611282565b60405161047691906133fd565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a191906135a7565b611298565b6040516104b39190613493565b60405180910390f35b3480156104c857600080fd5b506104d1611367565b005b3480156104df57600080fd5b506104fa60048036038101906104f59190613709565b6113ef565b005b34801561050857600080fd5b50610511611485565b60405161051e91906133fd565b60405180910390f35b34801561053357600080fd5b5061053c6114af565b6040516105499190613761565b60405180910390f35b34801561055e57600080fd5b506105676114c2565b6040516105749190613337565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f91906137a8565b611554565b005b6105c060048036038101906105bb919061353a565b6116cb565b005b3480156105ce57600080fd5b506105e960048036038101906105e4919061353a565b6119dd565b005b3480156105f757600080fd5b50610612600480360381019061060d9190613889565b611a77565b005b34801561062057600080fd5b50610629611c5c565b6040516106369190613761565b60405180910390f35b34801561064b57600080fd5b506106666004803603810190610661919061338f565b611c6f565b6040516106739190613337565b60405180910390f35b34801561068857600080fd5b50610691611d19565b60405161069e919061391b565b60405180910390f35b3480156106b357600080fd5b506106ce60048036038101906106c991906135a7565b611d2d565b6040516106db9190613761565b60405180910390f35b3480156106f057600080fd5b5061070b60048036038101906107069190613936565b611d4d565b604051610718919061321c565b60405180910390f35b34801561072d57600080fd5b50610748600480360381019061074391906135a7565b611de1565b005b34801561075657600080fd5b5061075f611ed8565b60405161076c9190613761565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610850575061084f82611eeb565b5b9050919050565b61085f611f55565b73ffffffffffffffffffffffffffffffffffffffff1661087d611485565b73ffffffffffffffffffffffffffffffffffffffff16146108d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca906139c2565b60405180910390fd5b80600c60006101000a81548161ffff021916908361ffff16021790555050565b60606002805461090290613a11565b80601f016020809104026020016040519081016040528092919081815260200182805461092e90613a11565b801561097b5780601f106109505761010080835404028352916020019161097b565b820191906000526020600020905b81548152906001019060200180831161095e57829003601f168201915b5050505050905090565b600061099082611f5d565b6109c6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a0c82611282565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a73576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a92611f55565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ac45750610ac281610abd611f55565b611d4d565b155b15610afb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b06838383611fab565b505050565b600b5481565b6000610b1b61205d565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610cf8573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b9a57610b95848484612062565b610d04565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610be3929190613a42565b602060405180830381865afa158015610c00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c249190613a80565b8015610cb657506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610c74929190613a42565b602060405180830381865afa158015610c91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb59190613a80565b5b610cf757336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610cee91906133fd565b60405180910390fd5b5b610d03848484612062565b5b50505050565b610d12611f55565b73ffffffffffffffffffffffffffffffffffffffff16610d30611485565b73ffffffffffffffffffffffffffffffffffffffff1614610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d906139c2565b60405180910390fd5b80600c60036101000a81548160ff021916908360ff16021790555050565b610dac611f55565b73ffffffffffffffffffffffffffffffffffffffff16610dca611485565b73ffffffffffffffffffffffffffffffffffffffff1614610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e17906139c2565b60405180910390fd5b6000610e2a610b11565b9050600c60009054906101000a900461ffff1661ffff168382610e4d9190613adc565b61ffff161115610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8990613b60565b60405180910390fd5b610ea0828461ffff16612072565b600092506000915060009050505050565b610eb9611f55565b73ffffffffffffffffffffffffffffffffffffffff16610ed7611485565b73ffffffffffffffffffffffffffffffffffffffff1614610f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f24906139c2565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f78573d6000803e3d6000fd5b5050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561114c573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fee57610fe9848484612090565b611158565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611037929190613a42565b602060405180830381865afa158015611054573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110789190613a80565b801561110a57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016110c8929190613a42565b602060405180830381865afa1580156110e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111099190613a80565b5b61114b57336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161114291906133fd565b60405180910390fd5b5b611157848484612090565b5b50505050565b611166611f55565b73ffffffffffffffffffffffffffffffffffffffff16611184611485565b73ffffffffffffffffffffffffffffffffffffffff16146111da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d1906139c2565b60405180910390fd5b80600b8190555050565b6111ec611f55565b73ffffffffffffffffffffffffffffffffffffffff1661120a611485565b73ffffffffffffffffffffffffffffffffffffffff1614611260576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611257906139c2565b60405180910390fd5b80600c60046101000a81548160ff021916908360ff1602179055506000905050565b600061128d826120b0565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112ff576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61136f611f55565b73ffffffffffffffffffffffffffffffffffffffff1661138d611485565b73ffffffffffffffffffffffffffffffffffffffff16146113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da906139c2565b60405180910390fd5b6113ed600061233f565b565b6113f7611f55565b73ffffffffffffffffffffffffffffffffffffffff16611415611485565b73ffffffffffffffffffffffffffffffffffffffff161461146b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611462906139c2565b60405180910390fd5b8060099080519060200190611481929190613082565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60029054906101000a900460ff1681565b6060600380546114d190613a11565b80601f01602080910402602001604051908101604052809291908181526020018280546114fd90613a11565b801561154a5780601f1061151f5761010080835404028352916020019161154a565b820191906000526020600020905b81548152906001019060200180831161152d57829003601f168201915b5050505050905090565b61155c611f55565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115c0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006115cd611f55565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661167a611f55565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116bf919061321c565b60405180910390a35050565b60006116d5610b11565b90506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600c60009054906101000a900461ffff1661ffff168360ff168361174c9190613adc565b61ffff161115611791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178890613b60565b60405180910390fd5b600c60039054906101000a900460ff1660ff1681846117b09190613b80565b60ff1611156117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb90613c03565b60405180910390fd5b600c60029054906101000a900460ff1660ff168360ff16111561184c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184390613c03565b60405180910390fd5b600c60049054906101000a900460ff1660ff168160ff16106118c0578260ff16600b546118799190613c23565b3410156118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b290613cc9565b60405180910390fd5b611960565b600081846118ce9190613b80565b9050600c60049054906101000a900460ff1660ff168160ff16111561195e57600c60049054906101000a900460ff16816119089190613ce9565b90508060ff16600b5461191b9190613c23565b34101561195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195490613cc9565b60405180910390fd5b5b505b61196d338460ff16612072565b80836119799190613b80565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000915060009250505050565b6119e5611f55565b73ffffffffffffffffffffffffffffffffffffffff16611a03611485565b73ffffffffffffffffffffffffffffffffffffffff1614611a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a50906139c2565b60405180910390fd5b80600c60026101000a81548160ff021916908360ff16021790555050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c48573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611aea57611ae585858585612405565b611c55565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611b33929190613a42565b602060405180830381865afa158015611b50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b749190613a80565b8015611c0657506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611bc4929190613a42565b602060405180830381865afa158015611be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c059190613a80565b5b611c4757336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c3e91906133fd565b60405180910390fd5b5b611c5485858585612405565b5b5050505050565b600c60039054906101000a900460ff1681565b6060611c7a82611f5d565b611cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb090613d8f565b60405180910390fd5b6000611cc3612481565b90506000815111611ce35760405180602001604052806000815250611d11565b80611ced84612513565b600a604051602001611d0193929190613e7f565b6040516020818303038152906040525b915050919050565b600c60009054906101000a900461ffff1681565b600d6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611de9611f55565b73ffffffffffffffffffffffffffffffffffffffff16611e07611485565b73ffffffffffffffffffffffffffffffffffffffff1614611e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e54906139c2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec390613f22565b60405180910390fd5b611ed58161233f565b50565b600c60049054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081611f6861205d565b11158015611f77575060005482105b8015611fa4575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b61206d838383612673565b505050565b61208c828260405180602001604052806000815250612b27565b5050565b6120ab83838360405180602001604052806000815250611a77565b505050565b6120b8613108565b6000829050806120c661205d565b111580156120d5575060005481105b15612308576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161230657600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121ea57809250505061233a565b5b60011561230557818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461230057809250505061233a565b6121eb565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612410848484612673565b61242f8373ffffffffffffffffffffffffffffffffffffffff16612b39565b8015612444575061244284848484612b5c565b155b1561247b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606009805461249090613a11565b80601f01602080910402602001604051908101604052809291908181526020018280546124bc90613a11565b80156125095780601f106124de57610100808354040283529160200191612509565b820191906000526020600020905b8154815290600101906020018083116124ec57829003601f168201915b5050505050905090565b60606000820361255a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061266e565b600082905060005b6000821461258c57808061257590613f42565b915050600a826125859190613fb9565b9150612562565b60008167ffffffffffffffff8111156125a8576125a76135de565b5b6040519080825280601f01601f1916602001820160405280156125da5781602001600182028036833780820191505090505b5090505b60008514612667576001826125f39190613fea565b9150600a85612602919061401e565b603061260e919061404f565b60f81b818381518110612624576126236140a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126609190613fb9565b94506125de565b8093505050505b919050565b600061267e826120b0565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126e9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661270a611f55565b73ffffffffffffffffffffffffffffffffffffffff161480612739575061273885612733611f55565b611d4d565b5b8061277e5750612747611f55565b73ffffffffffffffffffffffffffffffffffffffff1661276684610985565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806127b7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361281d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61282a8585856001612cac565b61283660008487611fab565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612ab5576000548214612ab457878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b208585856001612cb2565b5050505050565b612b348383836001612cb8565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b82611f55565b8786866040518563ffffffff1660e01b8152600401612ba49493929190614129565b6020604051808303816000875af1925050508015612be057506040513d601f19601f82011682018060405250810190612bdd919061418a565b60015b612c59573d8060008114612c10576040519150601f19603f3d011682016040523d82523d6000602084013e612c15565b606091505b506000815103612c51576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612d24576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612d5e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d6b6000868387612cac565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612f355750612f348773ffffffffffffffffffffffffffffffffffffffff16612b39565b5b15612ffa575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612faa6000888480600101955088612b5c565b612fe0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612f3b578260005414612ff557600080fd5b613065565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612ffb575b81600081905550505061307b6000868387612cb2565b5050505050565b82805461308e90613a11565b90600052602060002090601f0160209004810192826130b057600085556130f7565b82601f106130c957805160ff19168380011785556130f7565b828001600101855582156130f7579182015b828111156130f65782518255916020019190600101906130db565b5b509050613104919061314b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561316457600081600090555060010161314c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131b18161317c565b81146131bc57600080fd5b50565b6000813590506131ce816131a8565b92915050565b6000602082840312156131ea576131e9613172565b5b60006131f8848285016131bf565b91505092915050565b60008115159050919050565b61321681613201565b82525050565b6000602082019050613231600083018461320d565b92915050565b600061ffff82169050919050565b61324e81613237565b811461325957600080fd5b50565b60008135905061326b81613245565b92915050565b60006020828403121561328757613286613172565b5b60006132958482850161325c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132d85780820151818401526020810190506132bd565b838111156132e7576000848401525b50505050565b6000601f19601f8301169050919050565b60006133098261329e565b61331381856132a9565b93506133238185602086016132ba565b61332c816132ed565b840191505092915050565b6000602082019050818103600083015261335181846132fe565b905092915050565b6000819050919050565b61336c81613359565b811461337757600080fd5b50565b60008135905061338981613363565b92915050565b6000602082840312156133a5576133a4613172565b5b60006133b38482850161337a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133e7826133bc565b9050919050565b6133f7816133dc565b82525050565b600060208201905061341260008301846133ee565b92915050565b613421816133dc565b811461342c57600080fd5b50565b60008135905061343e81613418565b92915050565b6000806040838503121561345b5761345a613172565b5b60006134698582860161342f565b925050602061347a8582860161337a565b9150509250929050565b61348d81613359565b82525050565b60006020820190506134a86000830184613484565b92915050565b6000806000606084860312156134c7576134c6613172565b5b60006134d58682870161342f565b93505060206134e68682870161342f565b92505060406134f78682870161337a565b9150509250925092565b600060ff82169050919050565b61351781613501565b811461352257600080fd5b50565b6000813590506135348161350e565b92915050565b6000602082840312156135505761354f613172565b5b600061355e84828501613525565b91505092915050565b6000806040838503121561357e5761357d613172565b5b600061358c8582860161325c565b925050602061359d8582860161342f565b9150509250929050565b6000602082840312156135bd576135bc613172565b5b60006135cb8482850161342f565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613616826132ed565b810181811067ffffffffffffffff82111715613635576136346135de565b5b80604052505050565b6000613648613168565b9050613654828261360d565b919050565b600067ffffffffffffffff821115613674576136736135de565b5b61367d826132ed565b9050602081019050919050565b82818337600083830152505050565b60006136ac6136a784613659565b61363e565b9050828152602081018484840111156136c8576136c76135d9565b5b6136d384828561368a565b509392505050565b600082601f8301126136f0576136ef6135d4565b5b8135613700848260208601613699565b91505092915050565b60006020828403121561371f5761371e613172565b5b600082013567ffffffffffffffff81111561373d5761373c613177565b5b613749848285016136db565b91505092915050565b61375b81613501565b82525050565b60006020820190506137766000830184613752565b92915050565b61378581613201565b811461379057600080fd5b50565b6000813590506137a28161377c565b92915050565b600080604083850312156137bf576137be613172565b5b60006137cd8582860161342f565b92505060206137de85828601613793565b9150509250929050565b600067ffffffffffffffff821115613803576138026135de565b5b61380c826132ed565b9050602081019050919050565b600061382c613827846137e8565b61363e565b905082815260208101848484011115613848576138476135d9565b5b61385384828561368a565b509392505050565b600082601f8301126138705761386f6135d4565b5b8135613880848260208601613819565b91505092915050565b600080600080608085870312156138a3576138a2613172565b5b60006138b18782880161342f565b94505060206138c28782880161342f565b93505060406138d38782880161337a565b925050606085013567ffffffffffffffff8111156138f4576138f3613177565b5b6139008782880161385b565b91505092959194509250565b61391581613237565b82525050565b6000602082019050613930600083018461390c565b92915050565b6000806040838503121561394d5761394c613172565b5b600061395b8582860161342f565b925050602061396c8582860161342f565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139ac6020836132a9565b91506139b782613976565b602082019050919050565b600060208201905081810360008301526139db8161399f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a2957607f821691505b602082108103613a3c57613a3b6139e2565b5b50919050565b6000604082019050613a5760008301856133ee565b613a6460208301846133ee565b9392505050565b600081519050613a7a8161377c565b92915050565b600060208284031215613a9657613a95613172565b5b6000613aa484828501613a6b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ae782613237565b9150613af283613237565b92508261ffff03821115613b0957613b08613aad565b5b828201905092915050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b6000613b4a6013836132a9565b9150613b5582613b14565b602082019050919050565b60006020820190508181036000830152613b7981613b3d565b9050919050565b6000613b8b82613501565b9150613b9683613501565b92508260ff03821115613bac57613bab613aad565b5b828201905092915050565b7f45786365656473206d6178207065722057616c6c65742e000000000000000000600082015250565b6000613bed6017836132a9565b9150613bf882613bb7565b602082019050919050565b60006020820190508181036000830152613c1c81613be0565b9050919050565b6000613c2e82613359565b9150613c3983613359565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c7257613c71613aad565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613cb36013836132a9565b9150613cbe82613c7d565b602082019050919050565b60006020820190508181036000830152613ce281613ca6565b9050919050565b6000613cf482613501565b9150613cff83613501565b925082821015613d1257613d11613aad565b5b828203905092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613d79602f836132a9565b9150613d8482613d1d565b604082019050919050565b60006020820190508181036000830152613da881613d6c565b9050919050565b600081905092915050565b6000613dc58261329e565b613dcf8185613daf565b9350613ddf8185602086016132ba565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613e0d81613a11565b613e178186613daf565b94506001821660008114613e325760018114613e4357613e76565b60ff19831686528186019350613e76565b613e4c85613deb565b60005b83811015613e6e57815481890152600182019150602081019050613e4f565b838801955050505b50505092915050565b6000613e8b8286613dba565b9150613e978285613dba565b9150613ea38284613e00565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f0c6026836132a9565b9150613f1782613eb0565b604082019050919050565b60006020820190508181036000830152613f3b81613eff565b9050919050565b6000613f4d82613359565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f7f57613f7e613aad565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613fc482613359565b9150613fcf83613359565b925082613fdf57613fde613f8a565b5b828204905092915050565b6000613ff582613359565b915061400083613359565b92508282101561401357614012613aad565b5b828203905092915050565b600061402982613359565b915061403483613359565b92508261404457614043613f8a565b5b828206905092915050565b600061405a82613359565b915061406583613359565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561409a57614099613aad565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006140fb826140d4565b61410581856140df565b93506141158185602086016132ba565b61411e816132ed565b840191505092915050565b600060808201905061413e60008301876133ee565b61414b60208301866133ee565b6141586040830185613484565b818103606083015261416a81846140f0565b905095945050505050565b600081519050614184816131a8565b92915050565b6000602082840312156141a05761419f613172565b5b60006141ae84828501614175565b9150509291505056fea2646970667358221220846e97d5b1c82c2c0902ebdd176504b842a44ed73779406fcd5342126e29182864736f6c634300080d0033697066733a2f2f6261667962656968366b637232757a62346d77716261353679616f346a797a777961646d66756b376c33637773703337627a737a6f7a676a366a342f

Deployed Bytecode

0x6080604052600436106101e35760003560e01c8063715018a611610102578063b88d4fde11610095578063e94053c711610064578063e94053c7146106a7578063e985e9c5146106e4578063f2fde38b14610721578063f8bf51721461074a576101e3565b8063b88d4fde146105eb578063bc951b9114610614578063c87b56dd1461063f578063d5abeb011461067c576101e3565b806395d89b41116100d157806395d89b4114610552578063a22cb4651461057d578063a2522d2d146105a6578063aa062290146105c2576101e3565b8063715018a6146104bc5780637ec4a659146104d35780638da5cb5b146104fc57806394354fd014610527576101e3565b806328b60d151161017a57806344a0d68a1161014957806344a0d68a146103f05780634d9c1848146104195780636352211e1461044257806370a082311461047f576101e3565b806328b60d151461035e5780632f6f98e1146103875780633ccfd60b146103b057806342842e0e146103c7576101e3565b8063095ea7b3116101b6578063095ea7b3146102b657806313faede6146102df57806318160ddd1461030a57806323b872dd14610335576101e3565b806301ffc9a7146101e857806306421c2f1461022557806306fdde031461024e578063081812fc14610279575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a91906131d4565b610775565b60405161021c919061321c565b60405180910390f35b34801561023157600080fd5b5061024c60048036038101906102479190613271565b610857565b005b34801561025a57600080fd5b506102636108f3565b6040516102709190613337565b60405180910390f35b34801561028557600080fd5b506102a0600480360381019061029b919061338f565b610985565b6040516102ad91906133fd565b60405180910390f35b3480156102c257600080fd5b506102dd60048036038101906102d89190613444565b610a01565b005b3480156102eb57600080fd5b506102f4610b0b565b6040516103019190613493565b60405180910390f35b34801561031657600080fd5b5061031f610b11565b60405161032c9190613493565b60405180910390f35b34801561034157600080fd5b5061035c600480360381019061035791906134ae565b610b28565b005b34801561036a57600080fd5b506103856004803603810190610380919061353a565b610d0a565b005b34801561039357600080fd5b506103ae60048036038101906103a99190613567565b610da4565b005b3480156103bc57600080fd5b506103c5610eb1565b005b3480156103d357600080fd5b506103ee60048036038101906103e991906134ae565b610f7c565b005b3480156103fc57600080fd5b506104176004803603810190610412919061338f565b61115e565b005b34801561042557600080fd5b50610440600480360381019061043b919061353a565b6111e4565b005b34801561044e57600080fd5b506104696004803603810190610464919061338f565b611282565b60405161047691906133fd565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a191906135a7565b611298565b6040516104b39190613493565b60405180910390f35b3480156104c857600080fd5b506104d1611367565b005b3480156104df57600080fd5b506104fa60048036038101906104f59190613709565b6113ef565b005b34801561050857600080fd5b50610511611485565b60405161051e91906133fd565b60405180910390f35b34801561053357600080fd5b5061053c6114af565b6040516105499190613761565b60405180910390f35b34801561055e57600080fd5b506105676114c2565b6040516105749190613337565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f91906137a8565b611554565b005b6105c060048036038101906105bb919061353a565b6116cb565b005b3480156105ce57600080fd5b506105e960048036038101906105e4919061353a565b6119dd565b005b3480156105f757600080fd5b50610612600480360381019061060d9190613889565b611a77565b005b34801561062057600080fd5b50610629611c5c565b6040516106369190613761565b60405180910390f35b34801561064b57600080fd5b506106666004803603810190610661919061338f565b611c6f565b6040516106739190613337565b60405180910390f35b34801561068857600080fd5b50610691611d19565b60405161069e919061391b565b60405180910390f35b3480156106b357600080fd5b506106ce60048036038101906106c991906135a7565b611d2d565b6040516106db9190613761565b60405180910390f35b3480156106f057600080fd5b5061070b60048036038101906107069190613936565b611d4d565b604051610718919061321c565b60405180910390f35b34801561072d57600080fd5b50610748600480360381019061074391906135a7565b611de1565b005b34801561075657600080fd5b5061075f611ed8565b60405161076c9190613761565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610850575061084f82611eeb565b5b9050919050565b61085f611f55565b73ffffffffffffffffffffffffffffffffffffffff1661087d611485565b73ffffffffffffffffffffffffffffffffffffffff16146108d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca906139c2565b60405180910390fd5b80600c60006101000a81548161ffff021916908361ffff16021790555050565b60606002805461090290613a11565b80601f016020809104026020016040519081016040528092919081815260200182805461092e90613a11565b801561097b5780601f106109505761010080835404028352916020019161097b565b820191906000526020600020905b81548152906001019060200180831161095e57829003601f168201915b5050505050905090565b600061099082611f5d565b6109c6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a0c82611282565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a73576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a92611f55565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ac45750610ac281610abd611f55565b611d4d565b155b15610afb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b06838383611fab565b505050565b600b5481565b6000610b1b61205d565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610cf8573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b9a57610b95848484612062565b610d04565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610be3929190613a42565b602060405180830381865afa158015610c00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c249190613a80565b8015610cb657506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610c74929190613a42565b602060405180830381865afa158015610c91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb59190613a80565b5b610cf757336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610cee91906133fd565b60405180910390fd5b5b610d03848484612062565b5b50505050565b610d12611f55565b73ffffffffffffffffffffffffffffffffffffffff16610d30611485565b73ffffffffffffffffffffffffffffffffffffffff1614610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d906139c2565b60405180910390fd5b80600c60036101000a81548160ff021916908360ff16021790555050565b610dac611f55565b73ffffffffffffffffffffffffffffffffffffffff16610dca611485565b73ffffffffffffffffffffffffffffffffffffffff1614610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e17906139c2565b60405180910390fd5b6000610e2a610b11565b9050600c60009054906101000a900461ffff1661ffff168382610e4d9190613adc565b61ffff161115610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8990613b60565b60405180910390fd5b610ea0828461ffff16612072565b600092506000915060009050505050565b610eb9611f55565b73ffffffffffffffffffffffffffffffffffffffff16610ed7611485565b73ffffffffffffffffffffffffffffffffffffffff1614610f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f24906139c2565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f78573d6000803e3d6000fd5b5050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561114c573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fee57610fe9848484612090565b611158565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611037929190613a42565b602060405180830381865afa158015611054573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110789190613a80565b801561110a57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016110c8929190613a42565b602060405180830381865afa1580156110e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111099190613a80565b5b61114b57336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161114291906133fd565b60405180910390fd5b5b611157848484612090565b5b50505050565b611166611f55565b73ffffffffffffffffffffffffffffffffffffffff16611184611485565b73ffffffffffffffffffffffffffffffffffffffff16146111da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d1906139c2565b60405180910390fd5b80600b8190555050565b6111ec611f55565b73ffffffffffffffffffffffffffffffffffffffff1661120a611485565b73ffffffffffffffffffffffffffffffffffffffff1614611260576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611257906139c2565b60405180910390fd5b80600c60046101000a81548160ff021916908360ff1602179055506000905050565b600061128d826120b0565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112ff576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61136f611f55565b73ffffffffffffffffffffffffffffffffffffffff1661138d611485565b73ffffffffffffffffffffffffffffffffffffffff16146113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da906139c2565b60405180910390fd5b6113ed600061233f565b565b6113f7611f55565b73ffffffffffffffffffffffffffffffffffffffff16611415611485565b73ffffffffffffffffffffffffffffffffffffffff161461146b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611462906139c2565b60405180910390fd5b8060099080519060200190611481929190613082565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60029054906101000a900460ff1681565b6060600380546114d190613a11565b80601f01602080910402602001604051908101604052809291908181526020018280546114fd90613a11565b801561154a5780601f1061151f5761010080835404028352916020019161154a565b820191906000526020600020905b81548152906001019060200180831161152d57829003601f168201915b5050505050905090565b61155c611f55565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115c0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006115cd611f55565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661167a611f55565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116bf919061321c565b60405180910390a35050565b60006116d5610b11565b90506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600c60009054906101000a900461ffff1661ffff168360ff168361174c9190613adc565b61ffff161115611791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178890613b60565b60405180910390fd5b600c60039054906101000a900460ff1660ff1681846117b09190613b80565b60ff1611156117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb90613c03565b60405180910390fd5b600c60029054906101000a900460ff1660ff168360ff16111561184c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184390613c03565b60405180910390fd5b600c60049054906101000a900460ff1660ff168160ff16106118c0578260ff16600b546118799190613c23565b3410156118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b290613cc9565b60405180910390fd5b611960565b600081846118ce9190613b80565b9050600c60049054906101000a900460ff1660ff168160ff16111561195e57600c60049054906101000a900460ff16816119089190613ce9565b90508060ff16600b5461191b9190613c23565b34101561195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195490613cc9565b60405180910390fd5b5b505b61196d338460ff16612072565b80836119799190613b80565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000915060009250505050565b6119e5611f55565b73ffffffffffffffffffffffffffffffffffffffff16611a03611485565b73ffffffffffffffffffffffffffffffffffffffff1614611a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a50906139c2565b60405180910390fd5b80600c60026101000a81548160ff021916908360ff16021790555050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c48573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611aea57611ae585858585612405565b611c55565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611b33929190613a42565b602060405180830381865afa158015611b50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b749190613a80565b8015611c0657506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611bc4929190613a42565b602060405180830381865afa158015611be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c059190613a80565b5b611c4757336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c3e91906133fd565b60405180910390fd5b5b611c5485858585612405565b5b5050505050565b600c60039054906101000a900460ff1681565b6060611c7a82611f5d565b611cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb090613d8f565b60405180910390fd5b6000611cc3612481565b90506000815111611ce35760405180602001604052806000815250611d11565b80611ced84612513565b600a604051602001611d0193929190613e7f565b6040516020818303038152906040525b915050919050565b600c60009054906101000a900461ffff1681565b600d6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611de9611f55565b73ffffffffffffffffffffffffffffffffffffffff16611e07611485565b73ffffffffffffffffffffffffffffffffffffffff1614611e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e54906139c2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec390613f22565b60405180910390fd5b611ed58161233f565b50565b600c60049054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081611f6861205d565b11158015611f77575060005482105b8015611fa4575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b61206d838383612673565b505050565b61208c828260405180602001604052806000815250612b27565b5050565b6120ab83838360405180602001604052806000815250611a77565b505050565b6120b8613108565b6000829050806120c661205d565b111580156120d5575060005481105b15612308576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161230657600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121ea57809250505061233a565b5b60011561230557818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461230057809250505061233a565b6121eb565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612410848484612673565b61242f8373ffffffffffffffffffffffffffffffffffffffff16612b39565b8015612444575061244284848484612b5c565b155b1561247b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606009805461249090613a11565b80601f01602080910402602001604051908101604052809291908181526020018280546124bc90613a11565b80156125095780601f106124de57610100808354040283529160200191612509565b820191906000526020600020905b8154815290600101906020018083116124ec57829003601f168201915b5050505050905090565b60606000820361255a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061266e565b600082905060005b6000821461258c57808061257590613f42565b915050600a826125859190613fb9565b9150612562565b60008167ffffffffffffffff8111156125a8576125a76135de565b5b6040519080825280601f01601f1916602001820160405280156125da5781602001600182028036833780820191505090505b5090505b60008514612667576001826125f39190613fea565b9150600a85612602919061401e565b603061260e919061404f565b60f81b818381518110612624576126236140a5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126609190613fb9565b94506125de565b8093505050505b919050565b600061267e826120b0565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126e9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661270a611f55565b73ffffffffffffffffffffffffffffffffffffffff161480612739575061273885612733611f55565b611d4d565b5b8061277e5750612747611f55565b73ffffffffffffffffffffffffffffffffffffffff1661276684610985565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806127b7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361281d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61282a8585856001612cac565b61283660008487611fab565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612ab5576000548214612ab457878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b208585856001612cb2565b5050505050565b612b348383836001612cb8565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b82611f55565b8786866040518563ffffffff1660e01b8152600401612ba49493929190614129565b6020604051808303816000875af1925050508015612be057506040513d601f19601f82011682018060405250810190612bdd919061418a565b60015b612c59573d8060008114612c10576040519150601f19603f3d011682016040523d82523d6000602084013e612c15565b606091505b506000815103612c51576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612d24576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612d5e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d6b6000868387612cac565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612f355750612f348773ffffffffffffffffffffffffffffffffffffffff16612b39565b5b15612ffa575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612faa6000888480600101955088612b5c565b612fe0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612f3b578260005414612ff557600080fd5b613065565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612ffb575b81600081905550505061307b6000868387612cb2565b5050505050565b82805461308e90613a11565b90600052602060002090601f0160209004810192826130b057600085556130f7565b82601f106130c957805160ff19168380011785556130f7565b828001600101855582156130f7579182015b828111156130f65782518255916020019190600101906130db565b5b509050613104919061314b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561316457600081600090555060010161314c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131b18161317c565b81146131bc57600080fd5b50565b6000813590506131ce816131a8565b92915050565b6000602082840312156131ea576131e9613172565b5b60006131f8848285016131bf565b91505092915050565b60008115159050919050565b61321681613201565b82525050565b6000602082019050613231600083018461320d565b92915050565b600061ffff82169050919050565b61324e81613237565b811461325957600080fd5b50565b60008135905061326b81613245565b92915050565b60006020828403121561328757613286613172565b5b60006132958482850161325c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132d85780820151818401526020810190506132bd565b838111156132e7576000848401525b50505050565b6000601f19601f8301169050919050565b60006133098261329e565b61331381856132a9565b93506133238185602086016132ba565b61332c816132ed565b840191505092915050565b6000602082019050818103600083015261335181846132fe565b905092915050565b6000819050919050565b61336c81613359565b811461337757600080fd5b50565b60008135905061338981613363565b92915050565b6000602082840312156133a5576133a4613172565b5b60006133b38482850161337a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133e7826133bc565b9050919050565b6133f7816133dc565b82525050565b600060208201905061341260008301846133ee565b92915050565b613421816133dc565b811461342c57600080fd5b50565b60008135905061343e81613418565b92915050565b6000806040838503121561345b5761345a613172565b5b60006134698582860161342f565b925050602061347a8582860161337a565b9150509250929050565b61348d81613359565b82525050565b60006020820190506134a86000830184613484565b92915050565b6000806000606084860312156134c7576134c6613172565b5b60006134d58682870161342f565b93505060206134e68682870161342f565b92505060406134f78682870161337a565b9150509250925092565b600060ff82169050919050565b61351781613501565b811461352257600080fd5b50565b6000813590506135348161350e565b92915050565b6000602082840312156135505761354f613172565b5b600061355e84828501613525565b91505092915050565b6000806040838503121561357e5761357d613172565b5b600061358c8582860161325c565b925050602061359d8582860161342f565b9150509250929050565b6000602082840312156135bd576135bc613172565b5b60006135cb8482850161342f565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613616826132ed565b810181811067ffffffffffffffff82111715613635576136346135de565b5b80604052505050565b6000613648613168565b9050613654828261360d565b919050565b600067ffffffffffffffff821115613674576136736135de565b5b61367d826132ed565b9050602081019050919050565b82818337600083830152505050565b60006136ac6136a784613659565b61363e565b9050828152602081018484840111156136c8576136c76135d9565b5b6136d384828561368a565b509392505050565b600082601f8301126136f0576136ef6135d4565b5b8135613700848260208601613699565b91505092915050565b60006020828403121561371f5761371e613172565b5b600082013567ffffffffffffffff81111561373d5761373c613177565b5b613749848285016136db565b91505092915050565b61375b81613501565b82525050565b60006020820190506137766000830184613752565b92915050565b61378581613201565b811461379057600080fd5b50565b6000813590506137a28161377c565b92915050565b600080604083850312156137bf576137be613172565b5b60006137cd8582860161342f565b92505060206137de85828601613793565b9150509250929050565b600067ffffffffffffffff821115613803576138026135de565b5b61380c826132ed565b9050602081019050919050565b600061382c613827846137e8565b61363e565b905082815260208101848484011115613848576138476135d9565b5b61385384828561368a565b509392505050565b600082601f8301126138705761386f6135d4565b5b8135613880848260208601613819565b91505092915050565b600080600080608085870312156138a3576138a2613172565b5b60006138b18782880161342f565b94505060206138c28782880161342f565b93505060406138d38782880161337a565b925050606085013567ffffffffffffffff8111156138f4576138f3613177565b5b6139008782880161385b565b91505092959194509250565b61391581613237565b82525050565b6000602082019050613930600083018461390c565b92915050565b6000806040838503121561394d5761394c613172565b5b600061395b8582860161342f565b925050602061396c8582860161342f565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139ac6020836132a9565b91506139b782613976565b602082019050919050565b600060208201905081810360008301526139db8161399f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a2957607f821691505b602082108103613a3c57613a3b6139e2565b5b50919050565b6000604082019050613a5760008301856133ee565b613a6460208301846133ee565b9392505050565b600081519050613a7a8161377c565b92915050565b600060208284031215613a9657613a95613172565b5b6000613aa484828501613a6b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ae782613237565b9150613af283613237565b92508261ffff03821115613b0957613b08613aad565b5b828201905092915050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b6000613b4a6013836132a9565b9150613b5582613b14565b602082019050919050565b60006020820190508181036000830152613b7981613b3d565b9050919050565b6000613b8b82613501565b9150613b9683613501565b92508260ff03821115613bac57613bab613aad565b5b828201905092915050565b7f45786365656473206d6178207065722057616c6c65742e000000000000000000600082015250565b6000613bed6017836132a9565b9150613bf882613bb7565b602082019050919050565b60006020820190508181036000830152613c1c81613be0565b9050919050565b6000613c2e82613359565b9150613c3983613359565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c7257613c71613aad565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613cb36013836132a9565b9150613cbe82613c7d565b602082019050919050565b60006020820190508181036000830152613ce281613ca6565b9050919050565b6000613cf482613501565b9150613cff83613501565b925082821015613d1257613d11613aad565b5b828203905092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613d79602f836132a9565b9150613d8482613d1d565b604082019050919050565b60006020820190508181036000830152613da881613d6c565b9050919050565b600081905092915050565b6000613dc58261329e565b613dcf8185613daf565b9350613ddf8185602086016132ba565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613e0d81613a11565b613e178186613daf565b94506001821660008114613e325760018114613e4357613e76565b60ff19831686528186019350613e76565b613e4c85613deb565b60005b83811015613e6e57815481890152600182019150602081019050613e4f565b838801955050505b50505092915050565b6000613e8b8286613dba565b9150613e978285613dba565b9150613ea38284613e00565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f0c6026836132a9565b9150613f1782613eb0565b604082019050919050565b60006020820190508181036000830152613f3b81613eff565b9050919050565b6000613f4d82613359565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f7f57613f7e613aad565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613fc482613359565b9150613fcf83613359565b925082613fdf57613fde613f8a565b5b828204905092915050565b6000613ff582613359565b915061400083613359565b92508282101561401357614012613aad565b5b828203905092915050565b600061402982613359565b915061403483613359565b92508261404457614043613f8a565b5b828206905092915050565b600061405a82613359565b915061406583613359565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561409a57614099613aad565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006140fb826140d4565b61410581856140df565b93506141158185602086016132ba565b61411e816132ed565b840191505092915050565b600060808201905061413e60008301876133ee565b61414b60208301866133ee565b6141586040830185613484565b818103606083015261416a81846140f0565b905095945050505050565b600081519050614184816131a8565b92915050565b6000602082840312156141a05761419f613172565b5b60006141ae84828501614175565b9150509291505056fea2646970667358221220846e97d5b1c82c2c0902ebdd176504b842a44ed73779406fcd5342126e29182864736f6c634300080d0033

Deployed Bytecode Sourcemap

48552:3865:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24441:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50483:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27554:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29057:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28620:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48801:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23690:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51836:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51462:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50151:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51581:141;;;;;;;;;;;;;:::i;:::-;;52007:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51269:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51020:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27362:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24810:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43263:103;;;;;;;;;;;;;:::i;:::-;;51161:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42611:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48876:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27723:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29333:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49147:996;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51349:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52186:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48917:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50588:426;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48841:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49012:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29691:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43521:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48962:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24441:305;24543:4;24595:25;24580:40;;;:11;:40;;;;:105;;;;24652:33;24637:48;;;:11;:48;;;;24580:105;:158;;;;24702:36;24726:11;24702:23;:36::i;:::-;24580:158;24560:178;;24441:305;;;:::o;50483:97::-;42842:12;:10;:12::i;:::-;42831:23;;:7;:5;:7::i;:::-;:23;;;42823:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;50564:10:::1;50552:9;;:22;;;;;;;;;;;;;;;;;;50483:97:::0;:::o;27554:100::-;27608:13;27641:5;27634:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27554:100;:::o;29057:204::-;29125:7;29150:16;29158:7;29150;:16::i;:::-;29145:64;;29175:34;;;;;;;;;;;;;;29145:64;29229:15;:24;29245:7;29229:24;;;;;;;;;;;;;;;;;;;;;29222:31;;29057:204;;;:::o;28620:371::-;28693:13;28709:24;28725:7;28709:15;:24::i;:::-;28693:40;;28754:5;28748:11;;:2;:11;;;28744:48;;28768:24;;;;;;;;;;;;;;28744:48;28825:5;28809:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;28835:37;28852:5;28859:12;:10;:12::i;:::-;28835:16;:37::i;:::-;28834:38;28809:63;28805:138;;;28896:35;;;;;;;;;;;;;;28805:138;28955:28;28964:2;28968:7;28977:5;28955:8;:28::i;:::-;28682:309;28620:371;;:::o;48801:33::-;;;;:::o;23690:303::-;23734:7;23959:15;:13;:15::i;:::-;23944:12;;23928:13;;:28;:46;23921:53;;23690:303;:::o;51836:163::-;51937:4;47573:1;46387:42;47527:43;;;:47;47523:699;;;47814:10;47806:18;;:4;:18;;;47802:85;;51954:37:::1;51973:4;51979:2;51983:7;51954:18;:37::i;:::-;47865:7:::0;;47802:85;46387:42;47947:40;;;47996:4;48003:10;47947:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;46387:42;48043:40;;;48092:4;48099;48043:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47947:157;47901:310;;48184:10;48165:30;;;;;;;;;;;:::i;:::-;;;;;;;;47901:310;47523:699;51954:37:::1;51973:4;51979:2;51983:7;51954:18;:37::i;:::-;51836:163:::0;;;;;:::o;51462:113::-;42842:12;:10;:12::i;:::-;42831:23;;:7;:5;:7::i;:::-;:23;;;42823:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51563:6:::1;51538:22;;:31;;;;;;;;;;;;;;;;;;51462:113:::0;:::o;50151:326::-;42842:12;:10;:12::i;:::-;42831:23;;:7;:5;:7::i;:::-;:23;;;42823:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;50234:18:::1;50262:13;:11;:13::i;:::-;50234:42;;50320:9;;;;;;;;;;;50291:38;;50305:11;50291;:25;;;;:::i;:::-;:38;;;;50283:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50361:34;50371:9;50383:11;50361:34;;:9;:34::i;:::-;50403:18;;;50429:16;;;50453:18;;;50226:251;50151:326:::0;;:::o;51581:141::-;42842:12;:10;:12::i;:::-;42831:23;;:7;:5;:7::i;:::-;:23;;;42823:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51625:13:::1;51641:21;51625:37;;51678:10;51670:28;;:39;51699:8;51670:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51620:102;51581:141::o:0;52007:171::-;52112:4;47573:1;46387:42;47527:43;;;:47;47523:699;;;47814:10;47806:18;;:4;:18;;;47802:85;;52129:41:::1;52152:4;52158:2;52162:7;52129:22;:41::i;:::-;47865:7:::0;;47802:85;46387:42;47947:40;;;47996:4;48003:10;47947:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;46387:42;48043:40;;;48092:4;48099;48043:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47947:157;47901:310;;48184:10;48165:30;;;;;;;;;;;:::i;:::-;;;;;;;;47901:310;47523:699;52129:41:::1;52152:4;52158:2;52162:7;52129:22;:41::i;:::-;52007:171:::0;;;;;:::o;51269:74::-;42842:12;:10;:12::i;:::-;42831:23;;:7;:5;:7::i;:::-;:23;;;42823:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51332:5:::1;51325:4;:12;;;;51269:74:::0;:::o;51020:135::-;42842:12;:10;:12::i;:::-;42831:23;;:7;:5;:7::i;:::-;:23;;;42823:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51123:6:::1;51094:26;;:35;;;;;;;;;;;;;;;;;;51136:13;;;51020:135:::0;:::o;27362:125::-;27426:7;27453:21;27466:7;27453:12;:21::i;:::-;:26;;;27446:33;;27362:125;;;:::o;24810:206::-;24874:7;24915:1;24898:19;;:5;:19;;;24894:60;;24926:28;;;;;;;;;;;;;;24894:60;24980:12;:19;24993:5;24980:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;24972:36;;24965:43;;24810:206;;;:::o;43263:103::-;42842:12;:10;:12::i;:::-;42831:23;;:7;:5;:7::i;:::-;:23;;;42823:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43328:30:::1;43355:1;43328:18;:30::i;:::-;43263:103::o:0;51161:102::-;42842:12;:10;:12::i;:::-;42831:23;;:7;:5;:7::i;:::-;:23;;;42823:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51247:10:::1;51235:9;:22;;;;;;;;;;;;:::i;:::-;;51161:102:::0;:::o;42611:87::-;42657:7;42684:6;;;;;;;;;;;42677:13;;42611:87;:::o;48876:36::-;;;;;;;;;;;;;:::o;27723:104::-;27779:13;27812:7;27805:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27723:104;:::o;29333:287::-;29444:12;:10;:12::i;:::-;29432:24;;:8;:24;;;29428:54;;29465:17;;;;;;;;;;;;;;29428:54;29540:8;29495:18;:32;29514:12;:10;:12::i;:::-;29495:32;;;;;;;;;;;;;;;:42;29528:8;29495:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29593:8;29564:48;;29579:12;:10;:12::i;:::-;29564:48;;;29603:8;29564:48;;;;;;:::i;:::-;;;;;;;;29333:287;;:::o;49147:996::-;49206:18;49234:13;:11;:13::i;:::-;49206:42;;49256:9;49268:19;:31;49288:10;49268:31;;;;;;;;;;;;;;;;;;;;;;;;;49256:43;;49343:9;;;;;;;;;;;49314:38;;49328:11;49314:25;;:11;:25;;;;:::i;:::-;:38;;;;49306:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;49412:22;;;;;;;;;;;49391:43;;49405:3;49391:11;:17;;;;:::i;:::-;:43;;;;49383:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;49493:18;;;;;;;;;;;49477:34;;:11;:34;;;;49469:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;49564:26;;;;;;;;;;;49557:33;;:3;:33;;;49554:417;;49632:11;49625:18;;:4;;:18;;;;:::i;:::-;49612:9;:31;;49604:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49554:417;;;49698:16;49731:3;49717:11;:17;;;;:::i;:::-;49698:36;;49761:26;;;;;;;;;;;49748:39;;:10;:39;;;49745:199;;;49834:26;;;;;;;;;;;49821:10;:39;;;;:::i;:::-;49808:52;;49899:10;49892:17;;:4;;:17;;;;:::i;:::-;49879:9;:30;;49871:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49745:199;49686:285;49554:417;49983:35;49993:10;50006:11;49983:35;;:9;:35::i;:::-;50075:3;50061:11;:17;;;;:::i;:::-;50027:19;:31;50047:10;50027:31;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;50093:18;;;50119;;;49198:945;;49147:996;:::o;51349:105::-;42842:12;:10;:12::i;:::-;42831:23;;:7;:5;:7::i;:::-;:23;;;42823:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51442:6:::1;51421:18;;:27;;;;;;;;;;;;;;;;;;51349:105:::0;:::o;52186:228::-;52337:4;47573:1;46387:42;47527:43;;;:47;47523:699;;;47814:10;47806:18;;:4;:18;;;47802:85;;52359:47:::1;52382:4;52388:2;52392:7;52401:4;52359:22;:47::i;:::-;47865:7:::0;;47802:85;46387:42;47947:40;;;47996:4;48003:10;47947:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;46387:42;48043:40;;;48092:4;48099;48043:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47947:157;47901:310;;48184:10;48165:30;;;;;;;;;;;:::i;:::-;;;;;;;;47901:310;47523:699;52359:47:::1;52382:4;52388:2;52392:7;52401:4;52359:22;:47::i;:::-;52186:228:::0;;;;;;:::o;48917:40::-;;;;;;;;;;;;;:::o;50588:426::-;50687:13;50728:17;50736:8;50728:7;:17::i;:::-;50712:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;50823:28;50854:10;:8;:10::i;:::-;50823:41;;50909:1;50884:14;50878:28;:32;:130;;;;;;;;;;;;;;;;;50946:14;50962:19;:8;:17;:19::i;:::-;50983:9;50929:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50878:130;50871:137;;;50588:426;;;:::o;48841:30::-;;;;;;;;;;;;;:::o;49012:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;29691:164::-;29788:4;29812:18;:25;29831:5;29812:25;;;;;;;;;;;;;;;:35;29838:8;29812:35;;;;;;;;;;;;;;;;;;;;;;;;;29805:42;;29691:164;;;;:::o;43521:201::-;42842:12;:10;:12::i;:::-;42831:23;;:7;:5;:7::i;:::-;:23;;;42823:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43630:1:::1;43610:22;;:8;:22;;::::0;43602:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;43686:28;43705:8;43686:18;:28::i;:::-;43521:201:::0;:::o;48962:43::-;;;;;;;;;;;;;:::o;14366:157::-;14451:4;14490:25;14475:40;;;:11;:40;;;;14468:47;;14366:157;;;:::o;2836:98::-;2889:7;2916:10;2909:17;;2836:98;:::o;31043:187::-;31100:4;31143:7;31124:15;:13;:15::i;:::-;:26;;:53;;;;;31164:13;;31154:7;:23;31124:53;:98;;;;;31195:11;:20;31207:7;31195:20;;;;;;;;;;;:27;;;;;;;;;;;;31194:28;31124:98;31117:105;;31043:187;;;:::o;39213:196::-;39355:2;39328:15;:24;39344:7;39328:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39393:7;39389:2;39373:28;;39382:5;39373:28;;;;;;;;;;;;39213:196;;;:::o;23464:92::-;23520:7;23464:92;:::o;29922:170::-;30056:28;30066:4;30072:2;30076:7;30056:9;:28::i;:::-;29922:170;;;:::o;31238:104::-;31307:27;31317:2;31321:8;31307:27;;;;;;;;;;;;:9;:27::i;:::-;31238:104;;:::o;30163:185::-;30301:39;30318:4;30324:2;30328:7;30301:39;;;;;;;;;;;;:16;:39::i;:::-;30163:185;;;:::o;26191:1109::-;26253:21;;:::i;:::-;26287:12;26302:7;26287:22;;26370:4;26351:15;:13;:15::i;:::-;:23;;:47;;;;;26385:13;;26378:4;:20;26351:47;26347:886;;;26419:31;26453:11;:17;26465:4;26453:17;;;;;;;;;;;26419:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26494:9;:16;;;26489:729;;26565:1;26539:28;;:9;:14;;;:28;;;26535:101;;26603:9;26596:16;;;;;;26535:101;26938:261;26945:4;26938:261;;;26978:6;;;;;;;;27023:11;:17;27035:4;27023:17;;;;;;;;;;;27011:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27097:1;27071:28;;:9;:14;;;:28;;;27067:109;;27139:9;27132:16;;;;;;27067:109;26938:261;;;26489:729;26400:833;26347:886;27261:31;;;;;;;;;;;;;;26191:1109;;;;:::o;43882:191::-;43956:16;43975:6;;;;;;;;;;;43956:25;;44001:8;43992:6;;:17;;;;;;;;;;;;;;;;;;44056:8;44025:40;;44046:8;44025:40;;;;;;;;;;;;43945:128;43882:191;:::o;30419:369::-;30586:28;30596:4;30602:2;30606:7;30586:9;:28::i;:::-;30629:15;:2;:13;;;:15::i;:::-;:76;;;;;30649:56;30680:4;30686:2;30690:7;30699:5;30649:30;:56::i;:::-;30648:57;30629:76;30625:156;;;30729:40;;;;;;;;;;;;;;30625:156;30419:369;;;;:::o;51728:97::-;51781:13;51810:9;51803:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51728:97;:::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;34156:2130::-;34271:35;34309:21;34322:7;34309:12;:21::i;:::-;34271:59;;34369:4;34347:26;;:13;:18;;;:26;;;34343:67;;34382:28;;;;;;;;;;;;;;34343:67;34423:22;34465:4;34449:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;34486:36;34503:4;34509:12;:10;:12::i;:::-;34486:16;:36::i;:::-;34449:73;:126;;;;34563:12;:10;:12::i;:::-;34539:36;;:20;34551:7;34539:11;:20::i;:::-;:36;;;34449:126;34423:153;;34594:17;34589:66;;34620:35;;;;;;;;;;;;;;34589:66;34684:1;34670:16;;:2;:16;;;34666:52;;34695:23;;;;;;;;;;;;;;34666:52;34731:43;34753:4;34759:2;34763:7;34772:1;34731:21;:43::i;:::-;34839:35;34856:1;34860:7;34869:4;34839:8;:35::i;:::-;35200:1;35170:12;:18;35183:4;35170:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35244:1;35216:12;:16;35229:2;35216:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35262:31;35296:11;:20;35308:7;35296:20;;;;;;;;;;;35262:54;;35347:2;35331:8;:13;;;:18;;;;;;;;;;;;;;;;;;35397:15;35364:8;:23;;;:49;;;;;;;;;;;;;;;;;;35665:19;35697:1;35687:7;:11;35665:33;;35713:31;35747:11;:24;35759:11;35747:24;;;;;;;;;;;35713:58;;35815:1;35790:27;;:8;:13;;;;;;;;;;;;:27;;;35786:384;;36000:13;;35985:11;:28;35981:174;;36054:4;36038:8;:13;;;:20;;;;;;;;;;;;;;;;;;36107:13;:28;;;36081:8;:23;;;:54;;;;;;;;;;;;;;;;;;35981:174;35786:384;35145:1036;;;36217:7;36213:2;36198:27;;36207:4;36198:27;;;;;;;;;;;;36236:42;36257:4;36263:2;36267:7;36276:1;36236:20;:42::i;:::-;34260:2026;;34156:2130;;;:::o;31705:163::-;31828:32;31834:2;31838:8;31848:5;31855:4;31828:5;:32::i;:::-;31705:163;;;:::o;4283:326::-;4343:4;4600:1;4578:7;:19;;;:23;4571:30;;4283:326;;;:::o;39901:667::-;40064:4;40101:2;40085:36;;;40122:12;:10;:12::i;:::-;40136:4;40142:7;40151:5;40085:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40081:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40336:1;40319:6;:13;:18;40315:235;;40365:40;;;;;;;;;;;;;;40315:235;40508:6;40502:13;40493:6;40489:2;40485:15;40478:38;40081:480;40214:45;;;40204:55;;;:6;:55;;;;40197:62;;;39901:667;;;;;;:::o;41216:159::-;;;;;:::o;42034:158::-;;;;;:::o;32127:1775::-;32266:20;32289:13;;32266:36;;32331:1;32317:16;;:2;:16;;;32313:48;;32342:19;;;;;;;;;;;;;;32313:48;32388:1;32376:8;:13;32372:44;;32398:18;;;;;;;;;;;;;;32372:44;32429:61;32459:1;32463:2;32467:12;32481:8;32429:21;:61::i;:::-;32802:8;32767:12;:16;32780:2;32767:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32866:8;32826:12;:16;32839:2;32826:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32925:2;32892:11;:25;32904:12;32892:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;32992:15;32942:11;:25;32954:12;32942:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;33025:20;33048:12;33025:35;;33075:11;33104:8;33089:12;:23;33075:37;;33133:4;:23;;;;;33141:15;:2;:13;;;:15::i;:::-;33133:23;33129:641;;;33177:314;33233:12;33229:2;33208:38;;33225:1;33208:38;;;;;;;;;;;;33274:69;33313:1;33317:2;33321:14;;;;;;33337:5;33274:30;:69::i;:::-;33269:174;;33379:40;;;;;;;;;;;;;;33269:174;33486:3;33470:12;:19;33177:314;;33572:12;33555:13;;:29;33551:43;;33586:8;;;33551:43;33129:641;;;33635:120;33691:14;;;;;;33687:2;33666:40;;33683:1;33666:40;;;;;;;;;;;;33750:3;33734:12;:19;33635:120;;33129:641;33800:12;33784:13;:28;;;;32742:1082;;33834:60;33863:1;33867:2;33871:12;33885:8;33834:20;:60::i;:::-;32255:1647;32127:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:89::-;1554:7;1594:6;1587:5;1583:18;1572:29;;1518:89;;;:::o;1613:120::-;1685:23;1702:5;1685:23;:::i;:::-;1678:5;1675:34;1665:62;;1723:1;1720;1713:12;1665:62;1613:120;:::o;1739:137::-;1784:5;1822:6;1809:20;1800:29;;1838:32;1864:5;1838:32;:::i;:::-;1739:137;;;;:::o;1882:327::-;1940:6;1989:2;1977:9;1968:7;1964:23;1960:32;1957:119;;;1995:79;;:::i;:::-;1957:119;2115:1;2140:52;2184:7;2175:6;2164:9;2160:22;2140:52;:::i;:::-;2130:62;;2086:116;1882:327;;;;:::o;2215:99::-;2267:6;2301:5;2295:12;2285:22;;2215:99;;;:::o;2320:169::-;2404:11;2438:6;2433:3;2426:19;2478:4;2473:3;2469:14;2454:29;;2320:169;;;;:::o;2495:307::-;2563:1;2573:113;2587:6;2584:1;2581:13;2573:113;;;2672:1;2667:3;2663:11;2657:18;2653:1;2648:3;2644:11;2637:39;2609:2;2606:1;2602:10;2597:15;;2573:113;;;2704:6;2701:1;2698:13;2695:101;;;2784:1;2775:6;2770:3;2766:16;2759:27;2695:101;2544:258;2495:307;;;:::o;2808:102::-;2849:6;2900:2;2896:7;2891:2;2884:5;2880:14;2876:28;2866:38;;2808:102;;;:::o;2916:364::-;3004:3;3032:39;3065:5;3032:39;:::i;:::-;3087:71;3151:6;3146:3;3087:71;:::i;:::-;3080:78;;3167:52;3212:6;3207:3;3200:4;3193:5;3189:16;3167:52;:::i;:::-;3244:29;3266:6;3244:29;:::i;:::-;3239:3;3235:39;3228:46;;3008:272;2916:364;;;;:::o;3286:313::-;3399:4;3437:2;3426:9;3422:18;3414:26;;3486:9;3480:4;3476:20;3472:1;3461:9;3457:17;3450:47;3514:78;3587:4;3578:6;3514:78;:::i;:::-;3506:86;;3286:313;;;;:::o;3605:77::-;3642:7;3671:5;3660:16;;3605:77;;;:::o;3688:122::-;3761:24;3779:5;3761:24;:::i;:::-;3754:5;3751:35;3741:63;;3800:1;3797;3790:12;3741:63;3688:122;:::o;3816:139::-;3862:5;3900:6;3887:20;3878:29;;3916:33;3943:5;3916:33;:::i;:::-;3816:139;;;;:::o;3961:329::-;4020:6;4069:2;4057:9;4048:7;4044:23;4040:32;4037:119;;;4075:79;;:::i;:::-;4037:119;4195:1;4220:53;4265:7;4256:6;4245:9;4241:22;4220:53;:::i;:::-;4210:63;;4166:117;3961:329;;;;:::o;4296:126::-;4333:7;4373:42;4366:5;4362:54;4351:65;;4296:126;;;:::o;4428:96::-;4465:7;4494:24;4512:5;4494:24;:::i;:::-;4483:35;;4428:96;;;:::o;4530:118::-;4617:24;4635:5;4617:24;:::i;:::-;4612:3;4605:37;4530:118;;:::o;4654:222::-;4747:4;4785:2;4774:9;4770:18;4762:26;;4798:71;4866:1;4855:9;4851:17;4842:6;4798:71;:::i;:::-;4654:222;;;;:::o;4882:122::-;4955:24;4973:5;4955:24;:::i;:::-;4948:5;4945:35;4935:63;;4994:1;4991;4984:12;4935:63;4882:122;:::o;5010:139::-;5056:5;5094:6;5081:20;5072:29;;5110:33;5137:5;5110:33;:::i;:::-;5010:139;;;;:::o;5155:474::-;5223:6;5231;5280:2;5268:9;5259:7;5255:23;5251:32;5248:119;;;5286:79;;:::i;:::-;5248:119;5406:1;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5377:117;5533:2;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5504:118;5155:474;;;;;:::o;5635:118::-;5722:24;5740:5;5722:24;:::i;:::-;5717:3;5710:37;5635:118;;:::o;5759:222::-;5852:4;5890:2;5879:9;5875:18;5867:26;;5903:71;5971:1;5960:9;5956:17;5947:6;5903:71;:::i;:::-;5759:222;;;;:::o;5987:619::-;6064:6;6072;6080;6129:2;6117:9;6108:7;6104:23;6100:32;6097:119;;;6135:79;;:::i;:::-;6097:119;6255:1;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6226:117;6382:2;6408:53;6453:7;6444:6;6433:9;6429:22;6408:53;:::i;:::-;6398:63;;6353:118;6510:2;6536:53;6581:7;6572:6;6561:9;6557:22;6536:53;:::i;:::-;6526:63;;6481:118;5987:619;;;;;:::o;6612:86::-;6647:7;6687:4;6680:5;6676:16;6665:27;;6612:86;;;:::o;6704:118::-;6775:22;6791:5;6775:22;:::i;:::-;6768:5;6765:33;6755:61;;6812:1;6809;6802:12;6755:61;6704:118;:::o;6828:135::-;6872:5;6910:6;6897:20;6888:29;;6926:31;6951:5;6926:31;:::i;:::-;6828:135;;;;:::o;6969:325::-;7026:6;7075:2;7063:9;7054:7;7050:23;7046:32;7043:119;;;7081:79;;:::i;:::-;7043:119;7201:1;7226:51;7269:7;7260:6;7249:9;7245:22;7226:51;:::i;:::-;7216:61;;7172:115;6969:325;;;;:::o;7300:472::-;7367:6;7375;7424:2;7412:9;7403:7;7399:23;7395:32;7392:119;;;7430:79;;:::i;:::-;7392:119;7550:1;7575:52;7619:7;7610:6;7599:9;7595:22;7575:52;:::i;:::-;7565:62;;7521:116;7676:2;7702:53;7747:7;7738:6;7727:9;7723:22;7702:53;:::i;:::-;7692:63;;7647:118;7300:472;;;;;:::o;7778:329::-;7837:6;7886:2;7874:9;7865:7;7861:23;7857:32;7854:119;;;7892:79;;:::i;:::-;7854:119;8012:1;8037:53;8082:7;8073:6;8062:9;8058:22;8037:53;:::i;:::-;8027:63;;7983:117;7778:329;;;;:::o;8113:117::-;8222:1;8219;8212:12;8236:117;8345:1;8342;8335:12;8359:180;8407:77;8404:1;8397:88;8504:4;8501:1;8494:15;8528:4;8525:1;8518:15;8545:281;8628:27;8650:4;8628:27;:::i;:::-;8620:6;8616:40;8758:6;8746:10;8743:22;8722:18;8710:10;8707:34;8704:62;8701:88;;;8769:18;;:::i;:::-;8701:88;8809:10;8805:2;8798:22;8588:238;8545:281;;:::o;8832:129::-;8866:6;8893:20;;:::i;:::-;8883:30;;8922:33;8950:4;8942:6;8922:33;:::i;:::-;8832:129;;;:::o;8967:308::-;9029:4;9119:18;9111:6;9108:30;9105:56;;;9141:18;;:::i;:::-;9105:56;9179:29;9201:6;9179:29;:::i;:::-;9171:37;;9263:4;9257;9253:15;9245:23;;8967:308;;;:::o;9281:154::-;9365:6;9360:3;9355;9342:30;9427:1;9418:6;9413:3;9409:16;9402:27;9281:154;;;:::o;9441:412::-;9519:5;9544:66;9560:49;9602:6;9560:49;:::i;:::-;9544:66;:::i;:::-;9535:75;;9633:6;9626:5;9619:21;9671:4;9664:5;9660:16;9709:3;9700:6;9695:3;9691:16;9688:25;9685:112;;;9716:79;;:::i;:::-;9685:112;9806:41;9840:6;9835:3;9830;9806:41;:::i;:::-;9525:328;9441:412;;;;;:::o;9873:340::-;9929:5;9978:3;9971:4;9963:6;9959:17;9955:27;9945:122;;9986:79;;:::i;:::-;9945:122;10103:6;10090:20;10128:79;10203:3;10195:6;10188:4;10180:6;10176:17;10128:79;:::i;:::-;10119:88;;9935:278;9873:340;;;;:::o;10219:509::-;10288:6;10337:2;10325:9;10316:7;10312:23;10308:32;10305:119;;;10343:79;;:::i;:::-;10305:119;10491:1;10480:9;10476:17;10463:31;10521:18;10513:6;10510:30;10507:117;;;10543:79;;:::i;:::-;10507:117;10648:63;10703:7;10694:6;10683:9;10679:22;10648:63;:::i;:::-;10638:73;;10434:287;10219:509;;;;:::o;10734:112::-;10817:22;10833:5;10817:22;:::i;:::-;10812:3;10805:35;10734:112;;:::o;10852:214::-;10941:4;10979:2;10968:9;10964:18;10956:26;;10992:67;11056:1;11045:9;11041:17;11032:6;10992:67;:::i;:::-;10852:214;;;;:::o;11072:116::-;11142:21;11157:5;11142:21;:::i;:::-;11135:5;11132:32;11122:60;;11178:1;11175;11168:12;11122:60;11072:116;:::o;11194:133::-;11237:5;11275:6;11262:20;11253:29;;11291:30;11315:5;11291:30;:::i;:::-;11194:133;;;;:::o;11333:468::-;11398:6;11406;11455:2;11443:9;11434:7;11430:23;11426:32;11423:119;;;11461:79;;:::i;:::-;11423:119;11581:1;11606:53;11651:7;11642:6;11631:9;11627:22;11606:53;:::i;:::-;11596:63;;11552:117;11708:2;11734:50;11776:7;11767:6;11756:9;11752:22;11734:50;:::i;:::-;11724:60;;11679:115;11333:468;;;;;:::o;11807:307::-;11868:4;11958:18;11950:6;11947:30;11944:56;;;11980:18;;:::i;:::-;11944:56;12018:29;12040:6;12018:29;:::i;:::-;12010:37;;12102:4;12096;12092:15;12084:23;;11807:307;;;:::o;12120:410::-;12197:5;12222:65;12238:48;12279:6;12238:48;:::i;:::-;12222:65;:::i;:::-;12213:74;;12310:6;12303:5;12296:21;12348:4;12341:5;12337:16;12386:3;12377:6;12372:3;12368:16;12365:25;12362:112;;;12393:79;;:::i;:::-;12362:112;12483:41;12517:6;12512:3;12507;12483:41;:::i;:::-;12203:327;12120:410;;;;;:::o;12549:338::-;12604:5;12653:3;12646:4;12638:6;12634:17;12630:27;12620:122;;12661:79;;:::i;:::-;12620:122;12778:6;12765:20;12803:78;12877:3;12869:6;12862:4;12854:6;12850:17;12803:78;:::i;:::-;12794:87;;12610:277;12549:338;;;;:::o;12893:943::-;12988:6;12996;13004;13012;13061:3;13049:9;13040:7;13036:23;13032:33;13029:120;;;13068:79;;:::i;:::-;13029:120;13188:1;13213:53;13258:7;13249:6;13238:9;13234:22;13213:53;:::i;:::-;13203:63;;13159:117;13315:2;13341:53;13386:7;13377:6;13366:9;13362:22;13341:53;:::i;:::-;13331:63;;13286:118;13443:2;13469:53;13514:7;13505:6;13494:9;13490:22;13469:53;:::i;:::-;13459:63;;13414:118;13599:2;13588:9;13584:18;13571:32;13630:18;13622:6;13619:30;13616:117;;;13652:79;;:::i;:::-;13616:117;13757:62;13811:7;13802:6;13791:9;13787:22;13757:62;:::i;:::-;13747:72;;13542:287;12893:943;;;;;;;:::o;13842:115::-;13927:23;13944:5;13927:23;:::i;:::-;13922:3;13915:36;13842:115;;:::o;13963:218::-;14054:4;14092:2;14081:9;14077:18;14069:26;;14105:69;14171:1;14160:9;14156:17;14147:6;14105:69;:::i;:::-;13963:218;;;;:::o;14187:474::-;14255:6;14263;14312:2;14300:9;14291:7;14287:23;14283:32;14280:119;;;14318:79;;:::i;:::-;14280:119;14438:1;14463:53;14508:7;14499:6;14488:9;14484:22;14463:53;:::i;:::-;14453:63;;14409:117;14565:2;14591:53;14636:7;14627:6;14616:9;14612:22;14591:53;:::i;:::-;14581:63;;14536:118;14187:474;;;;;:::o;14667:182::-;14807:34;14803:1;14795:6;14791:14;14784:58;14667:182;:::o;14855:366::-;14997:3;15018:67;15082:2;15077:3;15018:67;:::i;:::-;15011:74;;15094:93;15183:3;15094:93;:::i;:::-;15212:2;15207:3;15203:12;15196:19;;14855:366;;;:::o;15227:419::-;15393:4;15431:2;15420:9;15416:18;15408:26;;15480:9;15474:4;15470:20;15466:1;15455:9;15451:17;15444:47;15508:131;15634:4;15508:131;:::i;:::-;15500:139;;15227:419;;;:::o;15652:180::-;15700:77;15697:1;15690:88;15797:4;15794:1;15787:15;15821:4;15818:1;15811:15;15838:320;15882:6;15919:1;15913:4;15909:12;15899:22;;15966:1;15960:4;15956:12;15987:18;15977:81;;16043:4;16035:6;16031:17;16021:27;;15977:81;16105:2;16097:6;16094:14;16074:18;16071:38;16068:84;;16124:18;;:::i;:::-;16068:84;15889:269;15838:320;;;:::o;16164:332::-;16285:4;16323:2;16312:9;16308:18;16300:26;;16336:71;16404:1;16393:9;16389:17;16380:6;16336:71;:::i;:::-;16417:72;16485:2;16474:9;16470:18;16461:6;16417:72;:::i;:::-;16164:332;;;;;:::o;16502:137::-;16556:5;16587:6;16581:13;16572:22;;16603:30;16627:5;16603:30;:::i;:::-;16502:137;;;;:::o;16645:345::-;16712:6;16761:2;16749:9;16740:7;16736:23;16732:32;16729:119;;;16767:79;;:::i;:::-;16729:119;16887:1;16912:61;16965:7;16956:6;16945:9;16941:22;16912:61;:::i;:::-;16902:71;;16858:125;16645:345;;;;:::o;16996:180::-;17044:77;17041:1;17034:88;17141:4;17138:1;17131:15;17165:4;17162:1;17155:15;17182:242;17221:3;17240:19;17257:1;17240:19;:::i;:::-;17235:24;;17273:19;17290:1;17273:19;:::i;:::-;17268:24;;17366:1;17358:6;17354:14;17351:1;17348:21;17345:47;;;17372:18;;:::i;:::-;17345:47;17416:1;17413;17409:9;17402:16;;17182:242;;;;:::o;17430:169::-;17570:21;17566:1;17558:6;17554:14;17547:45;17430:169;:::o;17605:366::-;17747:3;17768:67;17832:2;17827:3;17768:67;:::i;:::-;17761:74;;17844:93;17933:3;17844:93;:::i;:::-;17962:2;17957:3;17953:12;17946:19;;17605:366;;;:::o;17977:419::-;18143:4;18181:2;18170:9;18166:18;18158:26;;18230:9;18224:4;18220:20;18216:1;18205:9;18201:17;18194:47;18258:131;18384:4;18258:131;:::i;:::-;18250:139;;17977:419;;;:::o;18402:237::-;18440:3;18459:18;18475:1;18459:18;:::i;:::-;18454:23;;18491:18;18507:1;18491:18;:::i;:::-;18486:23;;18581:1;18575:4;18571:12;18568:1;18565:19;18562:45;;;18587:18;;:::i;:::-;18562:45;18631:1;18628;18624:9;18617:16;;18402:237;;;;:::o;18645:173::-;18785:25;18781:1;18773:6;18769:14;18762:49;18645:173;:::o;18824:366::-;18966:3;18987:67;19051:2;19046:3;18987:67;:::i;:::-;18980:74;;19063:93;19152:3;19063:93;:::i;:::-;19181:2;19176:3;19172:12;19165:19;;18824:366;;;:::o;19196:419::-;19362:4;19400:2;19389:9;19385:18;19377:26;;19449:9;19443:4;19439:20;19435:1;19424:9;19420:17;19413:47;19477:131;19603:4;19477:131;:::i;:::-;19469:139;;19196:419;;;:::o;19621:348::-;19661:7;19684:20;19702:1;19684:20;:::i;:::-;19679:25;;19718:20;19736:1;19718:20;:::i;:::-;19713:25;;19906:1;19838:66;19834:74;19831:1;19828:81;19823:1;19816:9;19809:17;19805:105;19802:131;;;19913:18;;:::i;:::-;19802:131;19961:1;19958;19954:9;19943:20;;19621:348;;;;:::o;19975:169::-;20115:21;20111:1;20103:6;20099:14;20092:45;19975:169;:::o;20150:366::-;20292:3;20313:67;20377:2;20372:3;20313:67;:::i;:::-;20306:74;;20389:93;20478:3;20389:93;:::i;:::-;20507:2;20502:3;20498:12;20491:19;;20150:366;;;:::o;20522:419::-;20688:4;20726:2;20715:9;20711:18;20703:26;;20775:9;20769:4;20765:20;20761:1;20750:9;20746:17;20739:47;20803:131;20929:4;20803:131;:::i;:::-;20795:139;;20522:419;;;:::o;20947:185::-;20985:4;21005:18;21021:1;21005:18;:::i;:::-;21000:23;;21037:18;21053:1;21037:18;:::i;:::-;21032:23;;21074:1;21071;21068:8;21065:34;;;21079:18;;:::i;:::-;21065:34;21124:1;21121;21117:9;21109:17;;20947:185;;;;:::o;21138:234::-;21278:34;21274:1;21266:6;21262:14;21255:58;21347:17;21342:2;21334:6;21330:15;21323:42;21138:234;:::o;21378:366::-;21520:3;21541:67;21605:2;21600:3;21541:67;:::i;:::-;21534:74;;21617:93;21706:3;21617:93;:::i;:::-;21735:2;21730:3;21726:12;21719:19;;21378:366;;;:::o;21750:419::-;21916:4;21954:2;21943:9;21939:18;21931:26;;22003:9;21997:4;21993:20;21989:1;21978:9;21974:17;21967:47;22031:131;22157:4;22031:131;:::i;:::-;22023:139;;21750:419;;;:::o;22175:148::-;22277:11;22314:3;22299:18;;22175:148;;;;:::o;22329:377::-;22435:3;22463:39;22496:5;22463:39;:::i;:::-;22518:89;22600:6;22595:3;22518:89;:::i;:::-;22511:96;;22616:52;22661:6;22656:3;22649:4;22642:5;22638:16;22616:52;:::i;:::-;22693:6;22688:3;22684:16;22677:23;;22439:267;22329:377;;;;:::o;22712:141::-;22761:4;22784:3;22776:11;;22807:3;22804:1;22797:14;22841:4;22838:1;22828:18;22820:26;;22712:141;;;:::o;22883:845::-;22986:3;23023:5;23017:12;23052:36;23078:9;23052:36;:::i;:::-;23104:89;23186:6;23181:3;23104:89;:::i;:::-;23097:96;;23224:1;23213:9;23209:17;23240:1;23235:137;;;;23386:1;23381:341;;;;23202:520;;23235:137;23319:4;23315:9;23304;23300:25;23295:3;23288:38;23355:6;23350:3;23346:16;23339:23;;23235:137;;23381:341;23448:38;23480:5;23448:38;:::i;:::-;23508:1;23522:154;23536:6;23533:1;23530:13;23522:154;;;23610:7;23604:14;23600:1;23595:3;23591:11;23584:35;23660:1;23651:7;23647:15;23636:26;;23558:4;23555:1;23551:12;23546:17;;23522:154;;;23705:6;23700:3;23696:16;23689:23;;23388:334;;23202:520;;22990:738;;22883:845;;;;:::o;23734:589::-;23959:3;23981:95;24072:3;24063:6;23981:95;:::i;:::-;23974:102;;24093:95;24184:3;24175:6;24093:95;:::i;:::-;24086:102;;24205:92;24293:3;24284:6;24205:92;:::i;:::-;24198:99;;24314:3;24307:10;;23734:589;;;;;;:::o;24329:225::-;24469:34;24465:1;24457:6;24453:14;24446:58;24538:8;24533:2;24525:6;24521:15;24514:33;24329:225;:::o;24560:366::-;24702:3;24723:67;24787:2;24782:3;24723:67;:::i;:::-;24716:74;;24799:93;24888:3;24799:93;:::i;:::-;24917:2;24912:3;24908:12;24901:19;;24560:366;;;:::o;24932:419::-;25098:4;25136:2;25125:9;25121:18;25113:26;;25185:9;25179:4;25175:20;25171:1;25160:9;25156:17;25149:47;25213:131;25339:4;25213:131;:::i;:::-;25205:139;;24932:419;;;:::o;25357:233::-;25396:3;25419:24;25437:5;25419:24;:::i;:::-;25410:33;;25465:66;25458:5;25455:77;25452:103;;25535:18;;:::i;:::-;25452:103;25582:1;25575:5;25571:13;25564:20;;25357:233;;;:::o;25596:180::-;25644:77;25641:1;25634:88;25741:4;25738:1;25731:15;25765:4;25762:1;25755:15;25782:185;25822:1;25839:20;25857:1;25839:20;:::i;:::-;25834:25;;25873:20;25891:1;25873:20;:::i;:::-;25868:25;;25912:1;25902:35;;25917:18;;:::i;:::-;25902:35;25959:1;25956;25952:9;25947:14;;25782:185;;;;:::o;25973:191::-;26013:4;26033:20;26051:1;26033:20;:::i;:::-;26028:25;;26067:20;26085:1;26067:20;:::i;:::-;26062:25;;26106:1;26103;26100:8;26097:34;;;26111:18;;:::i;:::-;26097:34;26156:1;26153;26149:9;26141:17;;25973:191;;;;:::o;26170:176::-;26202:1;26219:20;26237:1;26219:20;:::i;:::-;26214:25;;26253:20;26271:1;26253:20;:::i;:::-;26248:25;;26292:1;26282:35;;26297:18;;:::i;:::-;26282:35;26338:1;26335;26331:9;26326:14;;26170:176;;;;:::o;26352:305::-;26392:3;26411:20;26429:1;26411:20;:::i;:::-;26406:25;;26445:20;26463:1;26445:20;:::i;:::-;26440:25;;26599:1;26531:66;26527:74;26524:1;26521:81;26518:107;;;26605:18;;:::i;:::-;26518:107;26649:1;26646;26642:9;26635:16;;26352:305;;;;:::o;26663:180::-;26711:77;26708:1;26701:88;26808:4;26805:1;26798:15;26832:4;26829:1;26822:15;26849:98;26900:6;26934:5;26928:12;26918:22;;26849:98;;;:::o;26953:168::-;27036:11;27070:6;27065:3;27058:19;27110:4;27105:3;27101:14;27086:29;;26953:168;;;;:::o;27127:360::-;27213:3;27241:38;27273:5;27241:38;:::i;:::-;27295:70;27358:6;27353:3;27295:70;:::i;:::-;27288:77;;27374:52;27419:6;27414:3;27407:4;27400:5;27396:16;27374:52;:::i;:::-;27451:29;27473:6;27451:29;:::i;:::-;27446:3;27442:39;27435:46;;27217:270;27127:360;;;;:::o;27493:640::-;27688:4;27726:3;27715:9;27711:19;27703:27;;27740:71;27808:1;27797:9;27793:17;27784:6;27740:71;:::i;:::-;27821:72;27889:2;27878:9;27874:18;27865:6;27821:72;:::i;:::-;27903;27971:2;27960:9;27956:18;27947:6;27903:72;:::i;:::-;28022:9;28016:4;28012:20;28007:2;27996:9;27992:18;27985:48;28050:76;28121:4;28112:6;28050:76;:::i;:::-;28042:84;;27493:640;;;;;;;:::o;28139:141::-;28195:5;28226:6;28220:13;28211:22;;28242:32;28268:5;28242:32;:::i;:::-;28139:141;;;;:::o;28286:349::-;28355:6;28404:2;28392:9;28383:7;28379:23;28375:32;28372:119;;;28410:79;;:::i;:::-;28372:119;28530:1;28555:63;28610:7;28601:6;28590:9;28586:22;28555:63;:::i;:::-;28545:73;;28501:127;28286:349;;;;:::o

Swarm Source

ipfs://846e97d5b1c82c2c0902ebdd176504b842a44ed73779406fcd5342126e291828
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.