APE Price: $1.16 (+3.24%)

Slayers (Slayers)

Overview

TokenID

955

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
Slayers

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-23
*/

// 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 Slayers  is Ownable, ERC721A{

    uint public maxSupply = 5000;
    string public baseURI = "";

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

    uint maxMintAllowed = 100;

    uint public salePrice = 3 ether;

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

    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 100 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"}]

608060405261138860095560405180602001604052805f815250600a9081610027919061040f565b505f600b5f6101000a81548160ff0219169083151502179055506064600d556729a2241af62c0000600e5534801561005d575f80fd5b506040518060400160405280600781526020017f536c6179657273000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f536c6179657273000000000000000000000000000000000000000000000000008152506100e66100db61010d60201b60201c565b61011460201b60201c565b81600390816100f5919061040f565b508060049081610105919061040f565b5050506104de565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061025057607f821691505b6020821081036102635761026261020c565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026102c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261028a565b6102cf868361028a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61031361030e610309846102e7565b6102f0565b6102e7565b9050919050565b5f819050919050565b61032c836102f9565b6103406103388261031a565b848454610296565b825550505050565b5f90565b610354610348565b61035f818484610323565b505050565b5b81811015610382576103775f8261034c565b600181019050610365565b5050565b601f8211156103c75761039881610269565b6103a18461027b565b810160208510156103b0578190505b6103c46103bc8561027b565b830182610364565b50505b505050565b5f82821c905092915050565b5f6103e75f19846008026103cc565b1980831691505092915050565b5f6103ff83836103d8565b9150826002028217905092915050565b610418826101d5565b67ffffffffffffffff811115610431576104306101df565b5b61043b8254610239565b610446828285610386565b5f60209050601f831160018114610477575f8415610465578287015190505b61046f85826103f4565b8655506104d6565b601f19841661048586610269565b5f5b828110156104ac57848901518255600182019150602085019450602081019050610487565b868310156104c957848901516104c5601f8916826103d8565b8355505b6001600288020188555050505b505050505050565b613ac4806104eb5f395ff3fe6080604052600436106101d7575f3560e01c8063715018a611610101578063a22cb46511610094578063d5abeb0111610063578063d5abeb0114610679578063e985e9c5146106a3578063f2fde38b146106df578063f51f96dd14610707576101d7565b8063a22cb465146105b1578063b4b42a3b146105d9578063b88d4fde14610615578063c87b56dd1461063d576101d7565b80638da5cb5b116100d05780638da5cb5b1461051957806395d89b4114610543578063a0712d681461056d578063a0bcfc7f14610589576101d7565b8063715018a61461048b578063736fe565146104a15780638a0c5204146104c95780638d92becd146104f1576101d7565b806340a72310116101795780636352211e116101485780636352211e146103c15780636c0360eb146103fd5780636f8b44b01461042757806370a082311461044f576101d7565b806340a723101461031f57806342842e0e1461034757806351cff8d91461036f5780635d08c1ae14610397576101d7565b8063095ea7b3116101b5578063095ea7b31461027d57806318160ddd146102a55780631919fed7146102cf57806323b872dd146102f7576101d7565b806301ffc9a7146101db57806306fdde0314610217578063081812fc14610241575b5f80fd5b3480156101e6575f80fd5b5061020160048036038101906101fc91906129ea565b610731565b60405161020e9190612a2f565b60405180910390f35b348015610222575f80fd5b5061022b610812565b6040516102389190612ab8565b60405180910390f35b34801561024c575f80fd5b5061026760048036038101906102629190612b0b565b6108a2565b6040516102749190612b75565b60405180910390f35b348015610288575f80fd5b506102a3600480360381019061029e9190612bb8565b61091a565b005b3480156102b0575f80fd5b506102b9610a23565b6040516102c69190612c05565b60405180910390f35b3480156102da575f80fd5b506102f560048036038101906102f09190612b0b565b610a30565b005b348015610302575f80fd5b5061031d60048036038101906103189190612c1e565b610ab6565b005b34801561032a575f80fd5b5061034560048036038101906103409190612bb8565b610ac6565b005b348015610352575f80fd5b5061036d60048036038101906103689190612c1e565b610ba6565b005b34801561037a575f80fd5b5061039560048036038101906103909190612c6e565b610bc5565b005b3480156103a2575f80fd5b506103ab610c8d565b6040516103b89190612a2f565b60405180910390f35b3480156103cc575f80fd5b506103e760048036038101906103e29190612b0b565b610c9f565b6040516103f49190612b75565b60405180910390f35b348015610408575f80fd5b50610411610cb3565b60405161041e9190612ab8565b60405180910390f35b348015610432575f80fd5b5061044d60048036038101906104489190612b0b565b610d3f565b005b34801561045a575f80fd5b5061047560048036038101906104709190612c6e565b610dc5565b6040516104829190612c05565b60405180910390f35b348015610496575f80fd5b5061049f610e8f565b005b3480156104ac575f80fd5b506104c760048036038101906104c29190612bb8565b610f16565b005b3480156104d4575f80fd5b506104ef60048036038101906104ea9190612dd9565b610fda565b005b3480156104fc575f80fd5b5061051760048036038101906105129190612e4a565b6110ee565b005b348015610524575f80fd5b5061052d611186565b60405161053a9190612b75565b60405180910390f35b34801561054e575f80fd5b506105576111ad565b6040516105649190612ab8565b60405180910390f35b61058760048036038101906105829190612b0b565b61123d565b005b348015610594575f80fd5b506105af60048036038101906105aa9190612f25565b611498565b005b3480156105bc575f80fd5b506105d760048036038101906105d29190612f6c565b611527565b005b3480156105e4575f80fd5b506105ff60048036038101906105fa9190612c6e565b611699565b60405161060c9190612c05565b60405180910390f35b348015610620575f80fd5b5061063b60048036038101906106369190613048565b6116ae565b005b348015610648575f80fd5b50610663600480360381019061065e9190612b0b565b611701565b6040516106709190612ab8565b60405180910390f35b348015610684575f80fd5b5061068d61179c565b60405161069a9190612c05565b60405180910390f35b3480156106ae575f80fd5b506106c960048036038101906106c491906130c8565b6117a2565b6040516106d69190612a2f565b60405180910390f35b3480156106ea575f80fd5b5061070560048036038101906107009190612c6e565b611830565b005b348015610712575f80fd5b5061071b611926565b6040516107289190612c05565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107fb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061080b575061080a8261192c565b5b9050919050565b60606003805461082190613133565b80601f016020809104026020016040519081016040528092919081815260200182805461084d90613133565b80156108985780601f1061086f57610100808354040283529160200191610898565b820191905f5260205f20905b81548152906001019060200180831161087b57829003601f168201915b5050505050905090565b5f6108ac82611995565b6108e2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f61092482610c9f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361098b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109aa6119cc565b73ffffffffffffffffffffffffffffffffffffffff16141580156109dc57506109da816109d56119cc565b6117a2565b155b15610a13576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a1e8383836119d3565b505050565b5f60025460015403905090565b610a386119cc565b73ffffffffffffffffffffffffffffffffffffffff16610a56611186565b73ffffffffffffffffffffffffffffffffffffffff1614610aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa3906131ad565b60405180910390fd5b80600e8190555050565b610ac1838383611a82565b505050565b610ace6119cc565b73ffffffffffffffffffffffffffffffffffffffff16610aec611186565b73ffffffffffffffffffffffffffffffffffffffff1614610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b39906131ad565b60405180910390fd5b60095481610b4e610a23565b610b5891906131f8565b10610b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8f90613275565b60405180910390fd5b610ba28282611f4c565b5050565b610bc083838360405180602001604052805f8152506116ae565b505050565b610bcd6119cc565b73ffffffffffffffffffffffffffffffffffffffff16610beb611186565b73ffffffffffffffffffffffffffffffffffffffff1614610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c38906131ad565b60405180910390fd5b5f4790508173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610c88573d5f803e3d5ffd5b505050565b600b5f9054906101000a900460ff1681565b5f610ca982611f69565b5f01519050919050565b600a8054610cc090613133565b80601f0160208091040260200160405190810160405280929190818152602001828054610cec90613133565b8015610d375780601f10610d0e57610100808354040283529160200191610d37565b820191905f5260205f20905b815481529060010190602001808311610d1a57829003601f168201915b505050505081565b610d476119cc565b73ffffffffffffffffffffffffffffffffffffffff16610d65611186565b73ffffffffffffffffffffffffffffffffffffffff1614610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db2906131ad565b60405180910390fd5b8060098190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e2b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610e976119cc565b73ffffffffffffffffffffffffffffffffffffffff16610eb5611186565b73ffffffffffffffffffffffffffffffffffffffff1614610f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f02906131ad565b60405180910390fd5b610f145f6121d3565b565b610f1e6119cc565b73ffffffffffffffffffffffffffffffffffffffff16610f3c611186565b73ffffffffffffffffffffffffffffffffffffffff1614610f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f89906131ad565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610fd5573d5f803e3d5ffd5b505050565b610fe26119cc565b73ffffffffffffffffffffffffffffffffffffffff16611000611186565b73ffffffffffffffffffffffffffffffffffffffff1614611056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104d906131ad565b60405180910390fd5b6009548151611063610a23565b61106d91906131f8565b106110ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a490613275565b60405180910390fd5b5f5b81518110156110ea576110dd8282815181106110ce576110cd613293565b5b60200260200101516001611f4c565b80806001019150506110af565b5050565b6110f66119cc565b73ffffffffffffffffffffffffffffffffffffffff16611114611186565b73ffffffffffffffffffffffffffffffffffffffff161461116a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611161906131ad565b60405180910390fd5b80600b5f6101000a81548160ff02191690831515021790555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546111bc90613133565b80601f01602080910402602001604051908101604052809291908181526020018280546111e890613133565b80156112335780601f1061120a57610100808354040283529160200191611233565b820191905f5260205f20905b81548152906001019060200180831161121657829003601f168201915b5050505050905090565b600b5f9054906101000a900460ff161561128c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112839061330a565b60405180910390fd5b5f81116112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c590613398565b60405180910390fd5b6009546112d9610a23565b826112e491906131f8565b10611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90613400565b60405180910390fd5b80600e54611332919061341e565b341015611374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136b906134a9565b60405180910390fd5b600d54600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054826113c091906131f8565b1115611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f890613537565b60405180910390fd5b61140b3382611f4c565b80600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461145491906131f8565b600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555050565b6114a06119cc565b73ffffffffffffffffffffffffffffffffffffffff166114be611186565b73ffffffffffffffffffffffffffffffffffffffff1614611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b906131ad565b60405180910390fd5b80600a908161152391906136f2565b5050565b61152f6119cc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611593576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060085f61159f6119cc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116486119cc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161168d9190612a2f565b60405180910390a35050565b600c602052805f5260405f205f915090505481565b6116b9848484611a82565b6116c584848484612294565b6116fb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061170c82611995565b611742576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61174b61240d565b90505f8151036117695760405180602001604052805f815250611794565b806117738461249d565b6040516020016117849291906137fb565b6040516020818303038152906040525b915050919050565b60095481565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6118386119cc565b73ffffffffffffffffffffffffffffffffffffffff16611856611186565b73ffffffffffffffffffffffffffffffffffffffff16146118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a3906131ad565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361191a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119119061388e565b60405180910390fd5b611923816121d3565b50565b600e5481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f600154821080156119c5575060055f8381526020019081526020015f205f01601c9054906101000a900460ff16155b9050919050565b5f33905090565b8260075f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f611a8c82611f69565b90505f815f015173ffffffffffffffffffffffffffffffffffffffff16611ab16119cc565b73ffffffffffffffffffffffffffffffffffffffff161480611ae35750611ae2825f0151611add6119cc565b6117a2565b5b80611b285750611af16119cc565b73ffffffffffffffffffffffffffffffffffffffff16611b10846108a2565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611b61576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff1614611bc9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c2e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c3b85858560016125f6565b611c495f84845f01516119d3565b600160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360055f8581526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260055f8581526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f6001840190505f73ffffffffffffffffffffffffffffffffffffffff1660055f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611edc57600154811015611edb57825f015160055f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826020015160055f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f4585858560016125fc565b5050505050565b611f65828260405180602001604052805f815250612602565b5050565b611f71612944565b5f82905060015481101561219c575f60055f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff1615151515815250509050806040015161219a575f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16146120865780925050506121ce565b5b6001156121995781806001900392505060055f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16146121945780925050506121ce565b612087565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6122b48473ffffffffffffffffffffffffffffffffffffffff16612614565b15612400578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122dd6119cc565b8786866040518563ffffffff1660e01b81526004016122ff94939291906138fe565b6020604051808303815f875af192505050801561233a57506040513d601f19601f82011682018060405250810190612337919061395c565b60015b6123b0573d805f8114612368576040519150601f19603f3d011682016040523d82523d5f602084013e61236d565b606091505b505f8151036123a8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612405565b600190505b949350505050565b6060600a805461241c90613133565b80601f016020809104026020016040519081016040528092919081815260200182805461244890613133565b80156124935780601f1061246a57610100808354040283529160200191612493565b820191905f5260205f20905b81548152906001019060200180831161247657829003601f168201915b5050505050905090565b60605f82036124e3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125f1565b5f8290505f5b5f82146125125780806124fb90613987565b915050600a8261250b91906139fb565b91506124e9565b5f8167ffffffffffffffff81111561252d5761252c612c9d565b5b6040519080825280601f01601f19166020018201604052801561255f5781602001600182028036833780820191505090505b5090505b5f85146125ea576001826125779190613a2b565b9150600a856125869190613a5e565b603061259291906131f8565b60f81b8183815181106125a8576125a7613293565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a856125e391906139fb565b9450612563565b8093505050505b919050565b50505050565b50505050565b61260f8383836001612625565b505050565b5f80823b90505f8111915050919050565b5f60015490505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612690576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f84036126c9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126d55f8683876125f6565b8360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508460055f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260055f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f8190505f5b8581101561292857818773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156128dc57506128da5f888488612294565b155b15612913576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612863565b50806001819055505061293d5f8683876125fc565b5050505050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129c981612995565b81146129d3575f80fd5b50565b5f813590506129e4816129c0565b92915050565b5f602082840312156129ff576129fe61298d565b5b5f612a0c848285016129d6565b91505092915050565b5f8115159050919050565b612a2981612a15565b82525050565b5f602082019050612a425f830184612a20565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612a8a82612a48565b612a948185612a52565b9350612aa4818560208601612a62565b612aad81612a70565b840191505092915050565b5f6020820190508181035f830152612ad08184612a80565b905092915050565b5f819050919050565b612aea81612ad8565b8114612af4575f80fd5b50565b5f81359050612b0581612ae1565b92915050565b5f60208284031215612b2057612b1f61298d565b5b5f612b2d84828501612af7565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612b5f82612b36565b9050919050565b612b6f81612b55565b82525050565b5f602082019050612b885f830184612b66565b92915050565b612b9781612b55565b8114612ba1575f80fd5b50565b5f81359050612bb281612b8e565b92915050565b5f8060408385031215612bce57612bcd61298d565b5b5f612bdb85828601612ba4565b9250506020612bec85828601612af7565b9150509250929050565b612bff81612ad8565b82525050565b5f602082019050612c185f830184612bf6565b92915050565b5f805f60608486031215612c3557612c3461298d565b5b5f612c4286828701612ba4565b9350506020612c5386828701612ba4565b9250506040612c6486828701612af7565b9150509250925092565b5f60208284031215612c8357612c8261298d565b5b5f612c9084828501612ba4565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612cd382612a70565b810181811067ffffffffffffffff82111715612cf257612cf1612c9d565b5b80604052505050565b5f612d04612984565b9050612d108282612cca565b919050565b5f67ffffffffffffffff821115612d2f57612d2e612c9d565b5b602082029050602081019050919050565b5f80fd5b5f612d56612d5184612d15565b612cfb565b90508083825260208201905060208402830185811115612d7957612d78612d40565b5b835b81811015612da25780612d8e8882612ba4565b845260208401935050602081019050612d7b565b5050509392505050565b5f82601f830112612dc057612dbf612c99565b5b8135612dd0848260208601612d44565b91505092915050565b5f60208284031215612dee57612ded61298d565b5b5f82013567ffffffffffffffff811115612e0b57612e0a612991565b5b612e1784828501612dac565b91505092915050565b612e2981612a15565b8114612e33575f80fd5b50565b5f81359050612e4481612e20565b92915050565b5f60208284031215612e5f57612e5e61298d565b5b5f612e6c84828501612e36565b91505092915050565b5f80fd5b5f67ffffffffffffffff821115612e9357612e92612c9d565b5b612e9c82612a70565b9050602081019050919050565b828183375f83830152505050565b5f612ec9612ec484612e79565b612cfb565b905082815260208101848484011115612ee557612ee4612e75565b5b612ef0848285612ea9565b509392505050565b5f82601f830112612f0c57612f0b612c99565b5b8135612f1c848260208601612eb7565b91505092915050565b5f60208284031215612f3a57612f3961298d565b5b5f82013567ffffffffffffffff811115612f5757612f56612991565b5b612f6384828501612ef8565b91505092915050565b5f8060408385031215612f8257612f8161298d565b5b5f612f8f85828601612ba4565b9250506020612fa085828601612e36565b9150509250929050565b5f67ffffffffffffffff821115612fc457612fc3612c9d565b5b612fcd82612a70565b9050602081019050919050565b5f612fec612fe784612faa565b612cfb565b90508281526020810184848401111561300857613007612e75565b5b613013848285612ea9565b509392505050565b5f82601f83011261302f5761302e612c99565b5b813561303f848260208601612fda565b91505092915050565b5f805f80608085870312156130605761305f61298d565b5b5f61306d87828801612ba4565b945050602061307e87828801612ba4565b935050604061308f87828801612af7565b925050606085013567ffffffffffffffff8111156130b0576130af612991565b5b6130bc8782880161301b565b91505092959194509250565b5f80604083850312156130de576130dd61298d565b5b5f6130eb85828601612ba4565b92505060206130fc85828601612ba4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061314a57607f821691505b60208210810361315d5761315c613106565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613197602083612a52565b91506131a282613163565b602082019050919050565b5f6020820190508181035f8301526131c48161318b565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61320282612ad8565b915061320d83612ad8565b9250828201905080821115613225576132246131cb565b5b92915050565b7f4d617820537570706c7920526561636865642e000000000000000000000000005f82015250565b5f61325f601383612a52565b915061326a8261322b565b602082019050919050565b5f6020820190508181035f83015261328c81613253565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f53616c65206973207061757365642100000000000000000000000000000000005f82015250565b5f6132f4600f83612a52565b91506132ff826132c0565b602082019050919050565b5f6020820190508181035f830152613321816132e8565b9050919050565b7f4d696e696d756d2031204e46542068617320746f206265206d696e74656420705f8201527f6572207472616e73616374696f6e000000000000000000000000000000000000602082015250565b5f613382602e83612a52565b915061338d82613328565b604082019050919050565b5f6020820190508181035f8301526133af81613376565b9050919050565b7f536f6c64206f75740000000000000000000000000000000000000000000000005f82015250565b5f6133ea600883612a52565b91506133f5826133b6565b602082019050919050565b5f6020820190508181035f830152613417816133de565b9050919050565b5f61342882612ad8565b915061343383612ad8565b925082820261344181612ad8565b91508282048414831517613458576134576131cb565b5b5092915050565b7f506c656173652073656e6420636f727265637420616d6f756e742e00000000005f82015250565b5f613493601b83612a52565b915061349e8261345f565b602082019050919050565b5f6020820190508181035f8301526134c081613487565b9050919050565b7f596f752063616e6e6f74206d696e74206d6f7265207468616e20313030206e665f8201527f74732e0000000000000000000000000000000000000000000000000000000000602082015250565b5f613521602383612a52565b915061352c826134c7565b604082019050919050565b5f6020820190508181035f83015261354e81613515565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026135b17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613576565b6135bb8683613576565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6135f66135f16135ec84612ad8565b6135d3565b612ad8565b9050919050565b5f819050919050565b61360f836135dc565b61362361361b826135fd565b848454613582565b825550505050565b5f90565b61363761362b565b613642818484613606565b505050565b5b818110156136655761365a5f8261362f565b600181019050613648565b5050565b601f8211156136aa5761367b81613555565b61368484613567565b81016020851015613693578190505b6136a761369f85613567565b830182613647565b50505b505050565b5f82821c905092915050565b5f6136ca5f19846008026136af565b1980831691505092915050565b5f6136e283836136bb565b9150826002028217905092915050565b6136fb82612a48565b67ffffffffffffffff81111561371457613713612c9d565b5b61371e8254613133565b613729828285613669565b5f60209050601f83116001811461375a575f8415613748578287015190505b61375285826136d7565b8655506137b9565b601f19841661376886613555565b5f5b8281101561378f5784890151825560018201915060208501945060208101905061376a565b868310156137ac57848901516137a8601f8916826136bb565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f6137d582612a48565b6137df81856137c1565b93506137ef818560208601612a62565b80840191505092915050565b5f61380682856137cb565b915061381282846137cb565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613878602683612a52565b91506138838261381e565b604082019050919050565b5f6020820190508181035f8301526138a58161386c565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6138d0826138ac565b6138da81856138b6565b93506138ea818560208601612a62565b6138f381612a70565b840191505092915050565b5f6080820190506139115f830187612b66565b61391e6020830186612b66565b61392b6040830185612bf6565b818103606083015261393d81846138c6565b905095945050505050565b5f81519050613956816129c0565b92915050565b5f602082840312156139715761397061298d565b5b5f61397e84828501613948565b91505092915050565b5f61399182612ad8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139c3576139c26131cb565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613a0582612ad8565b9150613a1083612ad8565b925082613a2057613a1f6139ce565b5b828204905092915050565b5f613a3582612ad8565b9150613a4083612ad8565b9250828203905081811115613a5857613a576131cb565b5b92915050565b5f613a6882612ad8565b9150613a7383612ad8565b925082613a8357613a826139ce565b5b82820690509291505056fea26469706673582212206ade75da1f390f21c83617696b3696c450154192170e8aacaa5dace7cfddfeac64736f6c634300081a0033

