ETH Price: $3,733.45 (-4.71%)

Token

StarryApes (SAAC)
 

Overview

Max Total Supply

3,055 SAAC

Holders

670

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 SAAC
0xD86F41CED6f932768985BDDc2936e417c82f373a
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
StarryApes

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-28
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

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);
            }
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/SAAC.sol


pragma solidity ^0.8.0;




contract StarryApes is ERC721Enumerable, Ownable {
    using Strings for uint256;

    uint256 public constant MAX_APES = 10000;
    uint256 public constant MAX_PER_MINT = 10;
    uint256 public PRICE = 0.00 ether;
    uint256 public numAPESMinted;
    string public baseTokenURI;
    string public baseExtension = ".json";
    bool public publicSaleStarted;

    mapping(address => uint256) private _totalClaimed;

    event BaseURIChanged(string baseURI);
    event PublicSaleMint(address minter, uint256 amountOfAPES);

    modifier whenPublicSaleStarted() {
        require(publicSaleStarted, "Public sale has not started");
        _;
    }
    
    constructor(string memory baseURI) ERC721("StarryApes", "SAAC") {
        baseTokenURI = baseURI;
    }

    function amountClaimedBy(address owner) external view returns (uint256) {
        require(owner != address(0), "Cannot add null address");

        return _totalClaimed[owner];
    }

    function mint(uint256 amountOfAPES) external payable whenPublicSaleStarted {
        require(totalSupply() < MAX_APES, "All tokens have been minted");
        require(amountOfAPES <= MAX_PER_MINT, "Cannot purchase this many tokens in a transaction");
        require(totalSupply() + amountOfAPES <= MAX_APES, "Minting would exceed max supply");
        require(amountOfAPES > 0, "Must mint at least one Ape");
        require(PRICE * amountOfAPES == msg.value, "ETH amount is incorrect");

        for (uint256 i = 0; i < amountOfAPES; i++) {
            uint256 tokenId = numAPESMinted + 1;

            numAPESMinted += 1;
            _totalClaimed[msg.sender] += 1;
            _safeMint(msg.sender, tokenId);
        }

        emit PublicSaleMint(msg.sender, amountOfAPES);
    }

    function togglePublicSaleStarted() external onlyOwner {
        publicSaleStarted = !publicSaleStarted;
    }

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

    function setBaseURI(string memory baseURI) public onlyOwner {
        baseTokenURI = baseURI;
        emit BaseURIChanged(baseURI);
    }
    
    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
   }
    
   function setPrice(uint256 _newPrice) public onlyOwner() {
        PRICE = _newPrice;
   }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
        : "";
    }
    
    function withdraw() public payable onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "Insufficent balance");
        (bool success, ) = payable(msg.sender).call{value: balance}("");
        require(success);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"BaseURIChanged","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":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfAPES","type":"uint256"}],"name":"PublicSaleMint","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":[],"name":"MAX_APES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"amountClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","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":[{"internalType":"uint256","name":"amountOfAPES","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numAPESMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","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":[],"name":"togglePublicSaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600b556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e90805190602001906200005692919062000238565b503480156200006457600080fd5b5060405162004b2338038062004b2383398181016040528101906200008a919062000366565b6040518060400160405280600a81526020017f53746172727941706573000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f534141430000000000000000000000000000000000000000000000000000000081525081600090805190602001906200010e92919062000238565b5080600190805190602001906200012792919062000238565b5050506200014a6200013e6200016a60201b60201c565b6200017260201b60201c565b80600d90805190602001906200016292919062000238565b50506200053b565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000246906200044c565b90600052602060002090601f0160209004810192826200026a5760008555620002b6565b82601f106200028557805160ff1916838001178555620002b6565b82800160010185558215620002b6579182015b82811115620002b557825182559160200191906001019062000298565b5b509050620002c59190620002c9565b5090565b5b80821115620002e4576000816000905550600101620002ca565b5090565b6000620002ff620002f984620003e0565b620003b7565b9050828152602081018484840111156200031e576200031d6200051b565b5b6200032b84828562000416565b509392505050565b600082601f8301126200034b576200034a62000516565b5b81516200035d848260208601620002e8565b91505092915050565b6000602082840312156200037f576200037e62000525565b5b600082015167ffffffffffffffff811115620003a0576200039f62000520565b5b620003ae8482850162000333565b91505092915050565b6000620003c3620003d6565b9050620003d1828262000482565b919050565b6000604051905090565b600067ffffffffffffffff821115620003fe57620003fd620004e7565b5b62000409826200052a565b9050602081019050919050565b60005b838110156200043657808201518184015260208101905062000419565b8381111562000446576000848401525b50505050565b600060028204905060018216806200046557607f821691505b602082108114156200047c576200047b620004b8565b5b50919050565b6200048d826200052a565b810181811067ffffffffffffffff82111715620004af57620004ae620004e7565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6145d8806200054b6000396000f3fe6080604052600436106101ee5760003560e01c8063715018a61161010d578063b47a70ea116100a0578063c87b56dd1161006f578063c87b56dd146106bf578063d547cfb7146106fc578063da3ef23f14610727578063e985e9c514610750578063f2fde38b1461078d576101ee565b8063b47a70ea14610615578063b88d4fde14610640578063bb8a16bd14610669578063c668286214610694576101ee565b806395d89b41116100dc57806395d89b411461057a578063a0712d68146105a5578063a22cb465146105c1578063a2e91477146105ea576101ee565b8063715018a6146104e45780638d859f3e146104fb5780638da5cb5b1461052657806391b7f5ed14610551576101ee565b80632f745c59116101855780634f6ccce7116101545780634f6ccce71461040457806355f804b3146104415780636352211e1461046a57806370a08231146104a7576101ee565b80632f745c591461037d5780632f814575146103ba5780633ccfd60b146103d157806342842e0e146103db576101ee565b806309d42b30116101c157806309d42b30146102c157806318160ddd146102ec5780631978f4691461031757806323b872dd14610354576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612fd0565b6107b6565b6040516102279190613676565b60405180910390f35b34801561023c57600080fd5b50610245610830565b6040516102529190613691565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613073565b6108c2565b60405161028f91906135e6565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612f90565b610947565b005b3480156102cd57600080fd5b506102d6610a5f565b6040516102e391906139f3565b60405180910390f35b3480156102f857600080fd5b50610301610a64565b60405161030e91906139f3565b60405180910390f35b34801561032357600080fd5b5061033e60048036038101906103399190612e0d565b610a71565b60405161034b91906139f3565b60405180910390f35b34801561036057600080fd5b5061037b60048036038101906103769190612e7a565b610b29565b005b34801561038957600080fd5b506103a4600480360381019061039f9190612f90565b610b89565b6040516103b191906139f3565b60405180910390f35b3480156103c657600080fd5b506103cf610c2e565b005b6103d9610cd6565b005b3480156103e757600080fd5b5061040260048036038101906103fd9190612e7a565b610e14565b005b34801561041057600080fd5b5061042b60048036038101906104269190613073565b610e34565b60405161043891906139f3565b60405180910390f35b34801561044d57600080fd5b506104686004803603810190610463919061302a565b610ea5565b005b34801561047657600080fd5b50610491600480360381019061048c9190613073565b610f72565b60405161049e91906135e6565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190612e0d565b611024565b6040516104db91906139f3565b60405180910390f35b3480156104f057600080fd5b506104f96110dc565b005b34801561050757600080fd5b50610510611164565b60405161051d91906139f3565b60405180910390f35b34801561053257600080fd5b5061053b61116a565b60405161054891906135e6565b60405180910390f35b34801561055d57600080fd5b5061057860048036038101906105739190613073565b611194565b005b34801561058657600080fd5b5061058f61121a565b60405161059c9190613691565b60405180910390f35b6105bf60048036038101906105ba9190613073565b6112ac565b005b3480156105cd57600080fd5b506105e860048036038101906105e39190612f50565b61155d565b005b3480156105f657600080fd5b506105ff611573565b60405161060c9190613676565b60405180910390f35b34801561062157600080fd5b5061062a611586565b60405161063791906139f3565b60405180910390f35b34801561064c57600080fd5b5061066760048036038101906106629190612ecd565b61158c565b005b34801561067557600080fd5b5061067e6115ee565b60405161068b91906139f3565b60405180910390f35b3480156106a057600080fd5b506106a96115f4565b6040516106b69190613691565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e19190613073565b611682565b6040516106f39190613691565b60405180910390f35b34801561070857600080fd5b5061071161172c565b60405161071e9190613691565b60405180910390f35b34801561073357600080fd5b5061074e6004803603810190610749919061302a565b6117ba565b005b34801561075c57600080fd5b5061077760048036038101906107729190612e3a565b611850565b6040516107849190613676565b60405180910390f35b34801561079957600080fd5b506107b460048036038101906107af9190612e0d565b6118e4565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108295750610828826119dc565b5b9050919050565b60606000805461083f90613cc3565b80601f016020809104026020016040519081016040528092919081815260200182805461086b90613cc3565b80156108b85780601f1061088d576101008083540402835291602001916108b8565b820191906000526020600020905b81548152906001019060200180831161089b57829003601f168201915b5050505050905090565b60006108cd82611abe565b61090c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610903906138b3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095282610f72565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ba90613953565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109e2611b2a565b73ffffffffffffffffffffffffffffffffffffffff161480610a115750610a1081610a0b611b2a565b611850565b5b610a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a47906137d3565b60405180910390fd5b610a5a8383611b32565b505050565b600a81565b6000600880549050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad990613973565b60405180910390fd5b601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b3a610b34611b2a565b82611beb565b610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7090613993565b60405180910390fd5b610b84838383611cc9565b505050565b6000610b9483611024565b8210610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc906136b3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c36611b2a565b73ffffffffffffffffffffffffffffffffffffffff16610c5461116a565b73ffffffffffffffffffffffffffffffffffffffff1614610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca1906138f3565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610cde611b2a565b73ffffffffffffffffffffffffffffffffffffffff16610cfc61116a565b73ffffffffffffffffffffffffffffffffffffffff1614610d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d49906138f3565b60405180910390fd5b600047905060008111610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d91906138d3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610dc0906135d1565b60006040518083038185875af1925050503d8060008114610dfd576040519150601f19603f3d011682016040523d82523d6000602084013e610e02565b606091505b5050905080610e1057600080fd5b5050565b610e2f8383836040518060200160405280600081525061158c565b505050565b6000610e3e610a64565b8210610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e76906139b3565b60405180910390fd5b60088281548110610e9357610e92613e5c565b5b90600052602060002001549050919050565b610ead611b2a565b73ffffffffffffffffffffffffffffffffffffffff16610ecb61116a565b73ffffffffffffffffffffffffffffffffffffffff1614610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f18906138f3565b60405180910390fd5b80600d9080519060200190610f37929190612c21565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf681604051610f679190613691565b60405180910390a150565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101290613813565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c906137f3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110e4611b2a565b73ffffffffffffffffffffffffffffffffffffffff1661110261116a565b73ffffffffffffffffffffffffffffffffffffffff1614611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f906138f3565b60405180910390fd5b6111626000611f25565b565b600b5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61119c611b2a565b73ffffffffffffffffffffffffffffffffffffffff166111ba61116a565b73ffffffffffffffffffffffffffffffffffffffff1614611210576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611207906138f3565b60405180910390fd5b80600b8190555050565b60606001805461122990613cc3565b80601f016020809104026020016040519081016040528092919081815260200182805461125590613cc3565b80156112a25780601f10611277576101008083540402835291602001916112a2565b820191906000526020600020905b81548152906001019060200180831161128557829003601f168201915b5050505050905090565b600f60009054906101000a900460ff166112fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f290613753565b60405180910390fd5b612710611306610a64565b10611346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133d906139d3565b60405180910390fd5b600a81111561138a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138190613853565b60405180910390fd5b61271081611396610a64565b6113a09190613af8565b11156113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d890613833565b60405180910390fd5b60008111611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b90613733565b60405180910390fd5b3481600b546114339190613b7f565b14611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90613893565b60405180910390fd5b60005b818110156115205760006001600c5461148f9190613af8565b90506001600c60008282546114a49190613af8565b925050819055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114fb9190613af8565b9250508190555061150c3382611feb565b50808061151890613d26565b915050611476565b507f239739eec2dbaccb604ff1de6462a5eccd5f3148924696dd88f04d636ff582b5338260405161155292919061364d565b60405180910390a150565b61156f611568611b2a565b8383612009565b5050565b600f60009054906101000a900460ff1681565b600c5481565b61159d611597611b2a565b83611beb565b6115dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d390613993565b60405180910390fd5b6115e884848484612176565b50505050565b61271081565b600e805461160190613cc3565b80601f016020809104026020016040519081016040528092919081815260200182805461162d90613cc3565b801561167a5780601f1061164f5761010080835404028352916020019161167a565b820191906000526020600020905b81548152906001019060200180831161165d57829003601f168201915b505050505081565b606061168d82611abe565b6116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c390613933565b60405180910390fd5b60006116d66121d2565b905060008151116116f65760405180602001604052806000815250611724565b8061170084612264565b600e604051602001611714939291906135a0565b6040516020818303038152906040525b915050919050565b600d805461173990613cc3565b80601f016020809104026020016040519081016040528092919081815260200182805461176590613cc3565b80156117b25780601f10611787576101008083540402835291602001916117b2565b820191906000526020600020905b81548152906001019060200180831161179557829003601f168201915b505050505081565b6117c2611b2a565b73ffffffffffffffffffffffffffffffffffffffff166117e061116a565b73ffffffffffffffffffffffffffffffffffffffff1614611836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182d906138f3565b60405180910390fd5b80600e908051906020019061184c929190612c21565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118ec611b2a565b73ffffffffffffffffffffffffffffffffffffffff1661190a61116a565b73ffffffffffffffffffffffffffffffffffffffff1614611960576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611957906138f3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c7906136f3565b60405180910390fd5b6119d981611f25565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611aa757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ab75750611ab6826123c5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ba583610f72565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611bf682611abe565b611c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2c906137b3565b60405180910390fd5b6000611c4083610f72565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611caf57508373ffffffffffffffffffffffffffffffffffffffff16611c97846108c2565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cc05750611cbf8185611850565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ce982610f72565b73ffffffffffffffffffffffffffffffffffffffff1614611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690613913565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da690613773565b60405180910390fd5b611dba83838361242f565b611dc5600082611b32565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e159190613bd9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e6c9190613af8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612005828260405180602001604052806000815250612543565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206f90613793565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121699190613676565b60405180910390a3505050565b612181848484611cc9565b61218d8484848461259e565b6121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c3906136d3565b60405180910390fd5b50505050565b6060600d80546121e190613cc3565b80601f016020809104026020016040519081016040528092919081815260200182805461220d90613cc3565b801561225a5780601f1061222f5761010080835404028352916020019161225a565b820191906000526020600020905b81548152906001019060200180831161223d57829003601f168201915b5050505050905090565b606060008214156122ac576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123c0565b600082905060005b600082146122de5780806122c790613d26565b915050600a826122d79190613b4e565b91506122b4565b60008167ffffffffffffffff8111156122fa576122f9613e8b565b5b6040519080825280601f01601f19166020018201604052801561232c5781602001600182028036833780820191505090505b5090505b600085146123b9576001826123459190613bd9565b9150600a856123549190613d6f565b60306123609190613af8565b60f81b81838151811061237657612375613e5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123b29190613b4e565b9450612330565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61243a838383612735565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561247d576124788161273a565b6124bc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124bb576124ba8382612783565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124ff576124fa816128f0565b61253e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461253d5761253c82826129c1565b5b5b505050565b61254d8383612a40565b61255a600084848461259e565b612599576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612590906136d3565b60405180910390fd5b505050565b60006125bf8473ffffffffffffffffffffffffffffffffffffffff16612c0e565b15612728578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125e8611b2a565b8786866040518563ffffffff1660e01b815260040161260a9493929190613601565b602060405180830381600087803b15801561262457600080fd5b505af192505050801561265557506040513d601f19601f820116820180604052508101906126529190612ffd565b60015b6126d8573d8060008114612685576040519150601f19603f3d011682016040523d82523d6000602084013e61268a565b606091505b506000815114156126d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c7906136d3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061272d565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161279084611024565b61279a9190613bd9565b905060006007600084815260200190815260200160002054905081811461287f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129049190613bd9565b905060006009600084815260200190815260200160002054905060006008838154811061293457612933613e5c565b5b90600052602060002001549050806008838154811061295657612955613e5c565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806129a5576129a4613e2d565b5b6001900381819060005260206000200160009055905550505050565b60006129cc83611024565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa790613873565b60405180910390fd5b612ab981611abe565b15612af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af090613713565b60405180910390fd5b612b056000838361242f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b559190613af8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612c2d90613cc3565b90600052602060002090601f016020900481019282612c4f5760008555612c96565b82601f10612c6857805160ff1916838001178555612c96565b82800160010185558215612c96579182015b82811115612c95578251825591602001919060010190612c7a565b5b509050612ca39190612ca7565b5090565b5b80821115612cc0576000816000905550600101612ca8565b5090565b6000612cd7612cd284613a33565b613a0e565b905082815260208101848484011115612cf357612cf2613ebf565b5b612cfe848285613c81565b509392505050565b6000612d19612d1484613a64565b613a0e565b905082815260208101848484011115612d3557612d34613ebf565b5b612d40848285613c81565b509392505050565b600081359050612d5781614546565b92915050565b600081359050612d6c8161455d565b92915050565b600081359050612d8181614574565b92915050565b600081519050612d9681614574565b92915050565b600082601f830112612db157612db0613eba565b5b8135612dc1848260208601612cc4565b91505092915050565b600082601f830112612ddf57612dde613eba565b5b8135612def848260208601612d06565b91505092915050565b600081359050612e078161458b565b92915050565b600060208284031215612e2357612e22613ec9565b5b6000612e3184828501612d48565b91505092915050565b60008060408385031215612e5157612e50613ec9565b5b6000612e5f85828601612d48565b9250506020612e7085828601612d48565b9150509250929050565b600080600060608486031215612e9357612e92613ec9565b5b6000612ea186828701612d48565b9350506020612eb286828701612d48565b9250506040612ec386828701612df8565b9150509250925092565b60008060008060808587031215612ee757612ee6613ec9565b5b6000612ef587828801612d48565b9450506020612f0687828801612d48565b9350506040612f1787828801612df8565b925050606085013567ffffffffffffffff811115612f3857612f37613ec4565b5b612f4487828801612d9c565b91505092959194509250565b60008060408385031215612f6757612f66613ec9565b5b6000612f7585828601612d48565b9250506020612f8685828601612d5d565b9150509250929050565b60008060408385031215612fa757612fa6613ec9565b5b6000612fb585828601612d48565b9250506020612fc685828601612df8565b9150509250929050565b600060208284031215612fe657612fe5613ec9565b5b6000612ff484828501612d72565b91505092915050565b60006020828403121561301357613012613ec9565b5b600061302184828501612d87565b91505092915050565b6000602082840312156130405761303f613ec9565b5b600082013567ffffffffffffffff81111561305e5761305d613ec4565b5b61306a84828501612dca565b91505092915050565b60006020828403121561308957613088613ec9565b5b600061309784828501612df8565b91505092915050565b6130a981613c0d565b82525050565b6130b881613c1f565b82525050565b60006130c982613aaa565b6130d38185613ac0565b93506130e3818560208601613c90565b6130ec81613ece565b840191505092915050565b600061310282613ab5565b61310c8185613adc565b935061311c818560208601613c90565b61312581613ece565b840191505092915050565b600061313b82613ab5565b6131458185613aed565b9350613155818560208601613c90565b80840191505092915050565b6000815461316e81613cc3565b6131788186613aed565b9450600182166000811461319357600181146131a4576131d7565b60ff198316865281860193506131d7565b6131ad85613a95565b60005b838110156131cf578154818901526001820191506020810190506131b0565b838801955050505b50505092915050565b60006131ed602b83613adc565b91506131f882613edf565b604082019050919050565b6000613210603283613adc565b915061321b82613f2e565b604082019050919050565b6000613233602683613adc565b915061323e82613f7d565b604082019050919050565b6000613256601c83613adc565b915061326182613fcc565b602082019050919050565b6000613279601a83613adc565b915061328482613ff5565b602082019050919050565b600061329c601b83613adc565b91506132a78261401e565b602082019050919050565b60006132bf602483613adc565b91506132ca82614047565b604082019050919050565b60006132e2601983613adc565b91506132ed82614096565b602082019050919050565b6000613305602c83613adc565b9150613310826140bf565b604082019050919050565b6000613328603883613adc565b91506133338261410e565b604082019050919050565b600061334b602a83613adc565b91506133568261415d565b604082019050919050565b600061336e602983613adc565b9150613379826141ac565b604082019050919050565b6000613391601f83613adc565b915061339c826141fb565b602082019050919050565b60006133b4603183613adc565b91506133bf82614224565b604082019050919050565b60006133d7602083613adc565b91506133e282614273565b602082019050919050565b60006133fa601783613adc565b91506134058261429c565b602082019050919050565b600061341d602c83613adc565b9150613428826142c5565b604082019050919050565b6000613440601383613adc565b915061344b82614314565b602082019050919050565b6000613463602083613adc565b915061346e8261433d565b602082019050919050565b6000613486602983613adc565b915061349182614366565b604082019050919050565b60006134a9602f83613adc565b91506134b4826143b5565b604082019050919050565b60006134cc602183613adc565b91506134d782614404565b604082019050919050565b60006134ef600083613ad1565b91506134fa82614453565b600082019050919050565b6000613512601783613adc565b915061351d82614456565b602082019050919050565b6000613535603183613adc565b91506135408261447f565b604082019050919050565b6000613558602c83613adc565b9150613563826144ce565b604082019050919050565b600061357b601b83613adc565b91506135868261451d565b602082019050919050565b61359a81613c77565b82525050565b60006135ac8286613130565b91506135b88285613130565b91506135c48284613161565b9150819050949350505050565b60006135dc826134e2565b9150819050919050565b60006020820190506135fb60008301846130a0565b92915050565b600060808201905061361660008301876130a0565b61362360208301866130a0565b6136306040830185613591565b818103606083015261364281846130be565b905095945050505050565b600060408201905061366260008301856130a0565b61366f6020830184613591565b9392505050565b600060208201905061368b60008301846130af565b92915050565b600060208201905081810360008301526136ab81846130f7565b905092915050565b600060208201905081810360008301526136cc816131e0565b9050919050565b600060208201905081810360008301526136ec81613203565b9050919050565b6000602082019050818103600083015261370c81613226565b9050919050565b6000602082019050818103600083015261372c81613249565b9050919050565b6000602082019050818103600083015261374c8161326c565b9050919050565b6000602082019050818103600083015261376c8161328f565b9050919050565b6000602082019050818103600083015261378c816132b2565b9050919050565b600060208201905081810360008301526137ac816132d5565b9050919050565b600060208201905081810360008301526137cc816132f8565b9050919050565b600060208201905081810360008301526137ec8161331b565b9050919050565b6000602082019050818103600083015261380c8161333e565b9050919050565b6000602082019050818103600083015261382c81613361565b9050919050565b6000602082019050818103600083015261384c81613384565b9050919050565b6000602082019050818103600083015261386c816133a7565b9050919050565b6000602082019050818103600083015261388c816133ca565b9050919050565b600060208201905081810360008301526138ac816133ed565b9050919050565b600060208201905081810360008301526138cc81613410565b9050919050565b600060208201905081810360008301526138ec81613433565b9050919050565b6000602082019050818103600083015261390c81613456565b9050919050565b6000602082019050818103600083015261392c81613479565b9050919050565b6000602082019050818103600083015261394c8161349c565b9050919050565b6000602082019050818103600083015261396c816134bf565b9050919050565b6000602082019050818103600083015261398c81613505565b9050919050565b600060208201905081810360008301526139ac81613528565b9050919050565b600060208201905081810360008301526139cc8161354b565b9050919050565b600060208201905081810360008301526139ec8161356e565b9050919050565b6000602082019050613a086000830184613591565b92915050565b6000613a18613a29565b9050613a248282613cf5565b919050565b6000604051905090565b600067ffffffffffffffff821115613a4e57613a4d613e8b565b5b613a5782613ece565b9050602081019050919050565b600067ffffffffffffffff821115613a7f57613a7e613e8b565b5b613a8882613ece565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b0382613c77565b9150613b0e83613c77565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b4357613b42613da0565b5b828201905092915050565b6000613b5982613c77565b9150613b6483613c77565b925082613b7457613b73613dcf565b5b828204905092915050565b6000613b8a82613c77565b9150613b9583613c77565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bce57613bcd613da0565b5b828202905092915050565b6000613be482613c77565b9150613bef83613c77565b925082821015613c0257613c01613da0565b5b828203905092915050565b6000613c1882613c57565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613cae578082015181840152602081019050613c93565b83811115613cbd576000848401525b50505050565b60006002820490506001821680613cdb57607f821691505b60208210811415613cef57613cee613dfe565b5b50919050565b613cfe82613ece565b810181811067ffffffffffffffff82111715613d1d57613d1c613e8b565b5b80604052505050565b6000613d3182613c77565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d6457613d63613da0565b5b600182019050919050565b6000613d7a82613c77565b9150613d8583613c77565b925082613d9557613d94613dcf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d757374206d696e74206174206c65617374206f6e6520417065000000000000600082015250565b7f5075626c69632073616c6520686173206e6f7420737461727465640000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900600082015250565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e7360008201527f20696e2061207472616e73616374696f6e000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45544820616d6f756e7420697320696e636f7272656374000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e737566666963656e742062616c616e636500000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f43616e6e6f7420616464206e756c6c2061646472657373000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b61454f81613c0d565b811461455a57600080fd5b50565b61456681613c1f565b811461457157600080fd5b50565b61457d81613c2b565b811461458857600080fd5b50565b61459481613c77565b811461459f57600080fd5b5056fea2646970667358221220a2fa0fc93428f9646d816fa6c3b24c1793a9cb7ddf8e7c29ca9190c7868f046164736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d574c797273536d45736d454e61676f4b4c7847436b567037614750564d54614446524c766a366174434a79562f00000000000000000000

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c8063715018a61161010d578063b47a70ea116100a0578063c87b56dd1161006f578063c87b56dd146106bf578063d547cfb7146106fc578063da3ef23f14610727578063e985e9c514610750578063f2fde38b1461078d576101ee565b8063b47a70ea14610615578063b88d4fde14610640578063bb8a16bd14610669578063c668286214610694576101ee565b806395d89b41116100dc57806395d89b411461057a578063a0712d68146105a5578063a22cb465146105c1578063a2e91477146105ea576101ee565b8063715018a6146104e45780638d859f3e146104fb5780638da5cb5b1461052657806391b7f5ed14610551576101ee565b80632f745c59116101855780634f6ccce7116101545780634f6ccce71461040457806355f804b3146104415780636352211e1461046a57806370a08231146104a7576101ee565b80632f745c591461037d5780632f814575146103ba5780633ccfd60b146103d157806342842e0e146103db576101ee565b806309d42b30116101c157806309d42b30146102c157806318160ddd146102ec5780631978f4691461031757806323b872dd14610354576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612fd0565b6107b6565b6040516102279190613676565b60405180910390f35b34801561023c57600080fd5b50610245610830565b6040516102529190613691565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613073565b6108c2565b60405161028f91906135e6565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612f90565b610947565b005b3480156102cd57600080fd5b506102d6610a5f565b6040516102e391906139f3565b60405180910390f35b3480156102f857600080fd5b50610301610a64565b60405161030e91906139f3565b60405180910390f35b34801561032357600080fd5b5061033e60048036038101906103399190612e0d565b610a71565b60405161034b91906139f3565b60405180910390f35b34801561036057600080fd5b5061037b60048036038101906103769190612e7a565b610b29565b005b34801561038957600080fd5b506103a4600480360381019061039f9190612f90565b610b89565b6040516103b191906139f3565b60405180910390f35b3480156103c657600080fd5b506103cf610c2e565b005b6103d9610cd6565b005b3480156103e757600080fd5b5061040260048036038101906103fd9190612e7a565b610e14565b005b34801561041057600080fd5b5061042b60048036038101906104269190613073565b610e34565b60405161043891906139f3565b60405180910390f35b34801561044d57600080fd5b506104686004803603810190610463919061302a565b610ea5565b005b34801561047657600080fd5b50610491600480360381019061048c9190613073565b610f72565b60405161049e91906135e6565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190612e0d565b611024565b6040516104db91906139f3565b60405180910390f35b3480156104f057600080fd5b506104f96110dc565b005b34801561050757600080fd5b50610510611164565b60405161051d91906139f3565b60405180910390f35b34801561053257600080fd5b5061053b61116a565b60405161054891906135e6565b60405180910390f35b34801561055d57600080fd5b5061057860048036038101906105739190613073565b611194565b005b34801561058657600080fd5b5061058f61121a565b60405161059c9190613691565b60405180910390f35b6105bf60048036038101906105ba9190613073565b6112ac565b005b3480156105cd57600080fd5b506105e860048036038101906105e39190612f50565b61155d565b005b3480156105f657600080fd5b506105ff611573565b60405161060c9190613676565b60405180910390f35b34801561062157600080fd5b5061062a611586565b60405161063791906139f3565b60405180910390f35b34801561064c57600080fd5b5061066760048036038101906106629190612ecd565b61158c565b005b34801561067557600080fd5b5061067e6115ee565b60405161068b91906139f3565b60405180910390f35b3480156106a057600080fd5b506106a96115f4565b6040516106b69190613691565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e19190613073565b611682565b6040516106f39190613691565b60405180910390f35b34801561070857600080fd5b5061071161172c565b60405161071e9190613691565b60405180910390f35b34801561073357600080fd5b5061074e6004803603810190610749919061302a565b6117ba565b005b34801561075c57600080fd5b5061077760048036038101906107729190612e3a565b611850565b6040516107849190613676565b60405180910390f35b34801561079957600080fd5b506107b460048036038101906107af9190612e0d565b6118e4565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108295750610828826119dc565b5b9050919050565b60606000805461083f90613cc3565b80601f016020809104026020016040519081016040528092919081815260200182805461086b90613cc3565b80156108b85780601f1061088d576101008083540402835291602001916108b8565b820191906000526020600020905b81548152906001019060200180831161089b57829003601f168201915b5050505050905090565b60006108cd82611abe565b61090c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610903906138b3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095282610f72565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ba90613953565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109e2611b2a565b73ffffffffffffffffffffffffffffffffffffffff161480610a115750610a1081610a0b611b2a565b611850565b5b610a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a47906137d3565b60405180910390fd5b610a5a8383611b32565b505050565b600a81565b6000600880549050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad990613973565b60405180910390fd5b601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b3a610b34611b2a565b82611beb565b610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7090613993565b60405180910390fd5b610b84838383611cc9565b505050565b6000610b9483611024565b8210610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc906136b3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c36611b2a565b73ffffffffffffffffffffffffffffffffffffffff16610c5461116a565b73ffffffffffffffffffffffffffffffffffffffff1614610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca1906138f3565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b610cde611b2a565b73ffffffffffffffffffffffffffffffffffffffff16610cfc61116a565b73ffffffffffffffffffffffffffffffffffffffff1614610d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d49906138f3565b60405180910390fd5b600047905060008111610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d91906138d3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610dc0906135d1565b60006040518083038185875af1925050503d8060008114610dfd576040519150601f19603f3d011682016040523d82523d6000602084013e610e02565b606091505b5050905080610e1057600080fd5b5050565b610e2f8383836040518060200160405280600081525061158c565b505050565b6000610e3e610a64565b8210610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e76906139b3565b60405180910390fd5b60088281548110610e9357610e92613e5c565b5b90600052602060002001549050919050565b610ead611b2a565b73ffffffffffffffffffffffffffffffffffffffff16610ecb61116a565b73ffffffffffffffffffffffffffffffffffffffff1614610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f18906138f3565b60405180910390fd5b80600d9080519060200190610f37929190612c21565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf681604051610f679190613691565b60405180910390a150565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101290613813565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c906137f3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110e4611b2a565b73ffffffffffffffffffffffffffffffffffffffff1661110261116a565b73ffffffffffffffffffffffffffffffffffffffff1614611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f906138f3565b60405180910390fd5b6111626000611f25565b565b600b5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61119c611b2a565b73ffffffffffffffffffffffffffffffffffffffff166111ba61116a565b73ffffffffffffffffffffffffffffffffffffffff1614611210576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611207906138f3565b60405180910390fd5b80600b8190555050565b60606001805461122990613cc3565b80601f016020809104026020016040519081016040528092919081815260200182805461125590613cc3565b80156112a25780601f10611277576101008083540402835291602001916112a2565b820191906000526020600020905b81548152906001019060200180831161128557829003601f168201915b5050505050905090565b600f60009054906101000a900460ff166112fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f290613753565b60405180910390fd5b612710611306610a64565b10611346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133d906139d3565b60405180910390fd5b600a81111561138a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138190613853565b60405180910390fd5b61271081611396610a64565b6113a09190613af8565b11156113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d890613833565b60405180910390fd5b60008111611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b90613733565b60405180910390fd5b3481600b546114339190613b7f565b14611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90613893565b60405180910390fd5b60005b818110156115205760006001600c5461148f9190613af8565b90506001600c60008282546114a49190613af8565b925050819055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114fb9190613af8565b9250508190555061150c3382611feb565b50808061151890613d26565b915050611476565b507f239739eec2dbaccb604ff1de6462a5eccd5f3148924696dd88f04d636ff582b5338260405161155292919061364d565b60405180910390a150565b61156f611568611b2a565b8383612009565b5050565b600f60009054906101000a900460ff1681565b600c5481565b61159d611597611b2a565b83611beb565b6115dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d390613993565b60405180910390fd5b6115e884848484612176565b50505050565b61271081565b600e805461160190613cc3565b80601f016020809104026020016040519081016040528092919081815260200182805461162d90613cc3565b801561167a5780601f1061164f5761010080835404028352916020019161167a565b820191906000526020600020905b81548152906001019060200180831161165d57829003601f168201915b505050505081565b606061168d82611abe565b6116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c390613933565b60405180910390fd5b60006116d66121d2565b905060008151116116f65760405180602001604052806000815250611724565b8061170084612264565b600e604051602001611714939291906135a0565b6040516020818303038152906040525b915050919050565b600d805461173990613cc3565b80601f016020809104026020016040519081016040528092919081815260200182805461176590613cc3565b80156117b25780601f10611787576101008083540402835291602001916117b2565b820191906000526020600020905b81548152906001019060200180831161179557829003601f168201915b505050505081565b6117c2611b2a565b73ffffffffffffffffffffffffffffffffffffffff166117e061116a565b73ffffffffffffffffffffffffffffffffffffffff1614611836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182d906138f3565b60405180910390fd5b80600e908051906020019061184c929190612c21565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118ec611b2a565b73ffffffffffffffffffffffffffffffffffffffff1661190a61116a565b73ffffffffffffffffffffffffffffffffffffffff1614611960576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611957906138f3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c7906136f3565b60405180910390fd5b6119d981611f25565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611aa757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ab75750611ab6826123c5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ba583610f72565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611bf682611abe565b611c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2c906137b3565b60405180910390fd5b6000611c4083610f72565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611caf57508373ffffffffffffffffffffffffffffffffffffffff16611c97846108c2565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cc05750611cbf8185611850565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ce982610f72565b73ffffffffffffffffffffffffffffffffffffffff1614611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690613913565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da690613773565b60405180910390fd5b611dba83838361242f565b611dc5600082611b32565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e159190613bd9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e6c9190613af8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612005828260405180602001604052806000815250612543565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206f90613793565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121699190613676565b60405180910390a3505050565b612181848484611cc9565b61218d8484848461259e565b6121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c3906136d3565b60405180910390fd5b50505050565b6060600d80546121e190613cc3565b80601f016020809104026020016040519081016040528092919081815260200182805461220d90613cc3565b801561225a5780601f1061222f5761010080835404028352916020019161225a565b820191906000526020600020905b81548152906001019060200180831161223d57829003601f168201915b5050505050905090565b606060008214156122ac576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123c0565b600082905060005b600082146122de5780806122c790613d26565b915050600a826122d79190613b4e565b91506122b4565b60008167ffffffffffffffff8111156122fa576122f9613e8b565b5b6040519080825280601f01601f19166020018201604052801561232c5781602001600182028036833780820191505090505b5090505b600085146123b9576001826123459190613bd9565b9150600a856123549190613d6f565b60306123609190613af8565b60f81b81838151811061237657612375613e5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123b29190613b4e565b9450612330565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61243a838383612735565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561247d576124788161273a565b6124bc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124bb576124ba8382612783565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124ff576124fa816128f0565b61253e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461253d5761253c82826129c1565b5b5b505050565b61254d8383612a40565b61255a600084848461259e565b612599576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612590906136d3565b60405180910390fd5b505050565b60006125bf8473ffffffffffffffffffffffffffffffffffffffff16612c0e565b15612728578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125e8611b2a565b8786866040518563ffffffff1660e01b815260040161260a9493929190613601565b602060405180830381600087803b15801561262457600080fd5b505af192505050801561265557506040513d601f19601f820116820180604052508101906126529190612ffd565b60015b6126d8573d8060008114612685576040519150601f19603f3d011682016040523d82523d6000602084013e61268a565b606091505b506000815114156126d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c7906136d3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061272d565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161279084611024565b61279a9190613bd9565b905060006007600084815260200190815260200160002054905081811461287f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129049190613bd9565b905060006009600084815260200190815260200160002054905060006008838154811061293457612933613e5c565b5b90600052602060002001549050806008838154811061295657612955613e5c565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806129a5576129a4613e2d565b5b6001900381819060005260206000200160009055905550505050565b60006129cc83611024565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa790613873565b60405180910390fd5b612ab981611abe565b15612af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af090613713565b60405180910390fd5b612b056000838361242f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b559190613af8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612c2d90613cc3565b90600052602060002090601f016020900481019282612c4f5760008555612c96565b82601f10612c6857805160ff1916838001178555612c96565b82800160010185558215612c96579182015b82811115612c95578251825591602001919060010190612c7a565b5b509050612ca39190612ca7565b5090565b5b80821115612cc0576000816000905550600101612ca8565b5090565b6000612cd7612cd284613a33565b613a0e565b905082815260208101848484011115612cf357612cf2613ebf565b5b612cfe848285613c81565b509392505050565b6000612d19612d1484613a64565b613a0e565b905082815260208101848484011115612d3557612d34613ebf565b5b612d40848285613c81565b509392505050565b600081359050612d5781614546565b92915050565b600081359050612d6c8161455d565b92915050565b600081359050612d8181614574565b92915050565b600081519050612d9681614574565b92915050565b600082601f830112612db157612db0613eba565b5b8135612dc1848260208601612cc4565b91505092915050565b600082601f830112612ddf57612dde613eba565b5b8135612def848260208601612d06565b91505092915050565b600081359050612e078161458b565b92915050565b600060208284031215612e2357612e22613ec9565b5b6000612e3184828501612d48565b91505092915050565b60008060408385031215612e5157612e50613ec9565b5b6000612e5f85828601612d48565b9250506020612e7085828601612d48565b9150509250929050565b600080600060608486031215612e9357612e92613ec9565b5b6000612ea186828701612d48565b9350506020612eb286828701612d48565b9250506040612ec386828701612df8565b9150509250925092565b60008060008060808587031215612ee757612ee6613ec9565b5b6000612ef587828801612d48565b9450506020612f0687828801612d48565b9350506040612f1787828801612df8565b925050606085013567ffffffffffffffff811115612f3857612f37613ec4565b5b612f4487828801612d9c565b91505092959194509250565b60008060408385031215612f6757612f66613ec9565b5b6000612f7585828601612d48565b9250506020612f8685828601612d5d565b9150509250929050565b60008060408385031215612fa757612fa6613ec9565b5b6000612fb585828601612d48565b9250506020612fc685828601612df8565b9150509250929050565b600060208284031215612fe657612fe5613ec9565b5b6000612ff484828501612d72565b91505092915050565b60006020828403121561301357613012613ec9565b5b600061302184828501612d87565b91505092915050565b6000602082840312156130405761303f613ec9565b5b600082013567ffffffffffffffff81111561305e5761305d613ec4565b5b61306a84828501612dca565b91505092915050565b60006020828403121561308957613088613ec9565b5b600061309784828501612df8565b91505092915050565b6130a981613c0d565b82525050565b6130b881613c1f565b82525050565b60006130c982613aaa565b6130d38185613ac0565b93506130e3818560208601613c90565b6130ec81613ece565b840191505092915050565b600061310282613ab5565b61310c8185613adc565b935061311c818560208601613c90565b61312581613ece565b840191505092915050565b600061313b82613ab5565b6131458185613aed565b9350613155818560208601613c90565b80840191505092915050565b6000815461316e81613cc3565b6131788186613aed565b9450600182166000811461319357600181146131a4576131d7565b60ff198316865281860193506131d7565b6131ad85613a95565b60005b838110156131cf578154818901526001820191506020810190506131b0565b838801955050505b50505092915050565b60006131ed602b83613adc565b91506131f882613edf565b604082019050919050565b6000613210603283613adc565b915061321b82613f2e565b604082019050919050565b6000613233602683613adc565b915061323e82613f7d565b604082019050919050565b6000613256601c83613adc565b915061326182613fcc565b602082019050919050565b6000613279601a83613adc565b915061328482613ff5565b602082019050919050565b600061329c601b83613adc565b91506132a78261401e565b602082019050919050565b60006132bf602483613adc565b91506132ca82614047565b604082019050919050565b60006132e2601983613adc565b91506132ed82614096565b602082019050919050565b6000613305602c83613adc565b9150613310826140bf565b604082019050919050565b6000613328603883613adc565b91506133338261410e565b604082019050919050565b600061334b602a83613adc565b91506133568261415d565b604082019050919050565b600061336e602983613adc565b9150613379826141ac565b604082019050919050565b6000613391601f83613adc565b915061339c826141fb565b602082019050919050565b60006133b4603183613adc565b91506133bf82614224565b604082019050919050565b60006133d7602083613adc565b91506133e282614273565b602082019050919050565b60006133fa601783613adc565b91506134058261429c565b602082019050919050565b600061341d602c83613adc565b9150613428826142c5565b604082019050919050565b6000613440601383613adc565b915061344b82614314565b602082019050919050565b6000613463602083613adc565b915061346e8261433d565b602082019050919050565b6000613486602983613adc565b915061349182614366565b604082019050919050565b60006134a9602f83613adc565b91506134b4826143b5565b604082019050919050565b60006134cc602183613adc565b91506134d782614404565b604082019050919050565b60006134ef600083613ad1565b91506134fa82614453565b600082019050919050565b6000613512601783613adc565b915061351d82614456565b602082019050919050565b6000613535603183613adc565b91506135408261447f565b604082019050919050565b6000613558602c83613adc565b9150613563826144ce565b604082019050919050565b600061357b601b83613adc565b91506135868261451d565b602082019050919050565b61359a81613c77565b82525050565b60006135ac8286613130565b91506135b88285613130565b91506135c48284613161565b9150819050949350505050565b60006135dc826134e2565b9150819050919050565b60006020820190506135fb60008301846130a0565b92915050565b600060808201905061361660008301876130a0565b61362360208301866130a0565b6136306040830185613591565b818103606083015261364281846130be565b905095945050505050565b600060408201905061366260008301856130a0565b61366f6020830184613591565b9392505050565b600060208201905061368b60008301846130af565b92915050565b600060208201905081810360008301526136ab81846130f7565b905092915050565b600060208201905081810360008301526136cc816131e0565b9050919050565b600060208201905081810360008301526136ec81613203565b9050919050565b6000602082019050818103600083015261370c81613226565b9050919050565b6000602082019050818103600083015261372c81613249565b9050919050565b6000602082019050818103600083015261374c8161326c565b9050919050565b6000602082019050818103600083015261376c8161328f565b9050919050565b6000602082019050818103600083015261378c816132b2565b9050919050565b600060208201905081810360008301526137ac816132d5565b9050919050565b600060208201905081810360008301526137cc816132f8565b9050919050565b600060208201905081810360008301526137ec8161331b565b9050919050565b6000602082019050818103600083015261380c8161333e565b9050919050565b6000602082019050818103600083015261382c81613361565b9050919050565b6000602082019050818103600083015261384c81613384565b9050919050565b6000602082019050818103600083015261386c816133a7565b9050919050565b6000602082019050818103600083015261388c816133ca565b9050919050565b600060208201905081810360008301526138ac816133ed565b9050919050565b600060208201905081810360008301526138cc81613410565b9050919050565b600060208201905081810360008301526138ec81613433565b9050919050565b6000602082019050818103600083015261390c81613456565b9050919050565b6000602082019050818103600083015261392c81613479565b9050919050565b6000602082019050818103600083015261394c8161349c565b9050919050565b6000602082019050818103600083015261396c816134bf565b9050919050565b6000602082019050818103600083015261398c81613505565b9050919050565b600060208201905081810360008301526139ac81613528565b9050919050565b600060208201905081810360008301526139cc8161354b565b9050919050565b600060208201905081810360008301526139ec8161356e565b9050919050565b6000602082019050613a086000830184613591565b92915050565b6000613a18613a29565b9050613a248282613cf5565b919050565b6000604051905090565b600067ffffffffffffffff821115613a4e57613a4d613e8b565b5b613a5782613ece565b9050602081019050919050565b600067ffffffffffffffff821115613a7f57613a7e613e8b565b5b613a8882613ece565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b0382613c77565b9150613b0e83613c77565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b4357613b42613da0565b5b828201905092915050565b6000613b5982613c77565b9150613b6483613c77565b925082613b7457613b73613dcf565b5b828204905092915050565b6000613b8a82613c77565b9150613b9583613c77565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bce57613bcd613da0565b5b828202905092915050565b6000613be482613c77565b9150613bef83613c77565b925082821015613c0257613c01613da0565b5b828203905092915050565b6000613c1882613c57565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613cae578082015181840152602081019050613c93565b83811115613cbd576000848401525b50505050565b60006002820490506001821680613cdb57607f821691505b60208210811415613cef57613cee613dfe565b5b50919050565b613cfe82613ece565b810181811067ffffffffffffffff82111715613d1d57613d1c613e8b565b5b80604052505050565b6000613d3182613c77565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d6457613d63613da0565b5b600182019050919050565b6000613d7a82613c77565b9150613d8583613c77565b925082613d9557613d94613dcf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d757374206d696e74206174206c65617374206f6e6520417065000000000000600082015250565b7f5075626c69632073616c6520686173206e6f7420737461727465640000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564206d617820737570706c7900600082015250565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e7360008201527f20696e2061207472616e73616374696f6e000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45544820616d6f756e7420697320696e636f7272656374000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f496e737566666963656e742062616c616e636500000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f43616e6e6f7420616464206e756c6c2061646472657373000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b61454f81613c0d565b811461455a57600080fd5b50565b61456681613c1f565b811461457157600080fd5b50565b61457d81613c2b565b811461458857600080fd5b50565b61459481613c77565b811461459f57600080fd5b5056fea2646970667358221220a2fa0fc93428f9646d816fa6c3b24c1793a9cb7ddf8e7c29ca9190c7868f046164736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d574c797273536d45736d454e61676f4b4c7847436b567037614750564d54614446524c766a366174434a79562f00000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): ipfs://QmWLyrsSmEsmENagoKLxGCkVp7aGPVMTaDFRLvj6atCJyV/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d574c797273536d45736d454e61676f4b4c7847436b5670
Arg [3] : 37614750564d54614446524c766a366174434a79562f00000000000000000000


Deployed Bytecode Sourcemap

46798:3077:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40584:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28078:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29637:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29160:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46935:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41224:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47587:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30387:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40892:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48589:111;;;;;;;;;;;;;:::i;:::-;;49616:256;;;:::i;:::-;;30797:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41414:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48829:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27772:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27502:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7048:103;;;;;;;;;;;;;:::i;:::-;;46983:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6397:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49119:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28247:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47781:800;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29930:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47135:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47023:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31053:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46888:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47091:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49218:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47058:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48981:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30156:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7306:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40584:224;40686:4;40725:35;40710:50;;;:11;:50;;;;:90;;;;40764:36;40788:11;40764:23;:36::i;:::-;40710:90;40703:97;;40584:224;;;:::o;28078:100::-;28132:13;28165:5;28158:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28078:100;:::o;29637:221::-;29713:7;29741:16;29749:7;29741;:16::i;:::-;29733:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29826:15;:24;29842:7;29826:24;;;;;;;;;;;;;;;;;;;;;29819:31;;29637:221;;;:::o;29160:411::-;29241:13;29257:23;29272:7;29257:14;:23::i;:::-;29241:39;;29305:5;29299:11;;:2;:11;;;;29291:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29399:5;29383:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29408:37;29425:5;29432:12;:10;:12::i;:::-;29408:16;:37::i;:::-;29383:62;29361:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;29542:21;29551:2;29555:7;29542:8;:21::i;:::-;29230:341;29160:411;;:::o;46935:41::-;46974:2;46935:41;:::o;41224:113::-;41285:7;41312:10;:17;;;;41305:24;;41224:113;:::o;47587:186::-;47650:7;47695:1;47678:19;;:5;:19;;;;47670:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;47745:13;:20;47759:5;47745:20;;;;;;;;;;;;;;;;47738:27;;47587:186;;;:::o;30387:339::-;30582:41;30601:12;:10;:12::i;:::-;30615:7;30582:18;:41::i;:::-;30574:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30690:28;30700:4;30706:2;30710:7;30690:9;:28::i;:::-;30387:339;;;:::o;40892:256::-;40989:7;41025:23;41042:5;41025:16;:23::i;:::-;41017:5;:31;41009:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;41114:12;:19;41127:5;41114:19;;;;;;;;;;;;;;;:26;41134:5;41114:26;;;;;;;;;;;;41107:33;;40892:256;;;;:::o;48589:111::-;6628:12;:10;:12::i;:::-;6617:23;;:7;:5;:7::i;:::-;:23;;;6609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48675:17:::1;;;;;;;;;;;48674:18;48654:17;;:38;;;;;;;;;;;;;;;;;;48589:111::o:0;49616:256::-;6628:12;:10;:12::i;:::-;6617:23;;:7;:5;:7::i;:::-;:23;;;6609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49672:15:::1;49690:21;49672:39;;49740:1;49730:7;:11;49722:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;49777:12;49803:10;49795:24;;49827:7;49795:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49776:63;;;49858:7;49850:16;;;::::0;::::1;;49661:211;;49616:256::o:0;30797:185::-;30935:39;30952:4;30958:2;30962:7;30935:39;;;;;;;;;;;;:16;:39::i;:::-;30797:185;;;:::o;41414:233::-;41489:7;41525:30;:28;:30::i;:::-;41517:5;:38;41509:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41622:10;41633:5;41622:17;;;;;;;;:::i;:::-;;;;;;;;;;41615:24;;41414:233;;;:::o;48829:140::-;6628:12;:10;:12::i;:::-;6617:23;;:7;:5;:7::i;:::-;:23;;;6609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48915:7:::1;48900:12;:22;;;;;;;;;;;;:::i;:::-;;48938:23;48953:7;48938:23;;;;;;:::i;:::-;;;;;;;;48829:140:::0;:::o;27772:239::-;27844:7;27864:13;27880:7;:16;27888:7;27880:16;;;;;;;;;;;;;;;;;;;;;27864:32;;27932:1;27915:19;;:5;:19;;;;27907:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27998:5;27991:12;;;27772:239;;;:::o;27502:208::-;27574:7;27619:1;27602:19;;:5;:19;;;;27594:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27686:9;:16;27696:5;27686:16;;;;;;;;;;;;;;;;27679:23;;27502:208;;;:::o;7048:103::-;6628:12;:10;:12::i;:::-;6617:23;;:7;:5;:7::i;:::-;:23;;;6609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7113:30:::1;7140:1;7113:18;:30::i;:::-;7048:103::o:0;46983:33::-;;;;:::o;6397:87::-;6443:7;6470:6;;;;;;;;;;;6463:13;;6397:87;:::o;49119:91::-;6628:12;:10;:12::i;:::-;6617:23;;:7;:5;:7::i;:::-;:23;;;6609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49194:9:::1;49186:5;:17;;;;49119:91:::0;:::o;28247:104::-;28303:13;28336:7;28329:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28247:104;:::o;47781:800::-;47393:17;;;;;;;;;;;47385:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;46923:5:::1;47875:13;:11;:13::i;:::-;:24;47867:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;46974:2;47950:12;:28;;47942:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;46923:5;48067:12;48051:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:40;;48043:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;48161:1;48146:12;:16;48138:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;48236:9;48220:12;48212:5;;:20;;;;:::i;:::-;:33;48204:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;48291:9;48286:230;48310:12;48306:1;:16;48286:230;;;48344:15;48378:1;48362:13;;:17;;;;:::i;:::-;48344:35;;48413:1;48396:13;;:18;;;;;;;:::i;:::-;;;;;;;;48458:1;48429:13;:25;48443:10;48429:25;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;48474;48484:10;48496:7;48474:9;:30::i;:::-;48329:187;48324:3;;;;;:::i;:::-;;;;48286:230;;;;48533:40;48548:10;48560:12;48533:40;;;;;;;:::i;:::-;;;;;;;;47781:800:::0;:::o;29930:155::-;30025:52;30044:12;:10;:12::i;:::-;30058:8;30068;30025:18;:52::i;:::-;29930:155;;:::o;47135:29::-;;;;;;;;;;;;;:::o;47023:28::-;;;;:::o;31053:328::-;31228:41;31247:12;:10;:12::i;:::-;31261:7;31228:18;:41::i;:::-;31220:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31334:39;31348:4;31354:2;31358:7;31367:5;31334:13;:39::i;:::-;31053:328;;;;:::o;46888:40::-;46923:5;46888:40;:::o;47091:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49218:386::-;49291:13;49325:16;49333:7;49325;:16::i;:::-;49317:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;49404:28;49435:10;:8;:10::i;:::-;49404:41;;49494:1;49469:14;49463:28;:32;:133;;;;;;;;;;;;;;;;;49531:14;49547:18;:7;:16;:18::i;:::-;49567:13;49514:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49463:133;49456:140;;;49218:386;;;:::o;47058:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48981:127::-;6628:12;:10;:12::i;:::-;6617:23;;:7;:5;:7::i;:::-;:23;;;6609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49084:17:::1;49068:13;:33;;;;;;;;;;;;:::i;:::-;;48981:127:::0;:::o;30156:164::-;30253:4;30277:18;:25;30296:5;30277:25;;;;;;;;;;;;;;;:35;30303:8;30277:35;;;;;;;;;;;;;;;;;;;;;;;;;30270:42;;30156:164;;;;:::o;7306:201::-;6628:12;:10;:12::i;:::-;6617:23;;:7;:5;:7::i;:::-;:23;;;6609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7415:1:::1;7395:22;;:8;:22;;;;7387:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7471:28;7490:8;7471:18;:28::i;:::-;7306:201:::0;:::o;27133:305::-;27235:4;27287:25;27272:40;;;:11;:40;;;;:105;;;;27344:33;27329:48;;;:11;:48;;;;27272:105;:158;;;;27394:36;27418:11;27394:23;:36::i;:::-;27272:158;27252:178;;27133:305;;;:::o;32891:127::-;32956:4;33008:1;32980:30;;:7;:16;32988:7;32980:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32973:37;;32891:127;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;36873:174::-;36975:2;36948:15;:24;36964:7;36948:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37031:7;37027:2;36993:46;;37002:23;37017:7;37002:14;:23::i;:::-;36993:46;;;;;;;;;;;;36873:174;;:::o;33185:348::-;33278:4;33303:16;33311:7;33303;:16::i;:::-;33295:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33379:13;33395:23;33410:7;33395:14;:23::i;:::-;33379:39;;33448:5;33437:16;;:7;:16;;;:51;;;;33481:7;33457:31;;:20;33469:7;33457:11;:20::i;:::-;:31;;;33437:51;:87;;;;33492:32;33509:5;33516:7;33492:16;:32::i;:::-;33437:87;33429:96;;;33185:348;;;;:::o;36177:578::-;36336:4;36309:31;;:23;36324:7;36309:14;:23::i;:::-;:31;;;36301:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36419:1;36405:16;;:2;:16;;;;36397:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36475:39;36496:4;36502:2;36506:7;36475:20;:39::i;:::-;36579:29;36596:1;36600:7;36579:8;:29::i;:::-;36640:1;36621:9;:15;36631:4;36621:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36669:1;36652:9;:13;36662:2;36652:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36700:2;36681:7;:16;36689:7;36681:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36739:7;36735:2;36720:27;;36729:4;36720:27;;;;;;;;;;;;36177:578;;;:::o;7667:191::-;7741:16;7760:6;;;;;;;;;;;7741:25;;7786:8;7777:6;;:17;;;;;;;;;;;;;;;;;;7841:8;7810:40;;7831:8;7810:40;;;;;;;;;;;;7730:128;7667:191;:::o;33875:110::-;33951:26;33961:2;33965:7;33951:26;;;;;;;;;;;;:9;:26::i;:::-;33875:110;;:::o;37189:315::-;37344:8;37335:17;;:5;:17;;;;37327:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37431:8;37393:18;:25;37412:5;37393:25;;;;;;;;;;;;;;;:35;37419:8;37393:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;37477:8;37455:41;;37470:5;37455:41;;;37487:8;37455:41;;;;;;:::i;:::-;;;;;;;;37189:315;;;:::o;32263:::-;32420:28;32430:4;32436:2;32440:7;32420:9;:28::i;:::-;32467:48;32490:4;32496:2;32500:7;32509:5;32467:22;:48::i;:::-;32459:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32263:315;;;;:::o;48708:113::-;48768:13;48801:12;48794:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48708:113;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;18829:157::-;18914:4;18953:25;18938:40;;;:11;:40;;;;18931:47;;18829:157;;;:::o;42260:589::-;42404:45;42431:4;42437:2;42441:7;42404:26;:45::i;:::-;42482:1;42466:18;;:4;:18;;;42462:187;;;42501:40;42533:7;42501:31;:40::i;:::-;42462:187;;;42571:2;42563:10;;:4;:10;;;42559:90;;42590:47;42623:4;42629:7;42590:32;:47::i;:::-;42559:90;42462:187;42677:1;42663:16;;:2;:16;;;42659:183;;;42696:45;42733:7;42696:36;:45::i;:::-;42659:183;;;42769:4;42763:10;;:2;:10;;;42759:83;;42790:40;42818:2;42822:7;42790:27;:40::i;:::-;42759:83;42659:183;42260:589;;;:::o;34212:321::-;34342:18;34348:2;34352:7;34342:5;:18::i;:::-;34393:54;34424:1;34428:2;34432:7;34441:5;34393:22;:54::i;:::-;34371:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;34212:321;;;:::o;38069:799::-;38224:4;38245:15;:2;:13;;;:15::i;:::-;38241:620;;;38297:2;38281:36;;;38318:12;:10;:12::i;:::-;38332:4;38338:7;38347:5;38281:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38277:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38540:1;38523:6;:13;:18;38519:272;;;38566:60;;;;;;;;;;:::i;:::-;;;;;;;;38519:272;38741:6;38735:13;38726:6;38722:2;38718:15;38711:38;38277:529;38414:41;;;38404:51;;;:6;:51;;;;38397:58;;;;;38241:620;38845:4;38838:11;;38069:799;;;;;;;:::o;39440:126::-;;;;:::o;43572:164::-;43676:10;:17;;;;43649:15;:24;43665:7;43649:24;;;;;;;;;;;:44;;;;43704:10;43720:7;43704:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43572:164;:::o;44363:988::-;44629:22;44679:1;44654:22;44671:4;44654:16;:22::i;:::-;:26;;;;:::i;:::-;44629:51;;44691:18;44712:17;:26;44730:7;44712:26;;;;;;;;;;;;44691:47;;44859:14;44845:10;:28;44841:328;;44890:19;44912:12;:18;44925:4;44912:18;;;;;;;;;;;;;;;:34;44931:14;44912:34;;;;;;;;;;;;44890:56;;44996:11;44963:12;:18;44976:4;44963:18;;;;;;;;;;;;;;;:30;44982:10;44963:30;;;;;;;;;;;:44;;;;45113:10;45080:17;:30;45098:11;45080:30;;;;;;;;;;;:43;;;;44875:294;44841:328;45265:17;:26;45283:7;45265:26;;;;;;;;;;;45258:33;;;45309:12;:18;45322:4;45309:18;;;;;;;;;;;;;;;:34;45328:14;45309:34;;;;;;;;;;;45302:41;;;44444:907;;44363:988;;:::o;45646:1079::-;45899:22;45944:1;45924:10;:17;;;;:21;;;;:::i;:::-;45899:46;;45956:18;45977:15;:24;45993:7;45977:24;;;;;;;;;;;;45956:45;;46328:19;46350:10;46361:14;46350:26;;;;;;;;:::i;:::-;;;;;;;;;;46328:48;;46414:11;46389:10;46400;46389:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;46525:10;46494:15;:28;46510:11;46494:28;;;;;;;;;;;:41;;;;46666:15;:24;46682:7;46666:24;;;;;;;;;;;46659:31;;;46701:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45717:1008;;;45646:1079;:::o;43150:221::-;43235:14;43252:20;43269:2;43252:16;:20::i;:::-;43235:37;;43310:7;43283:12;:16;43296:2;43283:16;;;;;;;;;;;;;;;:24;43300:6;43283:24;;;;;;;;;;;:34;;;;43357:6;43328:17;:26;43346:7;43328:26;;;;;;;;;;;:35;;;;43224:147;43150:221;;:::o;34869:382::-;34963:1;34949:16;;:2;:16;;;;34941:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35022:16;35030:7;35022;:16::i;:::-;35021:17;35013:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35084:45;35113:1;35117:2;35121:7;35084:20;:45::i;:::-;35159:1;35142:9;:13;35152:2;35142:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35190:2;35171:7;:16;35179:7;35171:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35235:7;35231:2;35210:33;;35227:1;35210:33;;;;;;;;;;;;34869:382;;:::o;8685:387::-;8745:4;8953:12;9020:7;9008:20;9000:28;;9063:1;9056:4;:8;9049:15;;;8685:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8540:845::-;8643:3;8680:5;8674:12;8709:36;8735:9;8709:36;:::i;:::-;8761:89;8843:6;8838:3;8761:89;:::i;:::-;8754:96;;8881:1;8870:9;8866:17;8897:1;8892:137;;;;9043:1;9038:341;;;;8859:520;;8892:137;8976:4;8972:9;8961;8957:25;8952:3;8945:38;9012:6;9007:3;9003:16;8996:23;;8892:137;;9038:341;9105:38;9137:5;9105:38;:::i;:::-;9165:1;9179:154;9193:6;9190:1;9187:13;9179:154;;;9267:7;9261:14;9257:1;9252:3;9248:11;9241:35;9317:1;9308:7;9304:15;9293:26;;9215:4;9212:1;9208:12;9203:17;;9179:154;;;9362:6;9357:3;9353:16;9346:23;;9045:334;;8859:520;;8647:738;;8540:845;;;;:::o;9391:366::-;9533:3;9554:67;9618:2;9613:3;9554:67;:::i;:::-;9547:74;;9630:93;9719:3;9630:93;:::i;:::-;9748:2;9743:3;9739:12;9732:19;;9391:366;;;:::o;9763:::-;9905:3;9926:67;9990:2;9985:3;9926:67;:::i;:::-;9919:74;;10002:93;10091:3;10002:93;:::i;:::-;10120:2;10115:3;10111:12;10104:19;;9763:366;;;:::o;10135:::-;10277:3;10298:67;10362:2;10357:3;10298:67;:::i;:::-;10291:74;;10374:93;10463:3;10374:93;:::i;:::-;10492:2;10487:3;10483:12;10476:19;;10135:366;;;:::o;10507:::-;10649:3;10670:67;10734:2;10729:3;10670:67;:::i;:::-;10663:74;;10746:93;10835:3;10746:93;:::i;:::-;10864:2;10859:3;10855:12;10848:19;;10507:366;;;:::o;10879:::-;11021:3;11042:67;11106:2;11101:3;11042:67;:::i;:::-;11035:74;;11118:93;11207:3;11118:93;:::i;:::-;11236:2;11231:3;11227:12;11220:19;;10879:366;;;:::o;11251:::-;11393:3;11414:67;11478:2;11473:3;11414:67;:::i;:::-;11407:74;;11490:93;11579:3;11490:93;:::i;:::-;11608:2;11603:3;11599:12;11592:19;;11251:366;;;:::o;11623:::-;11765:3;11786:67;11850:2;11845:3;11786:67;:::i;:::-;11779:74;;11862:93;11951:3;11862:93;:::i;:::-;11980:2;11975:3;11971:12;11964:19;;11623:366;;;:::o;11995:::-;12137:3;12158:67;12222:2;12217:3;12158:67;:::i;:::-;12151:74;;12234:93;12323:3;12234:93;:::i;:::-;12352:2;12347:3;12343:12;12336:19;;11995:366;;;:::o;12367:::-;12509:3;12530:67;12594:2;12589:3;12530:67;:::i;:::-;12523:74;;12606:93;12695:3;12606:93;:::i;:::-;12724:2;12719:3;12715:12;12708:19;;12367:366;;;:::o;12739:::-;12881:3;12902:67;12966:2;12961:3;12902:67;:::i;:::-;12895:74;;12978:93;13067:3;12978:93;:::i;:::-;13096:2;13091:3;13087:12;13080:19;;12739:366;;;:::o;13111:::-;13253:3;13274:67;13338:2;13333:3;13274:67;:::i;:::-;13267:74;;13350:93;13439:3;13350:93;:::i;:::-;13468:2;13463:3;13459:12;13452:19;;13111:366;;;:::o;13483:::-;13625:3;13646:67;13710:2;13705:3;13646:67;:::i;:::-;13639:74;;13722:93;13811:3;13722:93;:::i;:::-;13840:2;13835:3;13831:12;13824:19;;13483:366;;;:::o;13855:::-;13997:3;14018:67;14082:2;14077:3;14018:67;:::i;:::-;14011:74;;14094:93;14183:3;14094:93;:::i;:::-;14212:2;14207:3;14203:12;14196:19;;13855:366;;;:::o;14227:::-;14369:3;14390:67;14454:2;14449:3;14390:67;:::i;:::-;14383:74;;14466:93;14555:3;14466:93;:::i;:::-;14584:2;14579:3;14575:12;14568:19;;14227:366;;;:::o;14599:::-;14741:3;14762:67;14826:2;14821:3;14762:67;:::i;:::-;14755:74;;14838:93;14927:3;14838:93;:::i;:::-;14956:2;14951:3;14947:12;14940:19;;14599:366;;;:::o;14971:::-;15113:3;15134:67;15198:2;15193:3;15134:67;:::i;:::-;15127:74;;15210:93;15299:3;15210:93;:::i;:::-;15328:2;15323:3;15319:12;15312:19;;14971:366;;;:::o;15343:::-;15485:3;15506:67;15570:2;15565:3;15506:67;:::i;:::-;15499:74;;15582:93;15671:3;15582:93;:::i;:::-;15700:2;15695:3;15691:12;15684:19;;15343:366;;;:::o;15715:::-;15857:3;15878:67;15942:2;15937:3;15878:67;:::i;:::-;15871:74;;15954:93;16043:3;15954:93;:::i;:::-;16072:2;16067:3;16063:12;16056:19;;15715:366;;;:::o;16087:::-;16229:3;16250:67;16314:2;16309:3;16250:67;:::i;:::-;16243:74;;16326:93;16415:3;16326:93;:::i;:::-;16444:2;16439:3;16435:12;16428:19;;16087:366;;;:::o;16459:::-;16601:3;16622:67;16686:2;16681:3;16622:67;:::i;:::-;16615:74;;16698:93;16787:3;16698:93;:::i;:::-;16816:2;16811:3;16807:12;16800:19;;16459:366;;;:::o;16831:::-;16973:3;16994:67;17058:2;17053:3;16994:67;:::i;:::-;16987:74;;17070:93;17159:3;17070:93;:::i;:::-;17188:2;17183:3;17179:12;17172:19;;16831:366;;;:::o;17203:::-;17345:3;17366:67;17430:2;17425:3;17366:67;:::i;:::-;17359:74;;17442:93;17531:3;17442:93;:::i;:::-;17560:2;17555:3;17551:12;17544:19;;17203:366;;;:::o;17575:398::-;17734:3;17755:83;17836:1;17831:3;17755:83;:::i;:::-;17748:90;;17847:93;17936:3;17847:93;:::i;:::-;17965:1;17960:3;17956:11;17949:18;;17575:398;;;:::o;17979:366::-;18121:3;18142:67;18206:2;18201:3;18142:67;:::i;:::-;18135:74;;18218:93;18307:3;18218:93;:::i;:::-;18336:2;18331:3;18327:12;18320:19;;17979:366;;;:::o;18351:::-;18493:3;18514:67;18578:2;18573:3;18514:67;:::i;:::-;18507:74;;18590:93;18679:3;18590:93;:::i;:::-;18708:2;18703:3;18699:12;18692:19;;18351:366;;;:::o;18723:::-;18865:3;18886:67;18950:2;18945:3;18886:67;:::i;:::-;18879:74;;18962:93;19051:3;18962:93;:::i;:::-;19080:2;19075:3;19071:12;19064:19;;18723:366;;;:::o;19095:::-;19237:3;19258:67;19322:2;19317:3;19258:67;:::i;:::-;19251:74;;19334:93;19423:3;19334:93;:::i;:::-;19452:2;19447:3;19443:12;19436:19;;19095:366;;;:::o;19467:118::-;19554:24;19572:5;19554:24;:::i;:::-;19549:3;19542:37;19467:118;;:::o;19591:589::-;19816:3;19838:95;19929:3;19920:6;19838:95;:::i;:::-;19831:102;;19950:95;20041:3;20032:6;19950:95;:::i;:::-;19943:102;;20062:92;20150:3;20141:6;20062:92;:::i;:::-;20055:99;;20171:3;20164:10;;19591:589;;;;;;:::o;20186:379::-;20370:3;20392:147;20535:3;20392:147;:::i;:::-;20385:154;;20556:3;20549:10;;20186:379;;;:::o;20571:222::-;20664:4;20702:2;20691:9;20687:18;20679:26;;20715:71;20783:1;20772:9;20768:17;20759:6;20715:71;:::i;:::-;20571:222;;;;:::o;20799:640::-;20994:4;21032:3;21021:9;21017:19;21009:27;;21046:71;21114:1;21103:9;21099:17;21090:6;21046:71;:::i;:::-;21127:72;21195:2;21184:9;21180:18;21171:6;21127:72;:::i;:::-;21209;21277:2;21266:9;21262:18;21253:6;21209:72;:::i;:::-;21328:9;21322:4;21318:20;21313:2;21302:9;21298:18;21291:48;21356:76;21427:4;21418:6;21356:76;:::i;:::-;21348:84;;20799:640;;;;;;;:::o;21445:332::-;21566:4;21604:2;21593:9;21589:18;21581:26;;21617:71;21685:1;21674:9;21670:17;21661:6;21617:71;:::i;:::-;21698:72;21766:2;21755:9;21751:18;21742:6;21698:72;:::i;:::-;21445:332;;;;;:::o;21783:210::-;21870:4;21908:2;21897:9;21893:18;21885:26;;21921:65;21983:1;21972:9;21968:17;21959:6;21921:65;:::i;:::-;21783:210;;;;:::o;21999:313::-;22112:4;22150:2;22139:9;22135:18;22127:26;;22199:9;22193:4;22189:20;22185:1;22174:9;22170:17;22163:47;22227:78;22300:4;22291:6;22227:78;:::i;:::-;22219:86;;21999:313;;;;:::o;22318:419::-;22484:4;22522:2;22511:9;22507:18;22499:26;;22571:9;22565:4;22561:20;22557:1;22546:9;22542:17;22535:47;22599:131;22725:4;22599:131;:::i;:::-;22591:139;;22318:419;;;:::o;22743:::-;22909:4;22947:2;22936:9;22932:18;22924:26;;22996:9;22990:4;22986:20;22982:1;22971:9;22967:17;22960:47;23024:131;23150:4;23024:131;:::i;:::-;23016:139;;22743:419;;;:::o;23168:::-;23334:4;23372:2;23361:9;23357:18;23349:26;;23421:9;23415:4;23411:20;23407:1;23396:9;23392:17;23385:47;23449:131;23575:4;23449:131;:::i;:::-;23441:139;;23168:419;;;:::o;23593:::-;23759:4;23797:2;23786:9;23782:18;23774:26;;23846:9;23840:4;23836:20;23832:1;23821:9;23817:17;23810:47;23874:131;24000:4;23874:131;:::i;:::-;23866:139;;23593:419;;;:::o;24018:::-;24184:4;24222:2;24211:9;24207:18;24199:26;;24271:9;24265:4;24261:20;24257:1;24246:9;24242:17;24235:47;24299:131;24425:4;24299:131;:::i;:::-;24291:139;;24018:419;;;:::o;24443:::-;24609:4;24647:2;24636:9;24632:18;24624:26;;24696:9;24690:4;24686:20;24682:1;24671:9;24667:17;24660:47;24724:131;24850:4;24724:131;:::i;:::-;24716:139;;24443:419;;;:::o;24868:::-;25034:4;25072:2;25061:9;25057:18;25049:26;;25121:9;25115:4;25111:20;25107:1;25096:9;25092:17;25085:47;25149:131;25275:4;25149:131;:::i;:::-;25141:139;;24868:419;;;:::o;25293:::-;25459:4;25497:2;25486:9;25482:18;25474:26;;25546:9;25540:4;25536:20;25532:1;25521:9;25517:17;25510:47;25574:131;25700:4;25574:131;:::i;:::-;25566:139;;25293:419;;;:::o;25718:::-;25884:4;25922:2;25911:9;25907:18;25899:26;;25971:9;25965:4;25961:20;25957:1;25946:9;25942:17;25935:47;25999:131;26125:4;25999:131;:::i;:::-;25991:139;;25718:419;;;:::o;26143:::-;26309:4;26347:2;26336:9;26332:18;26324:26;;26396:9;26390:4;26386:20;26382:1;26371:9;26367:17;26360:47;26424:131;26550:4;26424:131;:::i;:::-;26416:139;;26143:419;;;:::o;26568:::-;26734:4;26772:2;26761:9;26757:18;26749:26;;26821:9;26815:4;26811:20;26807:1;26796:9;26792:17;26785:47;26849:131;26975:4;26849:131;:::i;:::-;26841:139;;26568:419;;;:::o;26993:::-;27159:4;27197:2;27186:9;27182:18;27174:26;;27246:9;27240:4;27236:20;27232:1;27221:9;27217:17;27210:47;27274:131;27400:4;27274:131;:::i;:::-;27266:139;;26993:419;;;:::o;27418:::-;27584:4;27622:2;27611:9;27607:18;27599:26;;27671:9;27665:4;27661:20;27657:1;27646:9;27642:17;27635:47;27699:131;27825:4;27699:131;:::i;:::-;27691:139;;27418:419;;;:::o;27843:::-;28009:4;28047:2;28036:9;28032:18;28024:26;;28096:9;28090:4;28086:20;28082:1;28071:9;28067:17;28060:47;28124:131;28250:4;28124:131;:::i;:::-;28116:139;;27843:419;;;:::o;28268:::-;28434:4;28472:2;28461:9;28457:18;28449:26;;28521:9;28515:4;28511:20;28507:1;28496:9;28492:17;28485:47;28549:131;28675:4;28549:131;:::i;:::-;28541:139;;28268:419;;;:::o;28693:::-;28859:4;28897:2;28886:9;28882:18;28874:26;;28946:9;28940:4;28936:20;28932:1;28921:9;28917:17;28910:47;28974:131;29100:4;28974:131;:::i;:::-;28966:139;;28693:419;;;:::o;29118:::-;29284:4;29322:2;29311:9;29307:18;29299:26;;29371:9;29365:4;29361:20;29357:1;29346:9;29342:17;29335:47;29399:131;29525:4;29399:131;:::i;:::-;29391:139;;29118:419;;;:::o;29543:::-;29709:4;29747:2;29736:9;29732:18;29724:26;;29796:9;29790:4;29786:20;29782:1;29771:9;29767:17;29760:47;29824:131;29950:4;29824:131;:::i;:::-;29816:139;;29543:419;;;:::o;29968:::-;30134:4;30172:2;30161:9;30157:18;30149:26;;30221:9;30215:4;30211:20;30207:1;30196:9;30192:17;30185:47;30249:131;30375:4;30249:131;:::i;:::-;30241:139;;29968:419;;;:::o;30393:::-;30559:4;30597:2;30586:9;30582:18;30574:26;;30646:9;30640:4;30636:20;30632:1;30621:9;30617:17;30610:47;30674:131;30800:4;30674:131;:::i;:::-;30666:139;;30393:419;;;:::o;30818:::-;30984:4;31022:2;31011:9;31007:18;30999:26;;31071:9;31065:4;31061:20;31057:1;31046:9;31042:17;31035:47;31099:131;31225:4;31099:131;:::i;:::-;31091:139;;30818:419;;;:::o;31243:::-;31409:4;31447:2;31436:9;31432:18;31424:26;;31496:9;31490:4;31486:20;31482:1;31471:9;31467:17;31460:47;31524:131;31650:4;31524:131;:::i;:::-;31516:139;;31243:419;;;:::o;31668:::-;31834:4;31872:2;31861:9;31857:18;31849:26;;31921:9;31915:4;31911:20;31907:1;31896:9;31892:17;31885:47;31949:131;32075:4;31949:131;:::i;:::-;31941:139;;31668:419;;;:::o;32093:::-;32259:4;32297:2;32286:9;32282:18;32274:26;;32346:9;32340:4;32336:20;32332:1;32321:9;32317:17;32310:47;32374:131;32500:4;32374:131;:::i;:::-;32366:139;;32093:419;;;:::o;32518:::-;32684:4;32722:2;32711:9;32707:18;32699:26;;32771:9;32765:4;32761:20;32757:1;32746:9;32742:17;32735:47;32799:131;32925:4;32799:131;:::i;:::-;32791:139;;32518:419;;;:::o;32943:::-;33109:4;33147:2;33136:9;33132:18;33124:26;;33196:9;33190:4;33186:20;33182:1;33171:9;33167:17;33160:47;33224:131;33350:4;33224:131;:::i;:::-;33216:139;;32943:419;;;:::o;33368:222::-;33461:4;33499:2;33488:9;33484:18;33476:26;;33512:71;33580:1;33569:9;33565:17;33556:6;33512:71;:::i;:::-;33368:222;;;;:::o;33596:129::-;33630:6;33657:20;;:::i;:::-;33647:30;;33686:33;33714:4;33706:6;33686:33;:::i;:::-;33596:129;;;:::o;33731:75::-;33764:6;33797:2;33791:9;33781:19;;33731:75;:::o;33812:307::-;33873:4;33963:18;33955:6;33952:30;33949:56;;;33985:18;;:::i;:::-;33949:56;34023:29;34045:6;34023:29;:::i;:::-;34015:37;;34107:4;34101;34097:15;34089:23;;33812:307;;;:::o;34125:308::-;34187:4;34277:18;34269:6;34266:30;34263:56;;;34299:18;;:::i;:::-;34263:56;34337:29;34359:6;34337:29;:::i;:::-;34329:37;;34421:4;34415;34411:15;34403:23;;34125:308;;;:::o;34439:141::-;34488:4;34511:3;34503:11;;34534:3;34531:1;34524:14;34568:4;34565:1;34555:18;34547:26;;34439:141;;;:::o;34586:98::-;34637:6;34671:5;34665:12;34655:22;;34586:98;;;:::o;34690:99::-;34742:6;34776:5;34770:12;34760:22;;34690:99;;;:::o;34795:168::-;34878:11;34912:6;34907:3;34900:19;34952:4;34947:3;34943:14;34928:29;;34795:168;;;;:::o;34969:147::-;35070:11;35107:3;35092:18;;34969:147;;;;:::o;35122:169::-;35206:11;35240:6;35235:3;35228:19;35280:4;35275:3;35271:14;35256:29;;35122:169;;;;:::o;35297:148::-;35399:11;35436:3;35421:18;;35297:148;;;;:::o;35451:305::-;35491:3;35510:20;35528:1;35510:20;:::i;:::-;35505:25;;35544:20;35562:1;35544:20;:::i;:::-;35539:25;;35698:1;35630:66;35626:74;35623:1;35620:81;35617:107;;;35704:18;;:::i;:::-;35617:107;35748:1;35745;35741:9;35734:16;;35451:305;;;;:::o;35762:185::-;35802:1;35819:20;35837:1;35819:20;:::i;:::-;35814:25;;35853:20;35871:1;35853:20;:::i;:::-;35848:25;;35892:1;35882:35;;35897:18;;:::i;:::-;35882:35;35939:1;35936;35932:9;35927:14;;35762:185;;;;:::o;35953:348::-;35993:7;36016:20;36034:1;36016:20;:::i;:::-;36011:25;;36050:20;36068:1;36050:20;:::i;:::-;36045:25;;36238:1;36170:66;36166:74;36163:1;36160:81;36155:1;36148:9;36141:17;36137:105;36134:131;;;36245:18;;:::i;:::-;36134:131;36293:1;36290;36286:9;36275:20;;35953:348;;;;:::o;36307:191::-;36347:4;36367:20;36385:1;36367:20;:::i;:::-;36362:25;;36401:20;36419:1;36401:20;:::i;:::-;36396:25;;36440:1;36437;36434:8;36431:34;;;36445:18;;:::i;:::-;36431:34;36490:1;36487;36483:9;36475:17;;36307:191;;;;:::o;36504:96::-;36541:7;36570:24;36588:5;36570:24;:::i;:::-;36559:35;;36504:96;;;:::o;36606:90::-;36640:7;36683:5;36676:13;36669:21;36658:32;;36606:90;;;:::o;36702:149::-;36738:7;36778:66;36771:5;36767:78;36756:89;;36702:149;;;:::o;36857:126::-;36894:7;36934:42;36927:5;36923:54;36912:65;;36857:126;;;:::o;36989:77::-;37026:7;37055:5;37044:16;;36989:77;;;:::o;37072:154::-;37156:6;37151:3;37146;37133:30;37218:1;37209:6;37204:3;37200:16;37193:27;37072:154;;;:::o;37232:307::-;37300:1;37310:113;37324:6;37321:1;37318:13;37310:113;;;37409:1;37404:3;37400:11;37394:18;37390:1;37385:3;37381:11;37374:39;37346:2;37343:1;37339:10;37334:15;;37310:113;;;37441:6;37438:1;37435:13;37432:101;;;37521:1;37512:6;37507:3;37503:16;37496:27;37432:101;37281:258;37232:307;;;:::o;37545:320::-;37589:6;37626:1;37620:4;37616:12;37606:22;;37673:1;37667:4;37663:12;37694:18;37684:81;;37750:4;37742:6;37738:17;37728:27;;37684:81;37812:2;37804:6;37801:14;37781:18;37778:38;37775:84;;;37831:18;;:::i;:::-;37775:84;37596:269;37545:320;;;:::o;37871:281::-;37954:27;37976:4;37954:27;:::i;:::-;37946:6;37942:40;38084:6;38072:10;38069:22;38048:18;38036:10;38033:34;38030:62;38027:88;;;38095:18;;:::i;:::-;38027:88;38135:10;38131:2;38124:22;37914:238;37871:281;;:::o;38158:233::-;38197:3;38220:24;38238:5;38220:24;:::i;:::-;38211:33;;38266:66;38259:5;38256:77;38253:103;;;38336:18;;:::i;:::-;38253:103;38383:1;38376:5;38372:13;38365:20;;38158:233;;;:::o;38397:176::-;38429:1;38446:20;38464:1;38446:20;:::i;:::-;38441:25;;38480:20;38498:1;38480:20;:::i;:::-;38475:25;;38519:1;38509:35;;38524:18;;:::i;:::-;38509:35;38565:1;38562;38558:9;38553:14;;38397:176;;;;:::o;38579:180::-;38627:77;38624:1;38617:88;38724:4;38721:1;38714:15;38748:4;38745:1;38738:15;38765:180;38813:77;38810:1;38803:88;38910:4;38907:1;38900:15;38934:4;38931:1;38924:15;38951:180;38999:77;38996:1;38989:88;39096:4;39093:1;39086:15;39120:4;39117:1;39110:15;39137:180;39185:77;39182:1;39175:88;39282:4;39279:1;39272:15;39306:4;39303:1;39296:15;39323:180;39371:77;39368:1;39361:88;39468:4;39465:1;39458:15;39492:4;39489:1;39482:15;39509:180;39557:77;39554:1;39547:88;39654:4;39651:1;39644:15;39678:4;39675:1;39668:15;39695:117;39804:1;39801;39794:12;39818:117;39927:1;39924;39917:12;39941:117;40050:1;40047;40040:12;40064:117;40173:1;40170;40163:12;40187:102;40228:6;40279:2;40275:7;40270:2;40263:5;40259:14;40255:28;40245:38;;40187:102;;;:::o;40295:230::-;40435:34;40431:1;40423:6;40419:14;40412:58;40504:13;40499:2;40491:6;40487:15;40480:38;40295:230;:::o;40531:237::-;40671:34;40667:1;40659:6;40655:14;40648:58;40740:20;40735:2;40727:6;40723:15;40716:45;40531:237;:::o;40774:225::-;40914:34;40910:1;40902:6;40898:14;40891:58;40983:8;40978:2;40970:6;40966:15;40959:33;40774:225;:::o;41005:178::-;41145:30;41141:1;41133:6;41129:14;41122:54;41005:178;:::o;41189:176::-;41329:28;41325:1;41317:6;41313:14;41306:52;41189:176;:::o;41371:177::-;41511:29;41507:1;41499:6;41495:14;41488:53;41371:177;:::o;41554:223::-;41694:34;41690:1;41682:6;41678:14;41671:58;41763:6;41758:2;41750:6;41746:15;41739:31;41554:223;:::o;41783:175::-;41923:27;41919:1;41911:6;41907:14;41900:51;41783:175;:::o;41964:231::-;42104:34;42100:1;42092:6;42088:14;42081:58;42173:14;42168:2;42160:6;42156:15;42149:39;41964:231;:::o;42201:243::-;42341:34;42337:1;42329:6;42325:14;42318:58;42410:26;42405:2;42397:6;42393:15;42386:51;42201:243;:::o;42450:229::-;42590:34;42586:1;42578:6;42574:14;42567:58;42659:12;42654:2;42646:6;42642:15;42635:37;42450:229;:::o;42685:228::-;42825:34;42821:1;42813:6;42809:14;42802:58;42894:11;42889:2;42881:6;42877:15;42870:36;42685:228;:::o;42919:181::-;43059:33;43055:1;43047:6;43043:14;43036:57;42919:181;:::o;43106:236::-;43246:34;43242:1;43234:6;43230:14;43223:58;43315:19;43310:2;43302:6;43298:15;43291:44;43106:236;:::o;43348:182::-;43488:34;43484:1;43476:6;43472:14;43465:58;43348:182;:::o;43536:173::-;43676:25;43672:1;43664:6;43660:14;43653:49;43536:173;:::o;43715:231::-;43855:34;43851:1;43843:6;43839:14;43832:58;43924:14;43919:2;43911:6;43907:15;43900:39;43715:231;:::o;43952:169::-;44092:21;44088:1;44080:6;44076:14;44069:45;43952:169;:::o;44127:182::-;44267:34;44263:1;44255:6;44251:14;44244:58;44127:182;:::o;44315:228::-;44455:34;44451:1;44443:6;44439:14;44432:58;44524:11;44519:2;44511:6;44507:15;44500:36;44315:228;:::o;44549:234::-;44689:34;44685:1;44677:6;44673:14;44666:58;44758:17;44753:2;44745:6;44741:15;44734:42;44549:234;:::o;44789:220::-;44929:34;44925:1;44917:6;44913:14;44906:58;44998:3;44993:2;44985:6;44981:15;44974:28;44789:220;:::o;45015:114::-;;:::o;45135:173::-;45275:25;45271:1;45263:6;45259:14;45252:49;45135:173;:::o;45314:236::-;45454:34;45450:1;45442:6;45438:14;45431:58;45523:19;45518:2;45510:6;45506:15;45499:44;45314:236;:::o;45556:231::-;45696:34;45692:1;45684:6;45680:14;45673:58;45765:14;45760:2;45752:6;45748:15;45741:39;45556:231;:::o;45793:177::-;45933:29;45929:1;45921:6;45917:14;45910:53;45793:177;:::o;45976:122::-;46049:24;46067:5;46049:24;:::i;:::-;46042:5;46039:35;46029:63;;46088:1;46085;46078:12;46029:63;45976:122;:::o;46104:116::-;46174:21;46189:5;46174:21;:::i;:::-;46167:5;46164:32;46154:60;;46210:1;46207;46200:12;46154:60;46104:116;:::o;46226:120::-;46298:23;46315:5;46298:23;:::i;:::-;46291:5;46288:34;46278:62;;46336:1;46333;46326:12;46278:62;46226:120;:::o;46352:122::-;46425:24;46443:5;46425:24;:::i;:::-;46418:5;46415:35;46405:63;;46464:1;46461;46454:12;46405:63;46352:122;:::o

Swarm Source

ipfs://a2fa0fc93428f9646d816fa6c3b24c1793a9cb7ddf8e7c29ca9190c7868f0461
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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