APE Price: $0.60 (-10.16%)

Token

OWL (OWL)

Overview

Max Total Supply

222 OWL

Holders

2

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
22 OWL
0x62c7d5cfd6756b3b9bc41a55c5493d4d80c6f24c
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
OWL

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at apescan.io on 2024-10-30
*/

// SPDX-License-Identifier: MIT
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;
    }
}
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);
    }
}
pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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);
            }
        }
    }
}
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);
}
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);
}
pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
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;
    }
}
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;
}
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);
}
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
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 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_;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @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) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        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) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        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) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        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 {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _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 (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 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 (!_checkOnERC721Received(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 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;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

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

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

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // 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;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // 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[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, 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 address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * 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 {}
}
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

contract OWL  is Ownable, ERC721A{

    uint public maxSupply = 2222;
    string public baseURI = "https://owlfreemintapi.vercel.app/api/nft/";

    bool public salePaused = false;
    mapping(address => uint) public mintingCount;

    uint maxMintAllowed = 2;

    uint public salePrice = 0 ether;

    constructor() ERC721A("OWL", "OWL"){}

    function sendNftstoMultipleWallets(address[] memory _wallets) external onlyOwner{
        require(totalSupply() + _wallets.length <= maxSupply, "Max Supply Reached.");
        for(uint i = 0; i < _wallets.length; i++)
            _safeMint(_wallets[i], 1);
    }
    function sendManyNfts(address _reciever, uint256 _count) external onlyOwner{
            require(totalSupply() + _count <= maxSupply, "Max Supply Reached.");
            _safeMint(_reciever, _count);
    }

    function mint(uint256 _quantity) external payable {
        // Normal requirements
        require(!salePaused, "Sale is paused!");
        require(_quantity > 0, "Minimum 1 NFT has to be minted per transaction");
        require(_quantity + totalSupply() <= maxSupply, "Sold out");
        require(msg.value >= salePrice * _quantity, "Please send correct amount.");
        require(_quantity + mintingCount[msg.sender] <= maxMintAllowed, "You cannot mint more than 2 nfts.");
       
        // Mint
        _safeMint(msg.sender, _quantity);
        mintingCount[msg.sender] = mintingCount[msg.sender] + _quantity;
    }

    function setBaseUri(string memory _uri) external onlyOwner {
        baseURI = _uri;
    }
    function setSalePaused(bool temp) external onlyOwner {
        salePaused = temp;
    }

    function setSalePrice(uint temp) external onlyOwner {
        salePrice = temp;
    }

    function setMaxSupply(uint _temp) external onlyOwner{
        maxSupply = _temp;
    }

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

    function withdraw(address _to) external onlyOwner {
        uint _balance = address(this).balance;
        payable(_to).transfer(_balance);
       
    }
        function withdrawAmount(address _to, uint amountInWei) external onlyOwner {
        payable(_to).transfer(amountInWei);
       
    }
}

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":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintingCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"salePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reciever","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"sendManyNfts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"sendNftstoMultipleWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_temp","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"temp","type":"bool"}],"name":"setSalePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"temp","type":"uint256"}],"name":"setSalePrice","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":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"amountInWei","type":"uint256"}],"name":"withdrawAmount","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526108ae6009556040518060600160405280602a8152602001613fb4602a9139600a90816100319190610411565b505f600b5f6101000a81548160ff0219169083151502179055506002600d555f600e5534801561005f575f80fd5b506040518060400160405280600381526020017f4f574c00000000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4f574c00000000000000000000000000000000000000000000000000000000008152506100e86100dd61010f60201b60201c565b61011660201b60201c565b81600390816100f79190610411565b5080600490816101079190610411565b5050506104e0565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061025257607f821691505b6020821081036102655761026461020e565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026102c77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261028c565b6102d1868361028c565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61031561031061030b846102e9565b6102f2565b6102e9565b9050919050565b5f819050919050565b61032e836102fb565b61034261033a8261031c565b848454610298565b825550505050565b5f90565b61035661034a565b610361818484610325565b505050565b5b81811015610384576103795f8261034e565b600181019050610367565b5050565b601f8211156103c95761039a8161026b565b6103a38461027d565b810160208510156103b2578190505b6103c66103be8561027d565b830182610366565b50505b505050565b5f82821c905092915050565b5f6103e95f19846008026103ce565b1980831691505092915050565b5f61040183836103da565b9150826002028217905092915050565b61041a826101d7565b67ffffffffffffffff811115610433576104326101e1565b5b61043d825461023b565b610448828285610388565b5f60209050601f831160018114610479575f8415610467578287015190505b61047185826103f6565b8655506104d8565b601f1984166104878661026b565b5f5b828110156104ae57848901518255600182019150602085019450602081019050610489565b868310156104cb57848901516104c7601f8916826103da565b8355505b6001600288020188555050505b505050505050565b613ac7806104ed5f395ff3fe6080604052600436106101d7575f3560e01c8063715018a611610101578063a22cb46511610094578063d5abeb0111610063578063d5abeb0114610679578063e985e9c5146106a3578063f2fde38b146106df578063f51f96dd14610707576101d7565b8063a22cb465146105b1578063b4b42a3b146105d9578063b88d4fde14610615578063c87b56dd1461063d576101d7565b80638da5cb5b116100d05780638da5cb5b1461051957806395d89b4114610543578063a0712d681461056d578063a0bcfc7f14610589576101d7565b8063715018a61461048b578063736fe565146104a15780638a0c5204146104c95780638d92becd146104f1576101d7565b806340a72310116101795780636352211e116101485780636352211e146103c15780636c0360eb146103fd5780636f8b44b01461042757806370a082311461044f576101d7565b806340a723101461031f57806342842e0e1461034757806351cff8d91461036f5780635d08c1ae14610397576101d7565b8063095ea7b3116101b5578063095ea7b31461027d57806318160ddd146102a55780631919fed7146102cf57806323b872dd146102f7576101d7565b806301ffc9a7146101db57806306fdde0314610217578063081812fc14610241575b5f80fd5b3480156101e6575f80fd5b5061020160048036038101906101fc91906129ed565b610731565b60405161020e9190612a32565b60405180910390f35b348015610222575f80fd5b5061022b610812565b6040516102389190612abb565b60405180910390f35b34801561024c575f80fd5b5061026760048036038101906102629190612b0e565b6108a2565b6040516102749190612b78565b60405180910390f35b348015610288575f80fd5b506102a3600480360381019061029e9190612bbb565b61091a565b005b3480156102b0575f80fd5b506102b9610a23565b6040516102c69190612c08565b60405180910390f35b3480156102da575f80fd5b506102f560048036038101906102f09190612b0e565b610a30565b005b348015610302575f80fd5b5061031d60048036038101906103189190612c21565b610ab6565b005b34801561032a575f80fd5b5061034560048036038101906103409190612bbb565b610ac6565b005b348015610352575f80fd5b5061036d60048036038101906103689190612c21565b610ba7565b005b34801561037a575f80fd5b5061039560048036038101906103909190612c71565b610bc6565b005b3480156103a2575f80fd5b506103ab610c8e565b6040516103b89190612a32565b60405180910390f35b3480156103cc575f80fd5b506103e760048036038101906103e29190612b0e565b610ca0565b6040516103f49190612b78565b60405180910390f35b348015610408575f80fd5b50610411610cb4565b60405161041e9190612abb565b60405180910390f35b348015610432575f80fd5b5061044d60048036038101906104489190612b0e565b610d40565b005b34801561045a575f80fd5b5061047560048036038101906104709190612c71565b610dc6565b6040516104829190612c08565b60405180910390f35b348015610496575f80fd5b5061049f610e90565b005b3480156104ac575f80fd5b506104c760048036038101906104c29190612bbb565b610f17565b005b3480156104d4575f80fd5b506104ef60048036038101906104ea9190612ddc565b610fdb565b005b3480156104fc575f80fd5b5061051760048036038101906105129190612e4d565b6110f0565b005b348015610524575f80fd5b5061052d611188565b60405161053a9190612b78565b60405180910390f35b34801561054e575f80fd5b506105576111af565b6040516105649190612abb565b60405180910390f35b61058760048036038101906105829190612b0e565b61123f565b005b348015610594575f80fd5b506105af60048036038101906105aa9190612f28565b61149b565b005b3480156105bc575f80fd5b506105d760048036038101906105d29190612f6f565b61152a565b005b3480156105e4575f80fd5b506105ff60048036038101906105fa9190612c71565b61169c565b60405161060c9190612c08565b60405180910390f35b348015610620575f80fd5b5061063b6004803603810190610636919061304b565b6116b1565b005b348015610648575f80fd5b50610663600480360381019061065e9190612b0e565b611704565b6040516106709190612abb565b60405180910390f35b348015610684575f80fd5b5061068d61179f565b60405161069a9190612c08565b60405180910390f35b3480156106ae575f80fd5b506106c960048036038101906106c491906130cb565b6117a5565b6040516106d69190612a32565b60405180910390f35b3480156106ea575f80fd5b5061070560048036038101906107009190612c71565b611833565b005b348015610712575f80fd5b5061071b611929565b6040516107289190612c08565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107fb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061080b575061080a8261192f565b5b9050919050565b60606003805461082190613136565b80601f016020809104026020016040519081016040528092919081815260200182805461084d90613136565b80156108985780601f1061086f57610100808354040283529160200191610898565b820191905f5260205f20905b81548152906001019060200180831161087b57829003601f168201915b5050505050905090565b5f6108ac82611998565b6108e2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f61092482610ca0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361098b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109aa6119cf565b73ffffffffffffffffffffffffffffffffffffffff16141580156109dc57506109da816109d56119cf565b6117a5565b155b15610a13576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a1e8383836119d6565b505050565b5f60025460015403905090565b610a386119cf565b73ffffffffffffffffffffffffffffffffffffffff16610a56611188565b73ffffffffffffffffffffffffffffffffffffffff1614610aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa3906131b0565b60405180910390fd5b80600e8190555050565b610ac1838383611a85565b505050565b610ace6119cf565b73ffffffffffffffffffffffffffffffffffffffff16610aec611188565b73ffffffffffffffffffffffffffffffffffffffff1614610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b39906131b0565b60405180910390fd5b60095481610b4e610a23565b610b5891906131fb565b1115610b99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9090613278565b60405180910390fd5b610ba38282611f4f565b5050565b610bc183838360405180602001604052805f8152506116b1565b505050565b610bce6119cf565b73ffffffffffffffffffffffffffffffffffffffff16610bec611188565b73ffffffffffffffffffffffffffffffffffffffff1614610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c39906131b0565b60405180910390fd5b5f4790508173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610c89573d5f803e3d5ffd5b505050565b600b5f9054906101000a900460ff1681565b5f610caa82611f6c565b5f01519050919050565b600a8054610cc190613136565b80601f0160208091040260200160405190810160405280929190818152602001828054610ced90613136565b8015610d385780601f10610d0f57610100808354040283529160200191610d38565b820191905f5260205f20905b815481529060010190602001808311610d1b57829003601f168201915b505050505081565b610d486119cf565b73ffffffffffffffffffffffffffffffffffffffff16610d66611188565b73ffffffffffffffffffffffffffffffffffffffff1614610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db3906131b0565b60405180910390fd5b8060098190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e2c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610e986119cf565b73ffffffffffffffffffffffffffffffffffffffff16610eb6611188565b73ffffffffffffffffffffffffffffffffffffffff1614610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f03906131b0565b60405180910390fd5b610f155f6121d6565b565b610f1f6119cf565b73ffffffffffffffffffffffffffffffffffffffff16610f3d611188565b73ffffffffffffffffffffffffffffffffffffffff1614610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a906131b0565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610fd6573d5f803e3d5ffd5b505050565b610fe36119cf565b73ffffffffffffffffffffffffffffffffffffffff16611001611188565b73ffffffffffffffffffffffffffffffffffffffff1614611057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104e906131b0565b60405180910390fd5b6009548151611064610a23565b61106e91906131fb565b11156110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a690613278565b60405180910390fd5b5f5b81518110156110ec576110df8282815181106110d0576110cf613296565b5b60200260200101516001611f4f565b80806001019150506110b1565b5050565b6110f86119cf565b73ffffffffffffffffffffffffffffffffffffffff16611116611188565b73ffffffffffffffffffffffffffffffffffffffff161461116c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611163906131b0565b60405180910390fd5b80600b5f6101000a81548160ff02191690831515021790555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546111be90613136565b80601f01602080910402602001604051908101604052809291908181526020018280546111ea90613136565b80156112355780601f1061120c57610100808354040283529160200191611235565b820191905f5260205f20905b81548152906001019060200180831161121857829003601f168201915b5050505050905090565b600b5f9054906101000a900460ff161561128e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112859061330d565b60405180910390fd5b5f81116112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c79061339b565b60405180910390fd5b6009546112db610a23565b826112e691906131fb565b1115611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90613403565b60405180910390fd5b80600e546113359190613421565b341015611377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136e906134ac565b60405180910390fd5b600d54600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054826113c391906131fb565b1115611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb9061353a565b60405180910390fd5b61140e3382611f4f565b80600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461145791906131fb565b600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555050565b6114a36119cf565b73ffffffffffffffffffffffffffffffffffffffff166114c1611188565b73ffffffffffffffffffffffffffffffffffffffff1614611517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150e906131b0565b60405180910390fd5b80600a908161152691906136f5565b5050565b6115326119cf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611596576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060085f6115a26119cf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661164b6119cf565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116909190612a32565b60405180910390a35050565b600c602052805f5260405f205f915090505481565b6116bc848484611a85565b6116c884848484612297565b6116fe576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061170f82611998565b611745576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61174e612410565b90505f81510361176c5760405180602001604052805f815250611797565b80611776846124a0565b6040516020016117879291906137fe565b6040516020818303038152906040525b915050919050565b60095481565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b61183b6119cf565b73ffffffffffffffffffffffffffffffffffffffff16611859611188565b73ffffffffffffffffffffffffffffffffffffffff16146118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a6906131b0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361191d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191490613891565b60405180910390fd5b611926816121d6565b50565b600e5481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f600154821080156119c8575060055f8381526020019081526020015f205f01601c9054906101000a900460ff16155b9050919050565b5f33905090565b8260075f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f611a8f82611f6c565b90505f815f015173ffffffffffffffffffffffffffffffffffffffff16611ab46119cf565b73ffffffffffffffffffffffffffffffffffffffff161480611ae65750611ae5825f0151611ae06119cf565b6117a5565b5b80611b2b5750611af46119cf565b73ffffffffffffffffffffffffffffffffffffffff16611b13846108a2565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611b64576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff1614611bcc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c31576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c3e85858560016125f9565b611c4c5f84845f01516119d6565b600160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360055f8581526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260055f8581526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f6001840190505f73ffffffffffffffffffffffffffffffffffffffff1660055f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611edf57600154811015611ede57825f015160055f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826020015160055f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f4885858560016125ff565b5050505050565b611f68828260405180602001604052805f815250612605565b5050565b611f74612947565b5f82905060015481101561219f575f60055f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff1615151515815250509050806040015161219d575f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16146120895780925050506121d1565b5b60011561219c5781806001900392505060055f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16146121975780925050506121d1565b61208a565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6122b78473ffffffffffffffffffffffffffffffffffffffff16612617565b15612403578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122e06119cf565b8786866040518563ffffffff1660e01b81526004016123029493929190613901565b6020604051808303815f875af192505050801561233d57506040513d601f19601f8201168201806040525081019061233a919061395f565b60015b6123b3573d805f811461236b576040519150601f19603f3d011682016040523d82523d5f602084013e612370565b606091505b505f8151036123ab576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612408565b600190505b949350505050565b6060600a805461241f90613136565b80601f016020809104026020016040519081016040528092919081815260200182805461244b90613136565b80156124965780601f1061246d57610100808354040283529160200191612496565b820191905f5260205f20905b81548152906001019060200180831161247957829003601f168201915b5050505050905090565b60605f82036124e6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125f4565b5f8290505f5b5f82146125155780806124fe9061398a565b915050600a8261250e91906139fe565b91506124ec565b5f8167ffffffffffffffff8111156125305761252f612ca0565b5b6040519080825280601f01601f1916602001820160405280156125625781602001600182028036833780820191505090505b5090505b5f85146125ed5760018261257a9190613a2e565b9150600a856125899190613a61565b603061259591906131fb565b60f81b8183815181106125ab576125aa613296565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a856125e691906139fe565b9450612566565b8093505050505b919050565b50505050565b50505050565b6126128383836001612628565b505050565b5f80823b90505f8111915050919050565b5f60015490505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612693576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f84036126cc576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126d85f8683876125f9565b8360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508460055f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260055f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f8190505f5b8581101561292b57818773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156128df57506128dd5f888488612297565b155b15612916576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612866565b5080600181905550506129405f8683876125ff565b5050505050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129cc81612998565b81146129d6575f80fd5b50565b5f813590506129e7816129c3565b92915050565b5f60208284031215612a0257612a01612990565b5b5f612a0f848285016129d9565b91505092915050565b5f8115159050919050565b612a2c81612a18565b82525050565b5f602082019050612a455f830184612a23565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612a8d82612a4b565b612a978185612a55565b9350612aa7818560208601612a65565b612ab081612a73565b840191505092915050565b5f6020820190508181035f830152612ad38184612a83565b905092915050565b5f819050919050565b612aed81612adb565b8114612af7575f80fd5b50565b5f81359050612b0881612ae4565b92915050565b5f60208284031215612b2357612b22612990565b5b5f612b3084828501612afa565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612b6282612b39565b9050919050565b612b7281612b58565b82525050565b5f602082019050612b8b5f830184612b69565b92915050565b612b9a81612b58565b8114612ba4575f80fd5b50565b5f81359050612bb581612b91565b92915050565b5f8060408385031215612bd157612bd0612990565b5b5f612bde85828601612ba7565b9250506020612bef85828601612afa565b9150509250929050565b612c0281612adb565b82525050565b5f602082019050612c1b5f830184612bf9565b92915050565b5f805f60608486031215612c3857612c37612990565b5b5f612c4586828701612ba7565b9350506020612c5686828701612ba7565b9250506040612c6786828701612afa565b9150509250925092565b5f60208284031215612c8657612c85612990565b5b5f612c9384828501612ba7565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612cd682612a73565b810181811067ffffffffffffffff82111715612cf557612cf4612ca0565b5b80604052505050565b5f612d07612987565b9050612d138282612ccd565b919050565b5f67ffffffffffffffff821115612d3257612d31612ca0565b5b602082029050602081019050919050565b5f80fd5b5f612d59612d5484612d18565b612cfe565b90508083825260208201905060208402830185811115612d7c57612d7b612d43565b5b835b81811015612da55780612d918882612ba7565b845260208401935050602081019050612d7e565b5050509392505050565b5f82601f830112612dc357612dc2612c9c565b5b8135612dd3848260208601612d47565b91505092915050565b5f60208284031215612df157612df0612990565b5b5f82013567ffffffffffffffff811115612e0e57612e0d612994565b5b612e1a84828501612daf565b91505092915050565b612e2c81612a18565b8114612e36575f80fd5b50565b5f81359050612e4781612e23565b92915050565b5f60208284031215612e6257612e61612990565b5b5f612e6f84828501612e39565b91505092915050565b5f80fd5b5f67ffffffffffffffff821115612e9657612e95612ca0565b5b612e9f82612a73565b9050602081019050919050565b828183375f83830152505050565b5f612ecc612ec784612e7c565b612cfe565b905082815260208101848484011115612ee857612ee7612e78565b5b612ef3848285612eac565b509392505050565b5f82601f830112612f0f57612f0e612c9c565b5b8135612f1f848260208601612eba565b91505092915050565b5f60208284031215612f3d57612f3c612990565b5b5f82013567ffffffffffffffff811115612f5a57612f59612994565b5b612f6684828501612efb565b91505092915050565b5f8060408385031215612f8557612f84612990565b5b5f612f9285828601612ba7565b9250506020612fa385828601612e39565b9150509250929050565b5f67ffffffffffffffff821115612fc757612fc6612ca0565b5b612fd082612a73565b9050602081019050919050565b5f612fef612fea84612fad565b612cfe565b90508281526020810184848401111561300b5761300a612e78565b5b613016848285612eac565b509392505050565b5f82601f83011261303257613031612c9c565b5b8135613042848260208601612fdd565b91505092915050565b5f805f806080858703121561306357613062612990565b5b5f61307087828801612ba7565b945050602061308187828801612ba7565b935050604061309287828801612afa565b925050606085013567ffffffffffffffff8111156130b3576130b2612994565b5b6130bf8782880161301e565b91505092959194509250565b5f80604083850312156130e1576130e0612990565b5b5f6130ee85828601612ba7565b92505060206130ff85828601612ba7565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061314d57607f821691505b6020821081036131605761315f613109565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61319a602083612a55565b91506131a582613166565b602082019050919050565b5f6020820190508181035f8301526131c78161318e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61320582612adb565b915061321083612adb565b9250828201905080821115613228576132276131ce565b5b92915050565b7f4d617820537570706c7920526561636865642e000000000000000000000000005f82015250565b5f613262601383612a55565b915061326d8261322e565b602082019050919050565b5f6020820190508181035f83015261328f81613256565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f53616c65206973207061757365642100000000000000000000000000000000005f82015250565b5f6132f7600f83612a55565b9150613302826132c3565b602082019050919050565b5f6020820190508181035f830152613324816132eb565b9050919050565b7f4d696e696d756d2031204e46542068617320746f206265206d696e74656420705f8201527f6572207472616e73616374696f6e000000000000000000000000000000000000602082015250565b5f613385602e83612a55565b91506133908261332b565b604082019050919050565b5f6020820190508181035f8301526133b281613379565b9050919050565b7f536f6c64206f75740000000000000000000000000000000000000000000000005f82015250565b5f6133ed600883612a55565b91506133f8826133b9565b602082019050919050565b5f6020820190508181035f83015261341a816133e1565b9050919050565b5f61342b82612adb565b915061343683612adb565b925082820261344481612adb565b9150828204841483151761345b5761345a6131ce565b5b5092915050565b7f506c656173652073656e6420636f727265637420616d6f756e742e00000000005f82015250565b5f613496601b83612a55565b91506134a182613462565b602082019050919050565b5f6020820190508181035f8301526134c38161348a565b9050919050565b7f596f752063616e6e6f74206d696e74206d6f7265207468616e2032206e6674735f8201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b5f613524602183612a55565b915061352f826134ca565b604082019050919050565b5f6020820190508181035f83015261355181613518565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026135b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613579565b6135be8683613579565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6135f96135f46135ef84612adb565b6135d6565b612adb565b9050919050565b5f819050919050565b613612836135df565b61362661361e82613600565b848454613585565b825550505050565b5f90565b61363a61362e565b613645818484613609565b505050565b5b818110156136685761365d5f82613632565b60018101905061364b565b5050565b601f8211156136ad5761367e81613558565b6136878461356a565b81016020851015613696578190505b6136aa6136a28561356a565b83018261364a565b50505b505050565b5f82821c905092915050565b5f6136cd5f19846008026136b2565b1980831691505092915050565b5f6136e583836136be565b9150826002028217905092915050565b6136fe82612a4b565b67ffffffffffffffff81111561371757613716612ca0565b5b6137218254613136565b61372c82828561366c565b5f60209050601f83116001811461375d575f841561374b578287015190505b61375585826136da565b8655506137bc565b601f19841661376b86613558565b5f5b828110156137925784890151825560018201915060208501945060208101905061376d565b868310156137af57848901516137ab601f8916826136be565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f6137d882612a4b565b6137e281856137c4565b93506137f2818560208601612a65565b80840191505092915050565b5f61380982856137ce565b915061381582846137ce565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61387b602683612a55565b915061388682613821565b604082019050919050565b5f6020820190508181035f8301526138a88161386f565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6138d3826138af565b6138dd81856138b9565b93506138ed818560208601612a65565b6138f681612a73565b840191505092915050565b5f6080820190506139145f830187612b69565b6139216020830186612b69565b61392e6040830185612bf9565b818103606083015261394081846138c9565b905095945050505050565b5f81519050613959816129c3565b92915050565b5f6020828403121561397457613973612990565b5b5f6139818482850161394b565b91505092915050565b5f61399482612adb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139c6576139c56131ce565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613a0882612adb565b9150613a1383612adb565b925082613a2357613a226139d1565b5b828204905092915050565b5f613a3882612adb565b9150613a4383612adb565b9250828203905081811115613a5b57613a5a6131ce565b5b92915050565b5f613a6b82612adb565b9150613a7683612adb565b925082613a8657613a856139d1565b5b82820690509291505056fea26469706673582212202c51a9856064acc2586492464d0858603433a865e164f62bc6f2ed93b119a06c64736f6c634300081a003368747470733a2f2f6f776c667265656d696e746170692e76657263656c2e6170702f6170692f6e66742f

Deployed Bytecode

0x6080604052600436106101d7575f3560e01c8063715018a611610101578063a22cb46511610094578063d5abeb0111610063578063d5abeb0114610679578063e985e9c5146106a3578063f2fde38b146106df578063f51f96dd14610707576101d7565b8063a22cb465146105b1578063b4b42a3b146105d9578063b88d4fde14610615578063c87b56dd1461063d576101d7565b80638da5cb5b116100d05780638da5cb5b1461051957806395d89b4114610543578063a0712d681461056d578063a0bcfc7f14610589576101d7565b8063715018a61461048b578063736fe565146104a15780638a0c5204146104c95780638d92becd146104f1576101d7565b806340a72310116101795780636352211e116101485780636352211e146103c15780636c0360eb146103fd5780636f8b44b01461042757806370a082311461044f576101d7565b806340a723101461031f57806342842e0e1461034757806351cff8d91461036f5780635d08c1ae14610397576101d7565b8063095ea7b3116101b5578063095ea7b31461027d57806318160ddd146102a55780631919fed7146102cf57806323b872dd146102f7576101d7565b806301ffc9a7146101db57806306fdde0314610217578063081812fc14610241575b5f80fd5b3480156101e6575f80fd5b5061020160048036038101906101fc91906129ed565b610731565b60405161020e9190612a32565b60405180910390f35b348015610222575f80fd5b5061022b610812565b6040516102389190612abb565b60405180910390f35b34801561024c575f80fd5b5061026760048036038101906102629190612b0e565b6108a2565b6040516102749190612b78565b60405180910390f35b348015610288575f80fd5b506102a3600480360381019061029e9190612bbb565b61091a565b005b3480156102b0575f80fd5b506102b9610a23565b6040516102c69190612c08565b60405180910390f35b3480156102da575f80fd5b506102f560048036038101906102f09190612b0e565b610a30565b005b348015610302575f80fd5b5061031d60048036038101906103189190612c21565b610ab6565b005b34801561032a575f80fd5b5061034560048036038101906103409190612bbb565b610ac6565b005b348015610352575f80fd5b5061036d60048036038101906103689190612c21565b610ba7565b005b34801561037a575f80fd5b5061039560048036038101906103909190612c71565b610bc6565b005b3480156103a2575f80fd5b506103ab610c8e565b6040516103b89190612a32565b60405180910390f35b3480156103cc575f80fd5b506103e760048036038101906103e29190612b0e565b610ca0565b6040516103f49190612b78565b60405180910390f35b348015610408575f80fd5b50610411610cb4565b60405161041e9190612abb565b60405180910390f35b348015610432575f80fd5b5061044d60048036038101906104489190612b0e565b610d40565b005b34801561045a575f80fd5b5061047560048036038101906104709190612c71565b610dc6565b6040516104829190612c08565b60405180910390f35b348015610496575f80fd5b5061049f610e90565b005b3480156104ac575f80fd5b506104c760048036038101906104c29190612bbb565b610f17565b005b3480156104d4575f80fd5b506104ef60048036038101906104ea9190612ddc565b610fdb565b005b3480156104fc575f80fd5b5061051760048036038101906105129190612e4d565b6110f0565b005b348015610524575f80fd5b5061052d611188565b60405161053a9190612b78565b60405180910390f35b34801561054e575f80fd5b506105576111af565b6040516105649190612abb565b60405180910390f35b61058760048036038101906105829190612b0e565b61123f565b005b348015610594575f80fd5b506105af60048036038101906105aa9190612f28565b61149b565b005b3480156105bc575f80fd5b506105d760048036038101906105d29190612f6f565b61152a565b005b3480156105e4575f80fd5b506105ff60048036038101906105fa9190612c71565b61169c565b60405161060c9190612c08565b60405180910390f35b348015610620575f80fd5b5061063b6004803603810190610636919061304b565b6116b1565b005b348015610648575f80fd5b50610663600480360381019061065e9190612b0e565b611704565b6040516106709190612abb565b60405180910390f35b348015610684575f80fd5b5061068d61179f565b60405161069a9190612c08565b60405180910390f35b3480156106ae575f80fd5b506106c960048036038101906106c491906130cb565b6117a5565b6040516106d69190612a32565b60405180910390f35b3480156106ea575f80fd5b5061070560048036038101906107009190612c71565b611833565b005b348015610712575f80fd5b5061071b611929565b6040516107289190612c08565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107fb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061080b575061080a8261192f565b5b9050919050565b60606003805461082190613136565b80601f016020809104026020016040519081016040528092919081815260200182805461084d90613136565b80156108985780601f1061086f57610100808354040283529160200191610898565b820191905f5260205f20905b81548152906001019060200180831161087b57829003601f168201915b5050505050905090565b5f6108ac82611998565b6108e2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f61092482610ca0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361098b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109aa6119cf565b73ffffffffffffffffffffffffffffffffffffffff16141580156109dc57506109da816109d56119cf565b6117a5565b155b15610a13576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a1e8383836119d6565b505050565b5f60025460015403905090565b610a386119cf565b73ffffffffffffffffffffffffffffffffffffffff16610a56611188565b73ffffffffffffffffffffffffffffffffffffffff1614610aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa3906131b0565b60405180910390fd5b80600e8190555050565b610ac1838383611a85565b505050565b610ace6119cf565b73ffffffffffffffffffffffffffffffffffffffff16610aec611188565b73ffffffffffffffffffffffffffffffffffffffff1614610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b39906131b0565b60405180910390fd5b60095481610b4e610a23565b610b5891906131fb565b1115610b99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9090613278565b60405180910390fd5b610ba38282611f4f565b5050565b610bc183838360405180602001604052805f8152506116b1565b505050565b610bce6119cf565b73ffffffffffffffffffffffffffffffffffffffff16610bec611188565b73ffffffffffffffffffffffffffffffffffffffff1614610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c39906131b0565b60405180910390fd5b5f4790508173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610c89573d5f803e3d5ffd5b505050565b600b5f9054906101000a900460ff1681565b5f610caa82611f6c565b5f01519050919050565b600a8054610cc190613136565b80601f0160208091040260200160405190810160405280929190818152602001828054610ced90613136565b8015610d385780601f10610d0f57610100808354040283529160200191610d38565b820191905f5260205f20905b815481529060010190602001808311610d1b57829003601f168201915b505050505081565b610d486119cf565b73ffffffffffffffffffffffffffffffffffffffff16610d66611188565b73ffffffffffffffffffffffffffffffffffffffff1614610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db3906131b0565b60405180910390fd5b8060098190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e2c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610e986119cf565b73ffffffffffffffffffffffffffffffffffffffff16610eb6611188565b73ffffffffffffffffffffffffffffffffffffffff1614610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f03906131b0565b60405180910390fd5b610f155f6121d6565b565b610f1f6119cf565b73ffffffffffffffffffffffffffffffffffffffff16610f3d611188565b73ffffffffffffffffffffffffffffffffffffffff1614610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a906131b0565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610fd6573d5f803e3d5ffd5b505050565b610fe36119cf565b73ffffffffffffffffffffffffffffffffffffffff16611001611188565b73ffffffffffffffffffffffffffffffffffffffff1614611057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104e906131b0565b60405180910390fd5b6009548151611064610a23565b61106e91906131fb565b11156110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a690613278565b60405180910390fd5b5f5b81518110156110ec576110df8282815181106110d0576110cf613296565b5b60200260200101516001611f4f565b80806001019150506110b1565b5050565b6110f86119cf565b73ffffffffffffffffffffffffffffffffffffffff16611116611188565b73ffffffffffffffffffffffffffffffffffffffff161461116c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611163906131b0565b60405180910390fd5b80600b5f6101000a81548160ff02191690831515021790555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546111be90613136565b80601f01602080910402602001604051908101604052809291908181526020018280546111ea90613136565b80156112355780601f1061120c57610100808354040283529160200191611235565b820191905f5260205f20905b81548152906001019060200180831161121857829003601f168201915b5050505050905090565b600b5f9054906101000a900460ff161561128e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112859061330d565b60405180910390fd5b5f81116112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c79061339b565b60405180910390fd5b6009546112db610a23565b826112e691906131fb565b1115611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90613403565b60405180910390fd5b80600e546113359190613421565b341015611377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136e906134ac565b60405180910390fd5b600d54600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054826113c391906131fb565b1115611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb9061353a565b60405180910390fd5b61140e3382611f4f565b80600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461145791906131fb565b600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555050565b6114a36119cf565b73ffffffffffffffffffffffffffffffffffffffff166114c1611188565b73ffffffffffffffffffffffffffffffffffffffff1614611517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150e906131b0565b60405180910390fd5b80600a908161152691906136f5565b5050565b6115326119cf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611596576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060085f6115a26119cf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661164b6119cf565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116909190612a32565b60405180910390a35050565b600c602052805f5260405f205f915090505481565b6116bc848484611a85565b6116c884848484612297565b6116fe576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061170f82611998565b611745576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61174e612410565b90505f81510361176c5760405180602001604052805f815250611797565b80611776846124a0565b6040516020016117879291906137fe565b6040516020818303038152906040525b915050919050565b60095481565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b61183b6119cf565b73ffffffffffffffffffffffffffffffffffffffff16611859611188565b73ffffffffffffffffffffffffffffffffffffffff16146118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a6906131b0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361191d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191490613891565b60405180910390fd5b611926816121d6565b50565b600e5481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f600154821080156119c8575060055f8381526020019081526020015f205f01601c9054906101000a900460ff16155b9050919050565b5f33905090565b8260075f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f611a8f82611f6c565b90505f815f015173ffffffffffffffffffffffffffffffffffffffff16611ab46119cf565b73ffffffffffffffffffffffffffffffffffffffff161480611ae65750611ae5825f0151611ae06119cf565b6117a5565b5b80611b2b5750611af46119cf565b73ffffffffffffffffffffffffffffffffffffffff16611b13846108a2565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611b64576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff1614611bcc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c31576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c3e85858560016125f9565b611c4c5f84845f01516119d6565b600160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360055f8581526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260055f8581526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f6001840190505f73ffffffffffffffffffffffffffffffffffffffff1660055f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611edf57600154811015611ede57825f015160055f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826020015160055f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f4885858560016125ff565b5050505050565b611f68828260405180602001604052805f815250612605565b5050565b611f74612947565b5f82905060015481101561219f575f60055f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff1615151515815250509050806040015161219d575f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16146120895780925050506121d1565b5b60011561219c5781806001900392505060055f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16146121975780925050506121d1565b61208a565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6122b78473ffffffffffffffffffffffffffffffffffffffff16612617565b15612403578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122e06119cf565b8786866040518563ffffffff1660e01b81526004016123029493929190613901565b6020604051808303815f875af192505050801561233d57506040513d601f19601f8201168201806040525081019061233a919061395f565b60015b6123b3573d805f811461236b576040519150601f19603f3d011682016040523d82523d5f602084013e612370565b606091505b505f8151036123ab576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612408565b600190505b949350505050565b6060600a805461241f90613136565b80601f016020809104026020016040519081016040528092919081815260200182805461244b90613136565b80156124965780601f1061246d57610100808354040283529160200191612496565b820191905f5260205f20905b81548152906001019060200180831161247957829003601f168201915b5050505050905090565b60605f82036124e6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125f4565b5f8290505f5b5f82146125155780806124fe9061398a565b915050600a8261250e91906139fe565b91506124ec565b5f8167ffffffffffffffff8111156125305761252f612ca0565b5b6040519080825280601f01601f1916602001820160405280156125625781602001600182028036833780820191505090505b5090505b5f85146125ed5760018261257a9190613a2e565b9150600a856125899190613a61565b603061259591906131fb565b60f81b8183815181106125ab576125aa613296565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a856125e691906139fe565b9450612566565b8093505050505b919050565b50505050565b50505050565b6126128383836001612628565b505050565b5f80823b90505f8111915050919050565b5f60015490505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612693576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f84036126cc576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126d85f8683876125f9565b8360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508460055f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260055f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f8190505f5b8581101561292b57818773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156128df57506128dd5f888488612297565b155b15612916576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612866565b5080600181905550506129405f8683876125ff565b5050505050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129cc81612998565b81146129d6575f80fd5b50565b5f813590506129e7816129c3565b92915050565b5f60208284031215612a0257612a01612990565b5b5f612a0f848285016129d9565b91505092915050565b5f8115159050919050565b612a2c81612a18565b82525050565b5f602082019050612a455f830184612a23565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612a8d82612a4b565b612a978185612a55565b9350612aa7818560208601612a65565b612ab081612a73565b840191505092915050565b5f6020820190508181035f830152612ad38184612a83565b905092915050565b5f819050919050565b612aed81612adb565b8114612af7575f80fd5b50565b5f81359050612b0881612ae4565b92915050565b5f60208284031215612b2357612b22612990565b5b5f612b3084828501612afa565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612b6282612b39565b9050919050565b612b7281612b58565b82525050565b5f602082019050612b8b5f830184612b69565b92915050565b612b9a81612b58565b8114612ba4575f80fd5b50565b5f81359050612bb581612b91565b92915050565b5f8060408385031215612bd157612bd0612990565b5b5f612bde85828601612ba7565b9250506020612bef85828601612afa565b9150509250929050565b612c0281612adb565b82525050565b5f602082019050612c1b5f830184612bf9565b92915050565b5f805f60608486031215612c3857612c37612990565b5b5f612c4586828701612ba7565b9350506020612c5686828701612ba7565b9250506040612c6786828701612afa565b9150509250925092565b5f60208284031215612c8657612c85612990565b5b5f612c9384828501612ba7565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612cd682612a73565b810181811067ffffffffffffffff82111715612cf557612cf4612ca0565b5b80604052505050565b5f612d07612987565b9050612d138282612ccd565b919050565b5f67ffffffffffffffff821115612d3257612d31612ca0565b5b602082029050602081019050919050565b5f80fd5b5f612d59612d5484612d18565b612cfe565b90508083825260208201905060208402830185811115612d7c57612d7b612d43565b5b835b81811015612da55780612d918882612ba7565b845260208401935050602081019050612d7e565b5050509392505050565b5f82601f830112612dc357612dc2612c9c565b5b8135612dd3848260208601612d47565b91505092915050565b5f60208284031215612df157612df0612990565b5b5f82013567ffffffffffffffff811115612e0e57612e0d612994565b5b612e1a84828501612daf565b91505092915050565b612e2c81612a18565b8114612e36575f80fd5b50565b5f81359050612e4781612e23565b92915050565b5f60208284031215612e6257612e61612990565b5b5f612e6f84828501612e39565b91505092915050565b5f80fd5b5f67ffffffffffffffff821115612e9657612e95612ca0565b5b612e9f82612a73565b9050602081019050919050565b828183375f83830152505050565b5f612ecc612ec784612e7c565b612cfe565b905082815260208101848484011115612ee857612ee7612e78565b5b612ef3848285612eac565b509392505050565b5f82601f830112612f0f57612f0e612c9c565b5b8135612f1f848260208601612eba565b91505092915050565b5f60208284031215612f3d57612f3c612990565b5b5f82013567ffffffffffffffff811115612f5a57612f59612994565b5b612f6684828501612efb565b91505092915050565b5f8060408385031215612f8557612f84612990565b5b5f612f9285828601612ba7565b9250506020612fa385828601612e39565b9150509250929050565b5f67ffffffffffffffff821115612fc757612fc6612ca0565b5b612fd082612a73565b9050602081019050919050565b5f612fef612fea84612fad565b612cfe565b90508281526020810184848401111561300b5761300a612e78565b5b613016848285612eac565b509392505050565b5f82601f83011261303257613031612c9c565b5b8135613042848260208601612fdd565b91505092915050565b5f805f806080858703121561306357613062612990565b5b5f61307087828801612ba7565b945050602061308187828801612ba7565b935050604061309287828801612afa565b925050606085013567ffffffffffffffff8111156130b3576130b2612994565b5b6130bf8782880161301e565b91505092959194509250565b5f80604083850312156130e1576130e0612990565b5b5f6130ee85828601612ba7565b92505060206130ff85828601612ba7565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061314d57607f821691505b6020821081036131605761315f613109565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61319a602083612a55565b91506131a582613166565b602082019050919050565b5f6020820190508181035f8301526131c78161318e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61320582612adb565b915061321083612adb565b9250828201905080821115613228576132276131ce565b5b92915050565b7f4d617820537570706c7920526561636865642e000000000000000000000000005f82015250565b5f613262601383612a55565b915061326d8261322e565b602082019050919050565b5f6020820190508181035f83015261328f81613256565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f53616c65206973207061757365642100000000000000000000000000000000005f82015250565b5f6132f7600f83612a55565b9150613302826132c3565b602082019050919050565b5f6020820190508181035f830152613324816132eb565b9050919050565b7f4d696e696d756d2031204e46542068617320746f206265206d696e74656420705f8201527f6572207472616e73616374696f6e000000000000000000000000000000000000602082015250565b5f613385602e83612a55565b91506133908261332b565b604082019050919050565b5f6020820190508181035f8301526133b281613379565b9050919050565b7f536f6c64206f75740000000000000000000000000000000000000000000000005f82015250565b5f6133ed600883612a55565b91506133f8826133b9565b602082019050919050565b5f6020820190508181035f83015261341a816133e1565b9050919050565b5f61342b82612adb565b915061343683612adb565b925082820261344481612adb565b9150828204841483151761345b5761345a6131ce565b5b5092915050565b7f506c656173652073656e6420636f727265637420616d6f756e742e00000000005f82015250565b5f613496601b83612a55565b91506134a182613462565b602082019050919050565b5f6020820190508181035f8301526134c38161348a565b9050919050565b7f596f752063616e6e6f74206d696e74206d6f7265207468616e2032206e6674735f8201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b5f613524602183612a55565b915061352f826134ca565b604082019050919050565b5f6020820190508181035f83015261355181613518565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026135b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613579565b6135be8683613579565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6135f96135f46135ef84612adb565b6135d6565b612adb565b9050919050565b5f819050919050565b613612836135df565b61362661361e82613600565b848454613585565b825550505050565b5f90565b61363a61362e565b613645818484613609565b505050565b5b818110156136685761365d5f82613632565b60018101905061364b565b5050565b601f8211156136ad5761367e81613558565b6136878461356a565b81016020851015613696578190505b6136aa6136a28561356a565b83018261364a565b50505b505050565b5f82821c905092915050565b5f6136cd5f19846008026136b2565b1980831691505092915050565b5f6136e583836136be565b9150826002028217905092915050565b6136fe82612a4b565b67ffffffffffffffff81111561371757613716612ca0565b5b6137218254613136565b61372c82828561366c565b5f60209050601f83116001811461375d575f841561374b578287015190505b61375585826136da565b8655506137bc565b601f19841661376b86613558565b5f5b828110156137925784890151825560018201915060208501945060208101905061376d565b868310156137af57848901516137ab601f8916826136be565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f6137d882612a4b565b6137e281856137c4565b93506137f2818560208601612a65565b80840191505092915050565b5f61380982856137ce565b915061381582846137ce565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61387b602683612a55565b915061388682613821565b604082019050919050565b5f6020820190508181035f8301526138a88161386f565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6138d3826138af565b6138dd81856138b9565b93506138ed818560208601612a65565b6138f681612a73565b840191505092915050565b5f6080820190506139145f830187612b69565b6139216020830186612b69565b61392e6040830185612bf9565b818103606083015261394081846138c9565b905095945050505050565b5f81519050613959816129c3565b92915050565b5f6020828403121561397457613973612990565b5b5f6139818482850161394b565b91505092915050565b5f61399482612adb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139c6576139c56131ce565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613a0882612adb565b9150613a1383612adb565b925082613a2357613a226139d1565b5b828204905092915050565b5f613a3882612adb565b9150613a4383612adb565b9250828203905081811115613a5b57613a5a6131ce565b5b92915050565b5f613a6b82612adb565b9150613a7683612adb565b925082613a8657613a856139d1565b5b82820690509291505056fea26469706673582212202c51a9856064acc2586492464d0858603433a865e164f62bc6f2ed93b119a06c64736f6c634300081a0033

Deployed Bytecode Sourcemap

54979:2300:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25345:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28705:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30208:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29771:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24994:279;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56663:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31065:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55612:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31306:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56973:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55133:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28514:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55056:68;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56758:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25714:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14111:94;;;;;;;;;;;;;:::i;:::-;;57140:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55340:266;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56566:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13460:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28874:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55828:632;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56468:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30484:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55170:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31562:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29049:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55021:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30834:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14360:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55255:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25345:305;25447:4;25499:25;25484:40;;;:11;:40;;;;:105;;;;25556:33;25541:48;;;:11;:48;;;;25484:105;:158;;;;25606:36;25630:11;25606:23;:36::i;:::-;25484:158;25464:178;;25345:305;;;:::o;28705:100::-;28759:13;28792:5;28785:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28705:100;:::o;30208:204::-;30276:7;30301:16;30309:7;30301;:16::i;:::-;30296:64;;30326:34;;;;;;;;;;;;;;30296:64;30380:15;:24;30396:7;30380:24;;;;;;;;;;;;;;;;;;;;;30373:31;;30208:204;;;:::o;29771:371::-;29844:13;29860:24;29876:7;29860:15;:24::i;:::-;29844:40;;29905:5;29899:11;;:2;:11;;;29895:48;;29919:24;;;;;;;;;;;;;;29895:48;29976:5;29960:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;29986:37;30003:5;30010:12;:10;:12::i;:::-;29986:16;:37::i;:::-;29985:38;29960:63;29956:138;;;30047:35;;;;;;;;;;;;;;29956:138;30106:28;30115:2;30119:7;30128:5;30106:8;:28::i;:::-;29833:309;29771:371;;:::o;24994:279::-;25046:7;25238:12;;25222:13;;:28;25215:35;;24994:279;:::o;56663:87::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56738:4:::1;56726:9;:16;;;;56663:87:::0;:::o;31065:170::-;31199:28;31209:4;31215:2;31219:7;31199:9;:28::i;:::-;31065:170;;;:::o;55612:208::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55736:9:::1;;55726:6;55710:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;55702:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;55784:28;55794:9;55805:6;55784:9;:28::i;:::-;55612:208:::0;;:::o;31306:185::-;31444:39;31461:4;31467:2;31471:7;31444:39;;;;;;;;;;;;:16;:39::i;:::-;31306:185;;;:::o;56973:157::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57034:13:::1;57050:21;57034:37;;57090:3;57082:21;;:31;57104:8;57082:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57023:107;56973:157:::0;:::o;55133:30::-;;;;;;;;;;;;;:::o;28514:124::-;28578:7;28605:20;28617:7;28605:11;:20::i;:::-;:25;;;28598:32;;28514:124;;;:::o;55056:68::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56758:88::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56833:5:::1;56821:9;:17;;;;56758:88:::0;:::o;25714:206::-;25778:7;25819:1;25802:19;;:5;:19;;;25798:60;;25830:28;;;;;;;;;;;;;;25798:60;25884:12;:19;25897:5;25884:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25876:36;;25869:43;;25714:206;;;:::o;14111:94::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14176:21:::1;14194:1;14176:9;:21::i;:::-;14111:94::o:0;57140:136::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57233:3:::1;57225:21;;:34;57247:11;57225:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57140:136:::0;;:::o;55340:266::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55474:9:::1;;55455:8;:15;55439:13;:11;:13::i;:::-;:31;;;;:::i;:::-;:44;;55431:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55522:6;55518:80;55538:8;:15;55534:1;:19;55518:80;;;55573:25;55583:8;55592:1;55583:11;;;;;;;;:::i;:::-;;;;;;;;55596:1;55573:9;:25::i;:::-;55555:3;;;;;;;55518:80;;;;55340:266:::0;:::o;56566:89::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56643:4:::1;56630:10;;:17;;;;;;;;;;;;;;;;;;56566:89:::0;:::o;13460:87::-;13506:7;13533:6;;;;;;;;;;;13526:13;;13460:87;:::o;28874:104::-;28930:13;28963:7;28956:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28874:104;:::o;55828:632::-;55930:10;;;;;;;;;;;55929:11;55921:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;55991:1;55979:9;:13;55971:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;56091:9;;56074:13;:11;:13::i;:::-;56062:9;:25;;;;:::i;:::-;:38;;56054:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;56157:9;56145;;:21;;;;:::i;:::-;56132:9;:34;;56124:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;56257:14;;56229:12;:24;56242:10;56229:24;;;;;;;;;;;;;;;;56217:9;:36;;;;:::i;:::-;:54;;56209:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;56346:32;56356:10;56368:9;56346;:32::i;:::-;56443:9;56416:12;:24;56429:10;56416:24;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;56389:12;:24;56402:10;56389:24;;;;;;;;;;;;;;;:63;;;;55828:632;:::o;56468:92::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56548:4:::1;56538:7;:14;;;;;;:::i;:::-;;56468:92:::0;:::o;30484:279::-;30587:12;:10;:12::i;:::-;30575:24;;:8;:24;;;30571:54;;30608:17;;;;;;;;;;;;;;30571:54;30683:8;30638:18;:32;30657:12;:10;:12::i;:::-;30638:32;;;;;;;;;;;;;;;:42;30671:8;30638:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30736:8;30707:48;;30722:12;:10;:12::i;:::-;30707:48;;;30746:8;30707:48;;;;;;:::i;:::-;;;;;;;;30484:279;;:::o;55170:44::-;;;;;;;;;;;;;;;;;:::o;31562:342::-;31729:28;31739:4;31745:2;31749:7;31729:9;:28::i;:::-;31773:48;31796:4;31802:2;31806:7;31815:5;31773:22;:48::i;:::-;31768:129;;31845:40;;;;;;;;;;;;;;31768:129;31562:342;;;;:::o;29049:318::-;29122:13;29153:16;29161:7;29153;:16::i;:::-;29148:59;;29178:29;;;;;;;;;;;;;;29148:59;29220:21;29244:10;:8;:10::i;:::-;29220:34;;29297:1;29278:7;29272:21;:26;:87;;;;;;;;;;;;;;;;;29325:7;29334:18;:7;:16;:18::i;:::-;29308:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29272:87;29265:94;;;29049:318;;;:::o;55021:28::-;;;;:::o;30834:164::-;30931:4;30955:18;:25;30974:5;30955:25;;;;;;;;;;;;;;;:35;30981:8;30955:35;;;;;;;;;;;;;;;;;;;;;;;;;30948:42;;30834:164;;;;:::o;14360:192::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14469:1:::1;14449:22;;:8;:22;;::::0;14441:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;14525:19;14535:8;14525:9;:19::i;:::-;14360:192:::0;:::o;55255:31::-;;;;:::o;15465:157::-;15550:4;15589:25;15574:40;;;:11;:40;;;;15567:47;;15465:157;;;:::o;32159:144::-;32216:4;32250:13;;32240:7;:23;:55;;;;;32268:11;:20;32280:7;32268:20;;;;;;;;;;;:27;;;;;;;;;;;;32267:28;32240:55;32233:62;;32159:144;;;:::o;600:98::-;653:7;680:10;673:17;;600:98;:::o;39365:196::-;39507:2;39480:15;:24;39496:7;39480:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39545:7;39541:2;39525:28;;39534:5;39525:28;;;;;;;;;;;;39365:196;;;:::o;34866:2112::-;34981:35;35019:20;35031:7;35019:11;:20::i;:::-;34981:58;;35052:22;35094:13;:18;;;35078:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;35129:50;35146:13;:18;;;35166:12;:10;:12::i;:::-;35129:16;:50::i;:::-;35078:101;:154;;;;35220:12;:10;:12::i;:::-;35196:36;;:20;35208:7;35196:11;:20::i;:::-;:36;;;35078:154;35052:181;;35251:17;35246:66;;35277:35;;;;;;;;;;;;;;35246:66;35349:4;35327:26;;:13;:18;;;:26;;;35323:67;;35362:28;;;;;;;;;;;;;;35323:67;35419:1;35405:16;;:2;:16;;;35401:52;;35430:23;;;;;;;;;;;;;;35401:52;35466:43;35488:4;35494:2;35498:7;35507:1;35466:21;:43::i;:::-;35574:49;35591:1;35595:7;35604:13;:18;;;35574:8;:49::i;:::-;35949:1;35919:12;:18;35932:4;35919:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35993:1;35965:12;:16;35978:2;35965:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36039:2;36011:11;:20;36023:7;36011:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;36101:15;36056:11;:20;36068:7;36056:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;36369:19;36401:1;36391:7;:11;36369:33;;36462:1;36421:43;;:11;:24;36433:11;36421:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;36417:445;;36646:13;;36632:11;:27;36628:219;;;36716:13;:18;;;36684:11;:24;36696:11;36684:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;36799:13;:28;;;36757:11;:24;36769:11;36757:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;36628:219;36417:445;35894:979;36909:7;36905:2;36890:27;;36899:4;36890:27;;;;;;;;;;;;36928:42;36949:4;36955:2;36959:7;36968:1;36928:20;:42::i;:::-;34970:2008;;34866:2112;;;:::o;32311:104::-;32380:27;32390:2;32394:8;32380:27;;;;;;;;;;;;:9;:27::i;:::-;32311:104;;:::o;27369:1083::-;27430:21;;:::i;:::-;27464:12;27479:7;27464:22;;27535:13;;27528:4;:20;27524:861;;;27569:31;27603:11;:17;27615:4;27603:17;;;;;;;;;;;27569:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27644:9;:16;;;27639:731;;27715:1;27689:28;;:9;:14;;;:28;;;27685:101;;27753:9;27746:16;;;;;;27685:101;28090:261;28097:4;28090:261;;;28130:6;;;;;;;;28175:11;:17;28187:4;28175:17;;;;;;;;;;;28163:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28249:1;28223:28;;:9;:14;;;:28;;;28219:109;;28291:9;28284:16;;;;;;28219:109;28090:261;;;27639:731;27550:835;27524:861;28413:31;;;;;;;;;;;;;;27369:1083;;;;:::o;14560:173::-;14616:16;14635:6;;;;;;;;;;;14616:25;;14661:8;14652:6;;:17;;;;;;;;;;;;;;;;;;14716:8;14685:40;;14706:8;14685:40;;;;;;;;;;;;14605:128;14560:173;:::o;40126:790::-;40281:4;40302:15;:2;:13;;;:15::i;:::-;40298:611;;;40354:2;40338:36;;;40375:12;:10;:12::i;:::-;40389:4;40395:7;40404:5;40338:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40334:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40601:1;40584:6;:13;:18;40580:259;;40634:40;;;;;;;;;;;;;;40580:259;40789:6;40783:13;40774:6;40770:2;40766:15;40759:38;40334:520;40471:45;;;40461:55;;;:6;:55;;;;40454:62;;;;;40298:611;40893:4;40886:11;;40126:790;;;;;;;:::o;56854:108::-;56914:13;56947:7;56940:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56854:108;:::o;1065:723::-;1121:13;1351:1;1342:5;:10;1338:53;;1369:10;;;;;;;;;;;;;;;;;;;;;1338:53;1401:12;1416:5;1401:20;;1432:14;1457:78;1472:1;1464:4;:9;1457:78;;1490:8;;;;;:::i;:::-;;;;1521:2;1513:10;;;;;:::i;:::-;;;1457:78;;;1545:19;1577:6;1567:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1545:39;;1595:154;1611:1;1602:5;:10;1595:154;;1639:1;1629:11;;;;;:::i;:::-;;;1706:2;1698:5;:10;;;;:::i;:::-;1685:2;:24;;;;:::i;:::-;1672:39;;1655:6;1662;1655:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1735:2;1726:11;;;;;:::i;:::-;;;1595:154;;;1773:6;1759:21;;;;;1065:723;;;;:::o;41564:159::-;;;;;:::o;42382:158::-;;;;;:::o;32778:163::-;32901:32;32907:2;32911:8;32921:5;32928:4;32901:5;:32::i;:::-;32778:163;;;:::o;3530:387::-;3590:4;3798:12;3865:7;3853:20;3845:28;;3908:1;3901:4;:8;3894:15;;;3530:387;;;:::o;33200:1412::-;33339:20;33362:13;;33339:36;;33404:1;33390:16;;:2;:16;;;33386:48;;33415:19;;;;;;;;;;;;;;33386:48;33461:1;33449:8;:13;33445:44;;33471:18;;;;;;;;;;;;;;33445:44;33502:61;33532:1;33536:2;33540:12;33554:8;33502:21;:61::i;:::-;33875:8;33840:12;:16;33853:2;33840:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33939:8;33899:12;:16;33912:2;33899:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33998:2;33965:11;:25;33977:12;33965:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34065:15;34015:11;:25;34027:12;34015:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;34098:20;34121:12;34098:35;;34155:9;34150:328;34170:8;34166:1;:12;34150:328;;;34234:12;34230:2;34209:38;;34226:1;34209:38;;;;;;;;;;;;34270:4;:68;;;;;34279:59;34310:1;34314:2;34318:12;34332:5;34279:22;:59::i;:::-;34278:60;34270:68;34266:164;;;34370:40;;;;;;;;;;;;;;34266:164;34448:14;;;;;;;34180:3;;;;;;;34150:328;;;;34510:12;34494:13;:28;;;;33815:719;34544:60;34573:1;34577:2;34581:12;34595:8;34544:20;:60::i;:::-;33328:1284;33200:1412;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:139::-;1887:6;1882:3;1877;1871:23;1928:1;1919:6;1914:3;1910:16;1903:27;1798:139;;;:::o;1943:102::-;1984:6;2035:2;2031:7;2026:2;2019:5;2015:14;2011:28;2001:38;;1943:102;;;:::o;2051:377::-;2139:3;2167:39;2200:5;2167:39;:::i;:::-;2222:71;2286:6;2281:3;2222:71;:::i;:::-;2215:78;;2302:65;2360:6;2355:3;2348:4;2341:5;2337:16;2302:65;:::i;:::-;2392:29;2414:6;2392:29;:::i;:::-;2387:3;2383:39;2376:46;;2143:285;2051:377;;;;:::o;2434:313::-;2547:4;2585:2;2574:9;2570:18;2562:26;;2634:9;2628:4;2624:20;2620:1;2609:9;2605:17;2598:47;2662:78;2735:4;2726:6;2662:78;:::i;:::-;2654:86;;2434:313;;;;:::o;2753:77::-;2790:7;2819:5;2808:16;;2753:77;;;:::o;2836:122::-;2909:24;2927:5;2909:24;:::i;:::-;2902:5;2899:35;2889:63;;2948:1;2945;2938:12;2889:63;2836:122;:::o;2964:139::-;3010:5;3048:6;3035:20;3026:29;;3064:33;3091:5;3064:33;:::i;:::-;2964:139;;;;:::o;3109:329::-;3168:6;3217:2;3205:9;3196:7;3192:23;3188:32;3185:119;;;3223:79;;:::i;:::-;3185:119;3343:1;3368:53;3413:7;3404:6;3393:9;3389:22;3368:53;:::i;:::-;3358:63;;3314:117;3109:329;;;;:::o;3444:126::-;3481:7;3521:42;3514:5;3510:54;3499:65;;3444:126;;;:::o;3576:96::-;3613:7;3642:24;3660:5;3642:24;:::i;:::-;3631:35;;3576:96;;;:::o;3678:118::-;3765:24;3783:5;3765:24;:::i;:::-;3760:3;3753:37;3678:118;;:::o;3802:222::-;3895:4;3933:2;3922:9;3918:18;3910:26;;3946:71;4014:1;4003:9;3999:17;3990:6;3946:71;:::i;:::-;3802:222;;;;:::o;4030:122::-;4103:24;4121:5;4103:24;:::i;:::-;4096:5;4093:35;4083:63;;4142:1;4139;4132:12;4083:63;4030:122;:::o;4158:139::-;4204:5;4242:6;4229:20;4220:29;;4258:33;4285:5;4258:33;:::i;:::-;4158:139;;;;:::o;4303:474::-;4371:6;4379;4428:2;4416:9;4407:7;4403:23;4399:32;4396:119;;;4434:79;;:::i;:::-;4396:119;4554:1;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4525:117;4681:2;4707:53;4752:7;4743:6;4732:9;4728:22;4707:53;:::i;:::-;4697:63;;4652:118;4303:474;;;;;:::o;4783:118::-;4870:24;4888:5;4870:24;:::i;:::-;4865:3;4858:37;4783:118;;:::o;4907:222::-;5000:4;5038:2;5027:9;5023:18;5015:26;;5051:71;5119:1;5108:9;5104:17;5095:6;5051:71;:::i;:::-;4907:222;;;;:::o;5135:619::-;5212:6;5220;5228;5277:2;5265:9;5256:7;5252:23;5248:32;5245:119;;;5283:79;;:::i;:::-;5245:119;5403:1;5428:53;5473:7;5464:6;5453:9;5449:22;5428:53;:::i;:::-;5418:63;;5374:117;5530:2;5556:53;5601:7;5592:6;5581:9;5577:22;5556:53;:::i;:::-;5546:63;;5501:118;5658:2;5684:53;5729:7;5720:6;5709:9;5705:22;5684:53;:::i;:::-;5674:63;;5629:118;5135:619;;;;;:::o;5760:329::-;5819:6;5868:2;5856:9;5847:7;5843:23;5839:32;5836:119;;;5874:79;;:::i;:::-;5836:119;5994:1;6019:53;6064:7;6055:6;6044:9;6040:22;6019:53;:::i;:::-;6009:63;;5965:117;5760:329;;;;:::o;6095:117::-;6204:1;6201;6194:12;6218:180;6266:77;6263:1;6256:88;6363:4;6360:1;6353:15;6387:4;6384:1;6377:15;6404:281;6487:27;6509:4;6487:27;:::i;:::-;6479:6;6475:40;6617:6;6605:10;6602:22;6581:18;6569:10;6566:34;6563:62;6560:88;;;6628:18;;:::i;:::-;6560:88;6668:10;6664:2;6657:22;6447:238;6404:281;;:::o;6691:129::-;6725:6;6752:20;;:::i;:::-;6742:30;;6781:33;6809:4;6801:6;6781:33;:::i;:::-;6691:129;;;:::o;6826:311::-;6903:4;6993:18;6985:6;6982:30;6979:56;;;7015:18;;:::i;:::-;6979:56;7065:4;7057:6;7053:17;7045:25;;7125:4;7119;7115:15;7107:23;;6826:311;;;:::o;7143:117::-;7252:1;7249;7242:12;7283:710;7379:5;7404:81;7420:64;7477:6;7420:64;:::i;:::-;7404:81;:::i;:::-;7395:90;;7505:5;7534:6;7527:5;7520:21;7568:4;7561:5;7557:16;7550:23;;7621:4;7613:6;7609:17;7601:6;7597:30;7650:3;7642:6;7639:15;7636:122;;;7669:79;;:::i;:::-;7636:122;7784:6;7767:220;7801:6;7796:3;7793:15;7767:220;;;7876:3;7905:37;7938:3;7926:10;7905:37;:::i;:::-;7900:3;7893:50;7972:4;7967:3;7963:14;7956:21;;7843:144;7827:4;7822:3;7818:14;7811:21;;7767:220;;;7771:21;7385:608;;7283:710;;;;;:::o;8016:370::-;8087:5;8136:3;8129:4;8121:6;8117:17;8113:27;8103:122;;8144:79;;:::i;:::-;8103:122;8261:6;8248:20;8286:94;8376:3;8368:6;8361:4;8353:6;8349:17;8286:94;:::i;:::-;8277:103;;8093:293;8016:370;;;;:::o;8392:539::-;8476:6;8525:2;8513:9;8504:7;8500:23;8496:32;8493:119;;;8531:79;;:::i;:::-;8493:119;8679:1;8668:9;8664:17;8651:31;8709:18;8701:6;8698:30;8695:117;;;8731:79;;:::i;:::-;8695:117;8836:78;8906:7;8897:6;8886:9;8882:22;8836:78;:::i;:::-;8826:88;;8622:302;8392:539;;;;:::o;8937:116::-;9007:21;9022:5;9007:21;:::i;:::-;9000:5;8997:32;8987:60;;9043:1;9040;9033:12;8987:60;8937:116;:::o;9059:133::-;9102:5;9140:6;9127:20;9118:29;;9156:30;9180:5;9156:30;:::i;:::-;9059:133;;;;:::o;9198:323::-;9254:6;9303:2;9291:9;9282:7;9278:23;9274:32;9271:119;;;9309:79;;:::i;:::-;9271:119;9429:1;9454:50;9496:7;9487:6;9476:9;9472:22;9454:50;:::i;:::-;9444:60;;9400:114;9198:323;;;;:::o;9527:117::-;9636:1;9633;9626:12;9650:308;9712:4;9802:18;9794:6;9791:30;9788:56;;;9824:18;;:::i;:::-;9788:56;9862:29;9884:6;9862:29;:::i;:::-;9854:37;;9946:4;9940;9936:15;9928:23;;9650:308;;;:::o;9964:148::-;10062:6;10057:3;10052;10039:30;10103:1;10094:6;10089:3;10085:16;10078:27;9964:148;;;:::o;10118:425::-;10196:5;10221:66;10237:49;10279:6;10237:49;:::i;:::-;10221:66;:::i;:::-;10212:75;;10310:6;10303:5;10296:21;10348:4;10341:5;10337:16;10386:3;10377:6;10372:3;10368:16;10365:25;10362:112;;;10393:79;;:::i;:::-;10362:112;10483:54;10530:6;10525:3;10520;10483:54;:::i;:::-;10202:341;10118:425;;;;;:::o;10563:340::-;10619:5;10668:3;10661:4;10653:6;10649:17;10645:27;10635:122;;10676:79;;:::i;:::-;10635:122;10793:6;10780:20;10818:79;10893:3;10885:6;10878:4;10870:6;10866:17;10818:79;:::i;:::-;10809:88;;10625:278;10563:340;;;;:::o;10909:509::-;10978:6;11027:2;11015:9;11006:7;11002:23;10998:32;10995:119;;;11033:79;;:::i;:::-;10995:119;11181:1;11170:9;11166:17;11153:31;11211:18;11203:6;11200:30;11197:117;;;11233:79;;:::i;:::-;11197:117;11338:63;11393:7;11384:6;11373:9;11369:22;11338:63;:::i;:::-;11328:73;;11124:287;10909:509;;;;:::o;11424:468::-;11489:6;11497;11546:2;11534:9;11525:7;11521:23;11517:32;11514:119;;;11552:79;;:::i;:::-;11514:119;11672:1;11697:53;11742:7;11733:6;11722:9;11718:22;11697:53;:::i;:::-;11687:63;;11643:117;11799:2;11825:50;11867:7;11858:6;11847:9;11843:22;11825:50;:::i;:::-;11815:60;;11770:115;11424:468;;;;;:::o;11898:307::-;11959:4;12049:18;12041:6;12038:30;12035:56;;;12071:18;;:::i;:::-;12035:56;12109:29;12131:6;12109:29;:::i;:::-;12101:37;;12193:4;12187;12183:15;12175:23;;11898:307;;;:::o;12211:423::-;12288:5;12313:65;12329:48;12370:6;12329:48;:::i;:::-;12313:65;:::i;:::-;12304:74;;12401:6;12394:5;12387:21;12439:4;12432:5;12428:16;12477:3;12468:6;12463:3;12459:16;12456:25;12453:112;;;12484:79;;:::i;:::-;12453:112;12574:54;12621:6;12616:3;12611;12574:54;:::i;:::-;12294:340;12211:423;;;;;:::o;12653:338::-;12708:5;12757:3;12750:4;12742:6;12738:17;12734:27;12724:122;;12765:79;;:::i;:::-;12724:122;12882:6;12869:20;12907:78;12981:3;12973:6;12966:4;12958:6;12954:17;12907:78;:::i;:::-;12898:87;;12714:277;12653:338;;;;:::o;12997:943::-;13092:6;13100;13108;13116;13165:3;13153:9;13144:7;13140:23;13136:33;13133:120;;;13172:79;;:::i;:::-;13133:120;13292:1;13317:53;13362:7;13353:6;13342:9;13338:22;13317:53;:::i;:::-;13307:63;;13263:117;13419:2;13445:53;13490:7;13481:6;13470:9;13466:22;13445:53;:::i;:::-;13435:63;;13390:118;13547:2;13573:53;13618:7;13609:6;13598:9;13594:22;13573:53;:::i;:::-;13563:63;;13518:118;13703:2;13692:9;13688:18;13675:32;13734:18;13726:6;13723:30;13720:117;;;13756:79;;:::i;:::-;13720:117;13861:62;13915:7;13906:6;13895:9;13891:22;13861:62;:::i;:::-;13851:72;;13646:287;12997:943;;;;;;;:::o;13946:474::-;14014:6;14022;14071:2;14059:9;14050:7;14046:23;14042:32;14039:119;;;14077:79;;:::i;:::-;14039:119;14197:1;14222:53;14267:7;14258:6;14247:9;14243:22;14222:53;:::i;:::-;14212:63;;14168:117;14324:2;14350:53;14395:7;14386:6;14375:9;14371:22;14350:53;:::i;:::-;14340:63;;14295:118;13946:474;;;;;:::o;14426:180::-;14474:77;14471:1;14464:88;14571:4;14568:1;14561:15;14595:4;14592:1;14585:15;14612:320;14656:6;14693:1;14687:4;14683:12;14673:22;;14740:1;14734:4;14730:12;14761:18;14751:81;;14817:4;14809:6;14805:17;14795:27;;14751:81;14879:2;14871:6;14868:14;14848:18;14845:38;14842:84;;14898:18;;:::i;:::-;14842:84;14663:269;14612:320;;;:::o;14938:182::-;15078:34;15074:1;15066:6;15062:14;15055:58;14938:182;:::o;15126:366::-;15268:3;15289:67;15353:2;15348:3;15289:67;:::i;:::-;15282:74;;15365:93;15454:3;15365:93;:::i;:::-;15483:2;15478:3;15474:12;15467:19;;15126:366;;;:::o;15498:419::-;15664:4;15702:2;15691:9;15687:18;15679:26;;15751:9;15745:4;15741:20;15737:1;15726:9;15722:17;15715:47;15779:131;15905:4;15779:131;:::i;:::-;15771:139;;15498:419;;;:::o;15923:180::-;15971:77;15968:1;15961:88;16068:4;16065:1;16058:15;16092:4;16089:1;16082:15;16109:191;16149:3;16168:20;16186:1;16168:20;:::i;:::-;16163:25;;16202:20;16220:1;16202:20;:::i;:::-;16197:25;;16245:1;16242;16238:9;16231:16;;16266:3;16263:1;16260:10;16257:36;;;16273:18;;:::i;:::-;16257:36;16109:191;;;;:::o;16306:169::-;16446:21;16442:1;16434:6;16430:14;16423:45;16306:169;:::o;16481:366::-;16623:3;16644:67;16708:2;16703:3;16644:67;:::i;:::-;16637:74;;16720:93;16809:3;16720:93;:::i;:::-;16838:2;16833:3;16829:12;16822:19;;16481:366;;;:::o;16853:419::-;17019:4;17057:2;17046:9;17042:18;17034:26;;17106:9;17100:4;17096:20;17092:1;17081:9;17077:17;17070:47;17134:131;17260:4;17134:131;:::i;:::-;17126:139;;16853:419;;;:::o;17278:180::-;17326:77;17323:1;17316:88;17423:4;17420:1;17413:15;17447:4;17444:1;17437:15;17464:165;17604:17;17600:1;17592:6;17588:14;17581:41;17464:165;:::o;17635:366::-;17777:3;17798:67;17862:2;17857:3;17798:67;:::i;:::-;17791:74;;17874:93;17963:3;17874:93;:::i;:::-;17992:2;17987:3;17983:12;17976:19;;17635:366;;;:::o;18007:419::-;18173:4;18211:2;18200:9;18196:18;18188:26;;18260:9;18254:4;18250:20;18246:1;18235:9;18231:17;18224:47;18288:131;18414:4;18288:131;:::i;:::-;18280:139;;18007:419;;;:::o;18432:233::-;18572:34;18568:1;18560:6;18556:14;18549:58;18641:16;18636:2;18628:6;18624:15;18617:41;18432:233;:::o;18671:366::-;18813:3;18834:67;18898:2;18893:3;18834:67;:::i;:::-;18827:74;;18910:93;18999:3;18910:93;:::i;:::-;19028:2;19023:3;19019:12;19012:19;;18671:366;;;:::o;19043:419::-;19209:4;19247:2;19236:9;19232:18;19224:26;;19296:9;19290:4;19286:20;19282:1;19271:9;19267:17;19260:47;19324:131;19450:4;19324:131;:::i;:::-;19316:139;;19043:419;;;:::o;19468:158::-;19608:10;19604:1;19596:6;19592:14;19585:34;19468:158;:::o;19632:365::-;19774:3;19795:66;19859:1;19854:3;19795:66;:::i;:::-;19788:73;;19870:93;19959:3;19870:93;:::i;:::-;19988:2;19983:3;19979:12;19972:19;;19632:365;;;:::o;20003:419::-;20169:4;20207:2;20196:9;20192:18;20184:26;;20256:9;20250:4;20246:20;20242:1;20231:9;20227:17;20220:47;20284:131;20410:4;20284:131;:::i;:::-;20276:139;;20003:419;;;:::o;20428:410::-;20468:7;20491:20;20509:1;20491:20;:::i;:::-;20486:25;;20525:20;20543:1;20525:20;:::i;:::-;20520:25;;20580:1;20577;20573:9;20602:30;20620:11;20602:30;:::i;:::-;20591:41;;20781:1;20772:7;20768:15;20765:1;20762:22;20742:1;20735:9;20715:83;20692:139;;20811:18;;:::i;:::-;20692:139;20476:362;20428:410;;;;:::o;20844:177::-;20984:29;20980:1;20972:6;20968:14;20961:53;20844:177;:::o;21027:366::-;21169:3;21190:67;21254:2;21249:3;21190:67;:::i;:::-;21183:74;;21266:93;21355:3;21266:93;:::i;:::-;21384:2;21379:3;21375:12;21368:19;;21027:366;;;:::o;21399:419::-;21565:4;21603:2;21592:9;21588:18;21580:26;;21652:9;21646:4;21642:20;21638:1;21627:9;21623:17;21616:47;21680:131;21806:4;21680:131;:::i;:::-;21672:139;;21399:419;;;:::o;21824:220::-;21964:34;21960:1;21952:6;21948:14;21941:58;22033:3;22028:2;22020:6;22016:15;22009:28;21824:220;:::o;22050:366::-;22192:3;22213:67;22277:2;22272:3;22213:67;:::i;:::-;22206:74;;22289:93;22378:3;22289:93;:::i;:::-;22407:2;22402:3;22398:12;22391:19;;22050:366;;;:::o;22422:419::-;22588:4;22626:2;22615:9;22611:18;22603:26;;22675:9;22669:4;22665:20;22661:1;22650:9;22646:17;22639:47;22703:131;22829:4;22703:131;:::i;:::-;22695:139;;22422:419;;;:::o;22847:141::-;22896:4;22919:3;22911:11;;22942:3;22939:1;22932:14;22976:4;22973:1;22963:18;22955:26;;22847:141;;;:::o;22994:93::-;23031:6;23078:2;23073;23066:5;23062:14;23058:23;23048:33;;22994:93;;;:::o;23093:107::-;23137:8;23187:5;23181:4;23177:16;23156:37;;23093:107;;;;:::o;23206:393::-;23275:6;23325:1;23313:10;23309:18;23348:97;23378:66;23367:9;23348:97;:::i;:::-;23466:39;23496:8;23485:9;23466:39;:::i;:::-;23454:51;;23538:4;23534:9;23527:5;23523:21;23514:30;;23587:4;23577:8;23573:19;23566:5;23563:30;23553:40;;23282:317;;23206:393;;;;;:::o;23605:60::-;23633:3;23654:5;23647:12;;23605:60;;;:::o;23671:142::-;23721:9;23754:53;23772:34;23781:24;23799:5;23781:24;:::i;:::-;23772:34;:::i;:::-;23754:53;:::i;:::-;23741:66;;23671:142;;;:::o;23819:75::-;23862:3;23883:5;23876:12;;23819:75;;;:::o;23900:269::-;24010:39;24041:7;24010:39;:::i;:::-;24071:91;24120:41;24144:16;24120:41;:::i;:::-;24112:6;24105:4;24099:11;24071:91;:::i;:::-;24065:4;24058:105;23976:193;23900:269;;;:::o;24175:73::-;24220:3;24175:73;:::o;24254:189::-;24331:32;;:::i;:::-;24372:65;24430:6;24422;24416:4;24372:65;:::i;:::-;24307:136;24254:189;;:::o;24449:186::-;24509:120;24526:3;24519:5;24516:14;24509:120;;;24580:39;24617:1;24610:5;24580:39;:::i;:::-;24553:1;24546:5;24542:13;24533:22;;24509:120;;;24449:186;;:::o;24641:543::-;24742:2;24737:3;24734:11;24731:446;;;24776:38;24808:5;24776:38;:::i;:::-;24860:29;24878:10;24860:29;:::i;:::-;24850:8;24846:44;25043:2;25031:10;25028:18;25025:49;;;25064:8;25049:23;;25025:49;25087:80;25143:22;25161:3;25143:22;:::i;:::-;25133:8;25129:37;25116:11;25087:80;:::i;:::-;24746:431;;24731:446;24641:543;;;:::o;25190:117::-;25244:8;25294:5;25288:4;25284:16;25263:37;;25190:117;;;;:::o;25313:169::-;25357:6;25390:51;25438:1;25434:6;25426:5;25423:1;25419:13;25390:51;:::i;:::-;25386:56;25471:4;25465;25461:15;25451:25;;25364:118;25313:169;;;;:::o;25487:295::-;25563:4;25709:29;25734:3;25728:4;25709:29;:::i;:::-;25701:37;;25771:3;25768:1;25764:11;25758:4;25755:21;25747:29;;25487:295;;;;:::o;25787:1395::-;25904:37;25937:3;25904:37;:::i;:::-;26006:18;25998:6;25995:30;25992:56;;;26028:18;;:::i;:::-;25992:56;26072:38;26104:4;26098:11;26072:38;:::i;:::-;26157:67;26217:6;26209;26203:4;26157:67;:::i;:::-;26251:1;26275:4;26262:17;;26307:2;26299:6;26296:14;26324:1;26319:618;;;;26981:1;26998:6;26995:77;;;27047:9;27042:3;27038:19;27032:26;27023:35;;26995:77;27098:67;27158:6;27151:5;27098:67;:::i;:::-;27092:4;27085:81;26954:222;26289:887;;26319:618;26371:4;26367:9;26359:6;26355:22;26405:37;26437:4;26405:37;:::i;:::-;26464:1;26478:208;26492:7;26489:1;26486:14;26478:208;;;26571:9;26566:3;26562:19;26556:26;26548:6;26541:42;26622:1;26614:6;26610:14;26600:24;;26669:2;26658:9;26654:18;26641:31;;26515:4;26512:1;26508:12;26503:17;;26478:208;;;26714:6;26705:7;26702:19;26699:179;;;26772:9;26767:3;26763:19;26757:26;26815:48;26857:4;26849:6;26845:17;26834:9;26815:48;:::i;:::-;26807:6;26800:64;26722:156;26699:179;26924:1;26920;26912:6;26908:14;26904:22;26898:4;26891:36;26326:611;;;26289:887;;25879:1303;;;25787:1395;;:::o;27188:148::-;27290:11;27327:3;27312:18;;27188:148;;;;:::o;27342:390::-;27448:3;27476:39;27509:5;27476:39;:::i;:::-;27531:89;27613:6;27608:3;27531:89;:::i;:::-;27524:96;;27629:65;27687:6;27682:3;27675:4;27668:5;27664:16;27629:65;:::i;:::-;27719:6;27714:3;27710:16;27703:23;;27452:280;27342:390;;;;:::o;27738:435::-;27918:3;27940:95;28031:3;28022:6;27940:95;:::i;:::-;27933:102;;28052:95;28143:3;28134:6;28052:95;:::i;:::-;28045:102;;28164:3;28157:10;;27738:435;;;;;:::o;28179:225::-;28319:34;28315:1;28307:6;28303:14;28296:58;28388:8;28383:2;28375:6;28371:15;28364:33;28179:225;:::o;28410:366::-;28552:3;28573:67;28637:2;28632:3;28573:67;:::i;:::-;28566:74;;28649:93;28738:3;28649:93;:::i;:::-;28767:2;28762:3;28758:12;28751:19;;28410:366;;;:::o;28782:419::-;28948:4;28986:2;28975:9;28971:18;28963:26;;29035:9;29029:4;29025:20;29021:1;29010:9;29006:17;28999:47;29063:131;29189:4;29063:131;:::i;:::-;29055:139;;28782:419;;;:::o;29207:98::-;29258:6;29292:5;29286:12;29276:22;;29207:98;;;:::o;29311:168::-;29394:11;29428:6;29423:3;29416:19;29468:4;29463:3;29459:14;29444:29;;29311:168;;;;:::o;29485:373::-;29571:3;29599:38;29631:5;29599:38;:::i;:::-;29653:70;29716:6;29711:3;29653:70;:::i;:::-;29646:77;;29732:65;29790:6;29785:3;29778:4;29771:5;29767:16;29732:65;:::i;:::-;29822:29;29844:6;29822:29;:::i;:::-;29817:3;29813:39;29806:46;;29575:283;29485:373;;;;:::o;29864:640::-;30059:4;30097:3;30086:9;30082:19;30074:27;;30111:71;30179:1;30168:9;30164:17;30155:6;30111:71;:::i;:::-;30192:72;30260:2;30249:9;30245:18;30236:6;30192:72;:::i;:::-;30274;30342:2;30331:9;30327:18;30318:6;30274:72;:::i;:::-;30393:9;30387:4;30383:20;30378:2;30367:9;30363:18;30356:48;30421:76;30492:4;30483:6;30421:76;:::i;:::-;30413:84;;29864:640;;;;;;;:::o;30510:141::-;30566:5;30597:6;30591:13;30582:22;;30613:32;30639:5;30613:32;:::i;:::-;30510:141;;;;:::o;30657:349::-;30726:6;30775:2;30763:9;30754:7;30750:23;30746:32;30743:119;;;30781:79;;:::i;:::-;30743:119;30901:1;30926:63;30981:7;30972:6;30961:9;30957:22;30926:63;:::i;:::-;30916:73;;30872:127;30657:349;;;;:::o;31012:233::-;31051:3;31074:24;31092:5;31074:24;:::i;:::-;31065:33;;31120:66;31113:5;31110:77;31107:103;;31190:18;;:::i;:::-;31107:103;31237:1;31230:5;31226:13;31219:20;;31012:233;;;:::o;31251:180::-;31299:77;31296:1;31289:88;31396:4;31393:1;31386:15;31420:4;31417:1;31410:15;31437:185;31477:1;31494:20;31512:1;31494:20;:::i;:::-;31489:25;;31528:20;31546:1;31528:20;:::i;:::-;31523:25;;31567:1;31557:35;;31572:18;;:::i;:::-;31557:35;31614:1;31611;31607:9;31602:14;;31437:185;;;;:::o;31628:194::-;31668:4;31688:20;31706:1;31688:20;:::i;:::-;31683:25;;31722:20;31740:1;31722:20;:::i;:::-;31717:25;;31766:1;31763;31759:9;31751:17;;31790:1;31784:4;31781:11;31778:37;;;31795:18;;:::i;:::-;31778:37;31628:194;;;;:::o;31828:176::-;31860:1;31877:20;31895:1;31877:20;:::i;:::-;31872:25;;31911:20;31929:1;31911:20;:::i;:::-;31906:25;;31950:1;31940:35;;31955:18;;:::i;:::-;31940:35;31996:1;31993;31989:9;31984:14;;31828:176;;;;:::o

Swarm Source

ipfs://2c51a9856064acc2586492464d0858603433a865e164f62bc6f2ed93b119a06c
[ 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.