Deployed Bytecode

0x6080604052600436106101d7575f3560e01c8063715018a611610101578063a22cb46511610094578063d5abeb0111610063578063d5abeb0114610679578063e985e9c5146106a3578063f2fde38b146106df578063f51f96dd14610707576101d7565b8063a22cb465146105b1578063b4b42a3b146105d9578063b88d4fde14610615578063c87b56dd1461063d576101d7565b80638da5cb5b116100d05780638da5cb5b1461051957806395d89b4114610543578063a0712d681461056d578063a0bcfc7f14610589576101d7565b8063715018a61461048b578063736fe565146104a15780638a0c5204146104c95780638d92becd146104f1576101d7565b806340a72310116101795780636352211e116101485780636352211e146103c15780636c0360eb146103fd5780636f8b44b01461042757806370a082311461044f576101d7565b806340a723101461031f57806342842e0e1461034757806351cff8d91461036f5780635d08c1ae14610397576101d7565b8063095ea7b3116101b5578063095ea7b31461027d57806318160ddd146102a55780631919fed7146102cf57806323b872dd146102f7576101d7565b806301ffc9a7146101db57806306fdde0314610217578063081812fc14610241575b5f80fd5b3480156101e6575f80fd5b5061020160048036038101906101fc91906129ea565b610731565b60405161020e9190612a2f565b60405180910390f35b348015610222575f80fd5b5061022b610812565b6040516102389190612ab8565b60405180910390f35b34801561024c575f80fd5b5061026760048036038101906102629190612b0b565b6108a2565b6040516102749190612b75565b60405180910390f35b348015610288575f80fd5b506102a3600480360381019061029e9190612bb8565b61091a565b005b3480156102b0575f80fd5b506102b9610a23565b6040516102c69190612c05565b60405180910390f35b3480156102da575f80fd5b506102f560048036038101906102f09190612b0b565b610a30565b005b348015610302575f80fd5b5061031d60048036038101906103189190612c1e565b610ab6565b005b34801561032a575f80fd5b5061034560048036038101906103409190612bb8565b610ac6565b005b348015610352575f80fd5b5061036d60048036038101906103689190612c1e565b610ba6565b005b34801561037a575f80fd5b5061039560048036038101906103909190612c6e565b610bc5565b005b3480156103a2575f80fd5b506103ab610c8d565b6040516103b89190612a2f565b60405180910390f35b3480156103cc575f80fd5b506103e760048036038101906103e29190612b0b565b610c9f565b6040516103f49190612b75565b60405180910390f35b348015610408575f80fd5b50610411610cb3565b60405161041e9190612ab8565b60405180910390f35b348015610432575f80fd5b5061044d60048036038101906104489190612b0b565b610d3f565b005b34801561045a575f80fd5b5061047560048036038101906104709190612c6e565b610dc5565b6040516104829190612c05565b60405180910390f35b348015610496575f80fd5b5061049f610e8f565b005b3480156104ac575f80fd5b506104c760048036038101906104c29190612bb8565b610f16565b005b3480156104d4575f80fd5b506104ef60048036038101906104ea9190612dd9565b610fda565b005b3480156104fc575f80fd5b5061051760048036038101906105129190612e4a565b6110ee565b005b348015610524575f80fd5b5061052d611186565b60405161053a9190612b75565b60405180910390f35b34801561054e575f80fd5b506105576111ad565b6040516105649190612ab8565b60405180910390f35b61058760048036038101906105829190612b0b565b61123d565b005b348015610594575f80fd5b506105af60048036038101906105aa9190612f25565b611498565b005b3480156105bc575f80fd5b506105d760048036038101906105d29190612f6c565b611527565b005b3480156105e4575f80fd5b506105ff60048036038101906105fa9190612c6e565b611699565b60405161060c9190612c05565b60405180910390f35b348015610620575f80fd5b5061063b60048036038101906106369190613048565b6116ae565b005b348015610648575f80fd5b50610663600480360381019061065e9190612b0b565b611701565b6040516106709190612ab8565b60405180910390f35b348015610684575f80fd5b5061068d61179c565b60405161069a9190612c05565b60405180910390f35b3480156106ae575f80fd5b506106c960048036038101906106c491906130c8565b6117a2565b6040516106d69190612a2f565b60405180910390f35b3480156106ea575f80fd5b5061070560048036038101906107009190612c6e565b611830565b005b348015610712575f80fd5b5061071b611926565b6040516107289190612c05565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107fb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061080b575061080a8261192c565b5b9050919050565b60606003805461082190613133565b80601f016020809104026020016040519081016040528092919081815260200182805461084d90613133565b80156108985780601f1061086f57610100808354040283529160200191610898565b820191905f5260205f20905b81548152906001019060200180831161087b57829003601f168201915b5050505050905090565b5f6108ac82611995565b6108e2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f61092482610c9f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361098b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109aa6119cc565b73ffffffffffffffffffffffffffffffffffffffff16141580156109dc57506109da816109d56119cc565b6117a2565b155b15610a13576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a1e8383836119d3565b505050565b5f60025460015403905090565b610a386119cc565b73ffffffffffffffffffffffffffffffffffffffff16610a56611186565b73ffffffffffffffffffffffffffffffffffffffff1614610aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa3906131ad565b60405180910390fd5b80600e8190555050565b610ac1838383611a82565b505050565b610ace6119cc565b73ffffffffffffffffffffffffffffffffffffffff16610aec611186565b73ffffffffffffffffffffffffffffffffffffffff1614610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b39906131ad565b60405180910390fd5b60095481610b4e610a23565b610b5891906131f8565b10610b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8f90613275565b60405180910390fd5b610ba28282611f4c565b5050565b610bc083838360405180602001604052805f8152506116ae565b505050565b610bcd6119cc565b73ffffffffffffffffffffffffffffffffffffffff16610beb611186565b73ffffffffffffffffffffffffffffffffffffffff1614610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c38906131ad565b60405180910390fd5b5f4790508173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610c88573d5f803e3d5ffd5b505050565b600b5f9054906101000a900460ff1681565b5f610ca982611f69565b5f01519050919050565b600a8054610cc090613133565b80601f0160208091040260200160405190810160405280929190818152602001828054610cec90613133565b8015610d375780601f10610d0e57610100808354040283529160200191610d37565b820191905f5260205f20905b815481529060010190602001808311610d1a57829003601f168201915b505050505081565b610d476119cc565b73ffffffffffffffffffffffffffffffffffffffff16610d65611186565b73ffffffffffffffffffffffffffffffffffffffff1614610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db2906131ad565b60405180910390fd5b8060098190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e2b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610e976119cc565b73ffffffffffffffffffffffffffffffffffffffff16610eb5611186565b73ffffffffffffffffffffffffffffffffffffffff1614610f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f02906131ad565b60405180910390fd5b610f145f6121d3565b565b610f1e6119cc565b73ffffffffffffffffffffffffffffffffffffffff16610f3c611186565b73ffffffffffffffffffffffffffffffffffffffff1614610f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f89906131ad565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015610fd5573d5f803e3d5ffd5b505050565b610fe26119cc565b73ffffffffffffffffffffffffffffffffffffffff16611000611186565b73ffffffffffffffffffffffffffffffffffffffff1614611056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104d906131ad565b60405180910390fd5b6009548151611063610a23565b61106d91906131f8565b106110ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a490613275565b60405180910390fd5b5f5b81518110156110ea576110dd8282815181106110ce576110cd613293565b5b60200260200101516001611f4c565b80806001019150506110af565b5050565b6110f66119cc565b73ffffffffffffffffffffffffffffffffffffffff16611114611186565b73ffffffffffffffffffffffffffffffffffffffff161461116a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611161906131ad565b60405180910390fd5b80600b5f6101000a81548160ff02191690831515021790555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546111bc90613133565b80601f01602080910402602001604051908101604052809291908181526020018280546111e890613133565b80156112335780601f1061120a57610100808354040283529160200191611233565b820191905f5260205f20905b81548152906001019060200180831161121657829003601f168201915b5050505050905090565b600b5f9054906101000a900460ff161561128c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112839061330a565b60405180910390fd5b5f81116112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c590613398565b60405180910390fd5b6009546112d9610a23565b826112e491906131f8565b10611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90613400565b60405180910390fd5b80600e54611332919061341e565b341015611374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136b906134a9565b60405180910390fd5b600d54600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054826113c091906131f8565b1115611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f890613537565b60405180910390fd5b61140b3382611f4c565b80600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461145491906131f8565b600c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555050565b6114a06119cc565b73ffffffffffffffffffffffffffffffffffffffff166114be611186565b73ffffffffffffffffffffffffffffffffffffffff1614611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b906131ad565b60405180910390fd5b80600a908161152391906136f2565b5050565b61152f6119cc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611593576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060085f61159f6119cc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116486119cc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161168d9190612a2f565b60405180910390a35050565b600c602052805f5260405f205f915090505481565b6116b9848484611a82565b6116c584848484612294565b6116fb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061170c82611995565b611742576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61174b61240d565b90505f8151036117695760405180602001604052805f815250611794565b806117738461249d565b6040516020016117849291906137fb565b6040516020818303038152906040525b915050919050565b60095481565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6118386119cc565b73ffffffffffffffffffffffffffffffffffffffff16611856611186565b73ffffffffffffffffffffffffffffffffffffffff16146118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a3906131ad565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361191a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119119061388e565b60405180910390fd5b611923816121d3565b50565b600e5481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f600154821080156119c5575060055f8381526020019081526020015f205f01601c9054906101000a900460ff16155b9050919050565b5f33905090565b8260075f8481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f611a8c82611f69565b90505f815f015173ffffffffffffffffffffffffffffffffffffffff16611ab16119cc565b73ffffffffffffffffffffffffffffffffffffffff161480611ae35750611ae2825f0151611add6119cc565b6117a2565b5b80611b285750611af16119cc565b73ffffffffffffffffffffffffffffffffffffffff16611b10846108a2565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611b61576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16825f015173ffffffffffffffffffffffffffffffffffffffff1614611bc9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c2e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c3b85858560016125f6565b611c495f84845f01516119d3565b600160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600160065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360055f8581526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260055f8581526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f6001840190505f73ffffffffffffffffffffffffffffffffffffffff1660055f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611edc57600154811015611edb57825f015160055f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826020015160055f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f4585858560016125fc565b5050505050565b611f65828260405180602001604052805f815250612602565b5050565b611f71612944565b5f82905060015481101561219c575f60055f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff1615151515815250509050806040015161219a575f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16146120865780925050506121ce565b5b6001156121995781806001900392505060055f8381526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020015f8201601c9054906101000a900460ff16151515158152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16146121945780925050506121ce565b612087565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6122b48473ffffffffffffffffffffffffffffffffffffffff16612614565b15612400578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122dd6119cc565b8786866040518563ffffffff1660e01b81526004016122ff94939291906138fe565b6020604051808303815f875af192505050801561233a57506040513d601f19601f82011682018060405250810190612337919061395c565b60015b6123b0573d805f8114612368576040519150601f19603f3d011682016040523d82523d5f602084013e61236d565b606091505b505f8151036123a8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612405565b600190505b949350505050565b6060600a805461241c90613133565b80601f016020809104026020016040519081016040528092919081815260200182805461244890613133565b80156124935780601f1061246a57610100808354040283529160200191612493565b820191905f5260205f20905b81548152906001019060200180831161247657829003601f168201915b5050505050905090565b60605f82036124e3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125f1565b5f8290505f5b5f82146125125780806124fb90613987565b915050600a8261250b91906139fb565b91506124e9565b5f8167ffffffffffffffff81111561252d5761252c612c9d565b5b6040519080825280601f01601f19166020018201604052801561255f5781602001600182028036833780820191505090505b5090505b5f85146125ea576001826125779190613a2b565b9150600a856125869190613a5e565b603061259291906131f8565b60f81b8183815181106125a8576125a7613293565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a856125e391906139fb565b9450612563565b8093505050505b919050565b50505050565b50505050565b61260f8383836001612625565b505050565b5f80823b90505f8111915050919050565b5f60015490505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612690576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f84036126c9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126d55f8683876125f6565b8360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f8282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508460055f8381526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260055f8381526020019081526020015f205f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505f8190505f5b8581101561292857818773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156128dc57506128da5f888488612294565b155b15612913576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612863565b50806001819055505061293d5f8683876125fc565b5050505050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f151581525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129c981612995565b81146129d3575f80fd5b50565b5f813590506129e4816129c0565b92915050565b5f602082840312156129ff576129fe61298d565b5b5f612a0c848285016129d6565b91505092915050565b5f8115159050919050565b612a2981612a15565b82525050565b5f602082019050612a425f830184612a20565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612a8a82612a48565b612a948185612a52565b9350612aa4818560208601612a62565b612aad81612a70565b840191505092915050565b5f6020820190508181035f830152612ad08184612a80565b905092915050565b5f819050919050565b612aea81612ad8565b8114612af4575f80fd5b50565b5f81359050612b0581612ae1565b92915050565b5f60208284031215612b2057612b1f61298d565b5b5f612b2d84828501612af7565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612b5f82612b36565b9050919050565b612b6f81612b55565b82525050565b5f602082019050612b885f830184612b66565b92915050565b612b9781612b55565b8114612ba1575f80fd5b50565b5f81359050612bb281612b8e565b92915050565b5f8060408385031215612bce57612bcd61298d565b5b5f612bdb85828601612ba4565b9250506020612bec85828601612af7565b9150509250929050565b612bff81612ad8565b82525050565b5f602082019050612c185f830184612bf6565b92915050565b5f805f60608486031215612c3557612c3461298d565b5b5f612c4286828701612ba4565b9350506020612c5386828701612ba4565b9250506040612c6486828701612af7565b9150509250925092565b5f60208284031215612c8357612c8261298d565b5b5f612c9084828501612ba4565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612cd382612a70565b810181811067ffffffffffffffff82111715612cf257612cf1612c9d565b5b80604052505050565b5f612d04612984565b9050612d108282612cca565b919050565b5f67ffffffffffffffff821115612d2f57612d2e612c9d565b5b602082029050602081019050919050565b5f80fd5b5f612d56612d5184612d15565b612cfb565b90508083825260208201905060208402830185811115612d7957612d78612d40565b5b835b81811015612da25780612d8e8882612ba4565b845260208401935050602081019050612d7b565b5050509392505050565b5f82601f830112612dc057612dbf612c99565b5b8135612dd0848260208601612d44565b91505092915050565b5f60208284031215612dee57612ded61298d565b5b5f82013567ffffffffffffffff811115612e0b57612e0a612991565b5b612e1784828501612dac565b91505092915050565b612e2981612a15565b8114612e33575f80fd5b50565b5f81359050612e4481612e20565b92915050565b5f60208284031215612e5f57612e5e61298d565b5b5f612e6c84828501612e36565b91505092915050565b5f80fd5b5f67ffffffffffffffff821115612e9357612e92612c9d565b5b612e9c82612a70565b9050602081019050919050565b828183375f83830152505050565b5f612ec9612ec484612e79565b612cfb565b905082815260208101848484011115612ee557612ee4612e75565b5b612ef0848285612ea9565b509392505050565b5f82601f830112612f0c57612f0b612c99565b5b8135612f1c848260208601612eb7565b91505092915050565b5f60208284031215612f3a57612f3961298d565b5b5f82013567ffffffffffffffff811115612f5757612f56612991565b5b612f6384828501612ef8565b91505092915050565b5f8060408385031215612f8257612f8161298d565b5b5f612f8f85828601612ba4565b9250506020612fa085828601612e36565b9150509250929050565b5f67ffffffffffffffff821115612fc457612fc3612c9d565b5b612fcd82612a70565b9050602081019050919050565b5f612fec612fe784612faa565b612cfb565b90508281526020810184848401111561300857613007612e75565b5b613013848285612ea9565b509392505050565b5f82601f83011261302f5761302e612c99565b5b813561303f848260208601612fda565b91505092915050565b5f805f80608085870312156130605761305f61298d565b5b5f61306d87828801612ba4565b945050602061307e87828801612ba4565b935050604061308f87828801612af7565b925050606085013567ffffffffffffffff8111156130b0576130af612991565b5b6130bc8782880161301b565b91505092959194509250565b5f80604083850312156130de576130dd61298d565b5b5f6130eb85828601612ba4565b92505060206130fc85828601612ba4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061314a57607f821691505b60208210810361315d5761315c613106565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f613197602083612a52565b91506131a282613163565b602082019050919050565b5f6020820190508181035f8301526131c48161318b565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61320282612ad8565b915061320d83612ad8565b9250828201905080821115613225576132246131cb565b5b92915050565b7f4d617820537570706c7920526561636865642e000000000000000000000000005f82015250565b5f61325f601383612a52565b915061326a8261322b565b602082019050919050565b5f6020820190508181035f83015261328c81613253565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f53616c65206973207061757365642100000000000000000000000000000000005f82015250565b5f6132f4600f83612a52565b91506132ff826132c0565b602082019050919050565b5f6020820190508181035f830152613321816132e8565b9050919050565b7f4d696e696d756d2031204e46542068617320746f206265206d696e74656420705f8201527f6572207472616e73616374696f6e000000000000000000000000000000000000602082015250565b5f613382602e83612a52565b915061338d82613328565b604082019050919050565b5f6020820190508181035f8301526133af81613376565b9050919050565b7f536f6c64206f75740000000000000000000000000000000000000000000000005f82015250565b5f6133ea600883612a52565b91506133f5826133b6565b602082019050919050565b5f6020820190508181035f830152613417816133de565b9050919050565b5f61342882612ad8565b915061343383612ad8565b925082820261344181612ad8565b91508282048414831517613458576134576131cb565b5b5092915050565b7f506c656173652073656e6420636f727265637420616d6f756e742e00000000005f82015250565b5f613493601b83612a52565b915061349e8261345f565b602082019050919050565b5f6020820190508181035f8301526134c081613487565b9050919050565b7f596f752063616e6e6f74206d696e74206d6f7265207468616e20313030206e665f8201527f74732e0000000000000000000000000000000000000000000000000000000000602082015250565b5f613521602383612a52565b915061352c826134c7565b604082019050919050565b5f6020820190508181035f83015261354e81613515565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026135b17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613576565b6135bb8683613576565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6135f66135f16135ec84612ad8565b6135d3565b612ad8565b9050919050565b5f819050919050565b61360f836135dc565b61362361361b826135fd565b848454613582565b825550505050565b5f90565b61363761362b565b613642818484613606565b505050565b5b818110156136655761365a5f8261362f565b600181019050613648565b5050565b601f8211156136aa5761367b81613555565b61368484613567565b81016020851015613693578190505b6136a761369f85613567565b830182613647565b50505b505050565b5f82821c905092915050565b5f6136ca5f19846008026136af565b1980831691505092915050565b5f6136e283836136bb565b9150826002028217905092915050565b6136fb82612a48565b67ffffffffffffffff81111561371457613713612c9d565b5b61371e8254613133565b613729828285613669565b5f60209050601f83116001811461375a575f8415613748578287015190505b61375285826136d7565b8655506137b9565b601f19841661376886613555565b5f5b8281101561378f5784890151825560018201915060208501945060208101905061376a565b868310156137ac57848901516137a8601f8916826136bb565b8355505b6001600288020188555050505b505050505050565b5f81905092915050565b5f6137d582612a48565b6137df81856137c1565b93506137ef818560208601612a62565b80840191505092915050565b5f61380682856137cb565b915061381282846137cb565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613878602683612a52565b91506138838261381e565b604082019050919050565b5f6020820190508181035f8301526138a58161386c565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6138d0826138ac565b6138da81856138b6565b93506138ea818560208601612a62565b6138f381612a70565b840191505092915050565b5f6080820190506139115f830187612b66565b61391e6020830186612b66565b61392b6040830185612bf6565b818103606083015261393d81846138c6565b905095945050505050565b5f81519050613956816129c0565b92915050565b5f602082840312156139715761397061298d565b5b5f61397e84828501613948565b91505092915050565b5f61399182612ad8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139c3576139c26131cb565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613a0582612ad8565b9150613a1083612ad8565b925082613a2057613a1f6139ce565b5b828204905092915050565b5f613a3582612ad8565b9150613a4083612ad8565b9250828203905081811115613a5857613a576131cb565b5b92915050565b5f613a6882612ad8565b9150613a7383612ad8565b925082613a8357613a826139ce565b5b82820690509291505056fea26469706673582212206ade75da1f390f21c83617696b3696c450154192170e8aacaa5dace7cfddfeac64736f6c634300081a0033

Deployed Bytecode Sourcemap

54979:2271:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25345:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28705:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30208:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29771:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24994:279;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56634:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31065:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55583:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31306:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56944:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55095:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28514:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55060:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56729:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25714:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14111:94;;;;;;;;;;;;;:::i;:::-;;57111:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55312:265;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56537:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13460:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28874:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55798:633;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56439:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30484:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55132:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31562:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29049:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55025:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30834:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14360:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55219: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;56634:87::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56709:4:::1;56697:9;:16;;;;56634:87:::0;:::o;31065:170::-;31199:28;31209:4;31215:2;31219:7;31199:9;:28::i;:::-;31065:170;;;:::o;55583:207::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55706:9:::1;;55697:6;55681:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:34;55673:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;55754:28;55764:9;55775:6;55754:9;:28::i;:::-;55583:207:::0;;:::o;31306:185::-;31444:39;31461:4;31467:2;31471:7;31444:39;;;;;;;;;;;;:16;:39::i;:::-;31306:185;;;:::o;56944:157::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57005:13:::1;57021:21;57005:37;;57061:3;57053:21;;:31;57075:8;57053:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;56994:107;56944:157:::0;:::o;55095:30::-;;;;;;;;;;;;;:::o;28514:124::-;28578:7;28605:20;28617:7;28605:11;:20::i;:::-;:25;;;28598:32;;28514:124;;;:::o;55060:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56729:88::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56804:5:::1;56792:9;:17;;;;56729: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;57111:136::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57204:3:::1;57196:21;;:34;57218:11;57196:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57111:136:::0;;:::o;55312:265::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55445:9:::1;;55427:8;:15;55411:13;:11;:13::i;:::-;:31;;;;:::i;:::-;:43;55403:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;55493:6;55489:80;55509:8;:15;55505:1;:19;55489:80;;;55544:25;55554:8;55563:1;55554:11;;;;;;;;:::i;:::-;;;;;;;;55567:1;55544:9;:25::i;:::-;55526:3;;;;;;;55489:80;;;;55312:265:::0;:::o;56537:89::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56614:4:::1;56601:10;;:17;;;;;;;;;;;;;;;;;;56537: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;55798:633::-;55900:10;;;;;;;;;;;55899:11;55891:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;55961:1;55949:9;:13;55941:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;56060:9;;56044:13;:11;:13::i;:::-;56032:9;:25;;;;:::i;:::-;:37;56024:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56126:9;56114;;:21;;;;:::i;:::-;56101:9;:34;;56093:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;56226:14;;56198:12;:24;56211:10;56198:24;;;;;;;;;;;;;;;;56186:9;:36;;;;:::i;:::-;:54;;56178:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;56317:32;56327:10;56339:9;56317;:32::i;:::-;56414:9;56387:12;:24;56400:10;56387:24;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;56360:12;:24;56373:10;56360:24;;;;;;;;;;;;;;;:63;;;;55798:633;:::o;56439:92::-;13691:12;:10;:12::i;:::-;13680:23;;:7;:5;:7::i;:::-;:23;;;13672:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56519:4:::1;56509:7;:14;;;;;;:::i;:::-;;56439: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;55132: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;55025: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;55219: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;56825:108::-;56885:13;56918:7;56911:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56825: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:222::-;21964:34;21960:1;21952:6;21948:14;21941:58;22033:5;22028:2;22020:6;22016:15;22009:30;21824:222;:::o;22052:366::-;22194:3;22215:67;22279:2;22274:3;22215:67;:::i;:::-;22208:74;;22291:93;22380:3;22291:93;:::i;:::-;22409:2;22404:3;22400:12;22393:19;;22052:366;;;:::o;22424:419::-;22590:4;22628:2;22617:9;22613:18;22605:26;;22677:9;22671:4;22667:20;22663:1;22652:9;22648:17;22641:47;22705:131;22831:4;22705:131;:::i;:::-;22697:139;;22424:419;;;:::o;22849:141::-;22898:4;22921:3;22913:11;;22944:3;22941:1;22934:14;22978:4;22975:1;22965:18;22957:26;;22849:141;;;:::o;22996:93::-;23033:6;23080:2;23075;23068:5;23064:14;23060:23;23050:33;;22996:93;;;:::o;23095:107::-;23139:8;23189:5;23183:4;23179:16;23158:37;;23095:107;;;;:::o;23208:393::-;23277:6;23327:1;23315:10;23311:18;23350:97;23380:66;23369:9;23350:97;:::i;:::-;23468:39;23498:8;23487:9;23468:39;:::i;:::-;23456:51;;23540:4;23536:9;23529:5;23525:21;23516:30;;23589:4;23579:8;23575:19;23568:5;23565:30;23555:40;;23284:317;;23208:393;;;;;:::o;23607:60::-;23635:3;23656:5;23649:12;;23607:60;;;:::o;23673:142::-;23723:9;23756:53;23774:34;23783:24;23801:5;23783:24;:::i;:::-;23774:34;:::i;:::-;23756:53;:::i;:::-;23743:66;;23673:142;;;:::o;23821:75::-;23864:3;23885:5;23878:12;;23821:75;;;:::o;23902:269::-;24012:39;24043:7;24012:39;:::i;:::-;24073:91;24122:41;24146:16;24122:41;:::i;:::-;24114:6;24107:4;24101:11;24073:91;:::i;:::-;24067:4;24060:105;23978:193;23902:269;;;:::o;24177:73::-;24222:3;24177:73;:::o;24256:189::-;24333:32;;:::i;:::-;24374:65;24432:6;24424;24418:4;24374:65;:::i;:::-;24309:136;24256:189;;:::o;24451:186::-;24511:120;24528:3;24521:5;24518:14;24511:120;;;24582:39;24619:1;24612:5;24582:39;:::i;:::-;24555:1;24548:5;24544:13;24535:22;;24511:120;;;24451:186;;:::o;24643:543::-;24744:2;24739:3;24736:11;24733:446;;;24778:38;24810:5;24778:38;:::i;:::-;24862:29;24880:10;24862:29;:::i;:::-;24852:8;24848:44;25045:2;25033:10;25030:18;25027:49;;;25066:8;25051:23;;25027:49;25089:80;25145:22;25163:3;25145:22;:::i;:::-;25135:8;25131:37;25118:11;25089:80;:::i;:::-;24748:431;;24733:446;24643:543;;;:::o;25192:117::-;25246:8;25296:5;25290:4;25286:16;25265:37;;25192:117;;;;:::o;25315:169::-;25359:6;25392:51;25440:1;25436:6;25428:5;25425:1;25421:13;25392:51;:::i;:::-;25388:56;25473:4;25467;25463:15;25453:25;;25366:118;25315:169;;;;:::o;25489:295::-;25565:4;25711:29;25736:3;25730:4;25711:29;:::i;:::-;25703:37;;25773:3;25770:1;25766:11;25760:4;25757:21;25749:29;;25489:295;;;;:::o;25789:1395::-;25906:37;25939:3;25906:37;:::i;:::-;26008:18;26000:6;25997:30;25994:56;;;26030:18;;:::i;:::-;25994:56;26074:38;26106:4;26100:11;26074:38;:::i;:::-;26159:67;26219:6;26211;26205:4;26159:67;:::i;:::-;26253:1;26277:4;26264:17;;26309:2;26301:6;26298:14;26326:1;26321:618;;;;26983:1;27000:6;26997:77;;;27049:9;27044:3;27040:19;27034:26;27025:35;;26997:77;27100:67;27160:6;27153:5;27100:67;:::i;:::-;27094:4;27087:81;26956:222;26291:887;;26321:618;26373:4;26369:9;26361:6;26357:22;26407:37;26439:4;26407:37;:::i;:::-;26466:1;26480:208;26494:7;26491:1;26488:14;26480:208;;;26573:9;26568:3;26564:19;26558:26;26550:6;26543:42;26624:1;26616:6;26612:14;26602:24;;26671:2;26660:9;26656:18;26643:31;;26517:4;26514:1;26510:12;26505:17;;26480:208;;;26716:6;26707:7;26704:19;26701:179;;;26774:9;26769:3;26765:19;26759:26;26817:48;26859:4;26851:6;26847:17;26836:9;26817:48;:::i;:::-;26809:6;26802:64;26724:156;26701:179;26926:1;26922;26914:6;26910:14;26906:22;26900:4;26893:36;26328:611;;;26291:887;;25881:1303;;;25789:1395;;:::o;27190:148::-;27292:11;27329:3;27314:18;;27190:148;;;;:::o;27344:390::-;27450:3;27478:39;27511:5;27478:39;:::i;:::-;27533:89;27615:6;27610:3;27533:89;:::i;:::-;27526:96;;27631:65;27689:6;27684:3;27677:4;27670:5;27666:16;27631:65;:::i;:::-;27721:6;27716:3;27712:16;27705:23;;27454:280;27344:390;;;;:::o;27740:435::-;27920:3;27942:95;28033:3;28024:6;27942:95;:::i;:::-;27935:102;;28054:95;28145:3;28136:6;28054:95;:::i;:::-;28047:102;;28166:3;28159:10;;27740:435;;;;;:::o;28181:225::-;28321:34;28317:1;28309:6;28305:14;28298:58;28390:8;28385:2;28377:6;28373:15;28366:33;28181:225;:::o;28412:366::-;28554:3;28575:67;28639:2;28634:3;28575:67;:::i;:::-;28568:74;;28651:93;28740:3;28651:93;:::i;:::-;28769:2;28764:3;28760:12;28753:19;;28412:366;;;:::o;28784:419::-;28950:4;28988:2;28977:9;28973:18;28965:26;;29037:9;29031:4;29027:20;29023:1;29012:9;29008:17;29001:47;29065:131;29191:4;29065:131;:::i;:::-;29057:139;;28784:419;;;:::o;29209:98::-;29260:6;29294:5;29288:12;29278:22;;29209:98;;;:::o;29313:168::-;29396:11;29430:6;29425:3;29418:19;29470:4;29465:3;29461:14;29446:29;;29313:168;;;;:::o;29487:373::-;29573:3;29601:38;29633:5;29601:38;:::i;:::-;29655:70;29718:6;29713:3;29655:70;:::i;:::-;29648:77;;29734:65;29792:6;29787:3;29780:4;29773:5;29769:16;29734:65;:::i;:::-;29824:29;29846:6;29824:29;:::i;:::-;29819:3;29815:39;29808:46;;29577:283;29487:373;;;;:::o;29866:640::-;30061:4;30099:3;30088:9;30084:19;30076:27;;30113:71;30181:1;30170:9;30166:17;30157:6;30113:71;:::i;:::-;30194:72;30262:2;30251:9;30247:18;30238:6;30194:72;:::i;:::-;30276;30344:2;30333:9;30329:18;30320:6;30276:72;:::i;:::-;30395:9;30389:4;30385:20;30380:2;30369:9;30365:18;30358:48;30423:76;30494:4;30485:6;30423:76;:::i;:::-;30415:84;;29866:640;;;;;;;:::o;30512:141::-;30568:5;30599:6;30593:13;30584:22;;30615:32;30641:5;30615:32;:::i;:::-;30512:141;;;;:::o;30659:349::-;30728:6;30777:2;30765:9;30756:7;30752:23;30748:32;30745:119;;;30783:79;;:::i;:::-;30745:119;30903:1;30928:63;30983:7;30974:6;30963:9;30959:22;30928:63;:::i;:::-;30918:73;;30874:127;30659:349;;;;:::o;31014:233::-;31053:3;31076:24;31094:5;31076:24;:::i;:::-;31067:33;;31122:66;31115:5;31112:77;31109:103;;31192:18;;:::i;:::-;31109:103;31239:1;31232:5;31228:13;31221:20;;31014:233;;;:::o;31253:180::-;31301:77;31298:1;31291:88;31398:4;31395:1;31388:15;31422:4;31419:1;31412:15;31439:185;31479:1;31496:20;31514:1;31496:20;:::i;:::-;31491:25;;31530:20;31548:1;31530:20;:::i;:::-;31525:25;;31569:1;31559:35;;31574:18;;:::i;:::-;31559:35;31616:1;31613;31609:9;31604:14;;31439:185;;;;:::o;31630:194::-;31670:4;31690:20;31708:1;31690:20;:::i;:::-;31685:25;;31724:20;31742:1;31724:20;:::i;:::-;31719:25;;31768:1;31765;31761:9;31753:17;;31792:1;31786:4;31783:11;31780:37;;;31797:18;;:::i;:::-;31780:37;31630:194;;;;:::o;31830:176::-;31862:1;31879:20;31897:1;31879:20;:::i;:::-;31874:25;;31913:20;31931:1;31913:20;:::i;:::-;31908:25;;31952:1;31942:35;;31957:18;;:::i;:::-;31942:35;31998:1;31995;31991:9;31986:14;;31830:176;;;;:::o

Swarm Source

ipfs://6ade75da1f390f21c83617696b3696c450154192170e8aacaa5dace7cfddfeac
[ 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.