ETH Price: $1,916.35 (+1.14%)
Gas: 0.54 Gwei
 

Overview

Max Total Supply

28 SICKK

Holders

14

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
8 SICKK
0x89Dcac9Ea90440d79DD6596d75Db9E13d21C47b1
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:
Contagion

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

// SPDX-License-Identifier: MIT

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


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

pragma solidity ^0.8.0;


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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.0 (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/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.0 (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;
}

/**
 * @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/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.0 (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/utils/Strings.sol


// OpenZeppelin Contracts v4.4.0 (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/Address.sol


// OpenZeppelin Contracts v4.4.0 (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/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.0 (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/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.0 (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/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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: contracts/5_contagion.sol


pragma solidity ^0.8.0;



 contract Contagion is ERC721, Ownable {

     //hi everyone! We're safe, just having a fun project!
    using Address for address;

    string public baseURI;
    uint256 public constant MAX_VIRUS = 5000;
    uint256 public constant PRICE = 0.01 ether;
    uint256 public totalSupply;
    
    
    address patientZero = 0xeffF914A3Cc2A6400d54062C79451b3D58d73C02;

    
    constructor() ERC721("ContagionNFT", "SICKK") {
    }

    function mint(uint256 numberOfMints) public payable {
        require(numberOfMints > 0 && numberOfMints < 5,             "Invalid purchase amount");
        require(totalSupply + numberOfMints <= MAX_VIRUS,         "Purchase would exceed max supply of tokens");
        require(PRICE * numberOfMints == msg.value,                 "Ether value sent is not correct");
        for(uint256 i; i < numberOfMints; i++) {
            _safeMint(msg.sender, totalSupply + i);
        }
        totalSupply += numberOfMints;
        uint256 percentage = random(totalSupply, totalSupply + 1);
        if (percentage < 2){
            _safeMint(msg.sender, totalSupply + 1);
            totalSupply += 1;
            _safeMint(msg.sender, totalSupply + 1);
            totalSupply += 1;
        }
        else if(percentage < 4){
            _safeMint(msg.sender, totalSupply + 1);
            totalSupply += 1;
        }
    }

    //look this is very not safe, but project is pretty dumb in itself.
    //so we find a way to do some maths to get a percentage to give an extra
    //token. I mean if you wanna steal or hack this, go ahead.
    function random(uint256 tokenId, uint256 prevId) private view returns (uint256) {
        uint256 targetBlock = block.number + 40 + tokenId + prevId + block.timestamp ;
        uint256 randomN = targetBlock % 100;
        return randomN;
    }
    
    function setBaseURI(string memory uri) public onlyOwner {
        baseURI = uri;
    }
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }
    //coins for the lizards
    function withdraw() public {
        uint256 balance = address(this).balance;
        payable(patientZero).transfer(balance);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_VIRUS","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":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405273efff914a3cc2a6400d54062c79451b3d58d73c02600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b506040518060400160405280600c81526020017f436f6e746167696f6e4e465400000000000000000000000000000000000000008152506040518060400160405280600581526020017f5349434b4b0000000000000000000000000000000000000000000000000000008152508160009080519060200190620000eb929190620001fb565b50806001908051906020019062000104929190620001fb565b505050620001276200011b6200012d60201b60201c565b6200013560201b60201c565b62000310565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020990620002ab565b90600052602060002090601f0160209004810192826200022d576000855562000279565b82601f106200024857805160ff191683800117855562000279565b8280016001018555821562000279579182015b82811115620002785782518255916020019190600101906200025b565b5b5090506200028891906200028c565b5090565b5b80821115620002a75760008160009055506001016200028d565b5090565b60006002820490506001821680620002c457607f821691505b60208210811415620002db57620002da620002e1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6134c480620003206000396000f3fe6080604052600436106101405760003560e01c806370a08231116100b6578063a22cb4651161006f578063a22cb46514610429578063b88d4fde14610452578063c87b56dd1461047b578063e985e9c5146104b8578063f2fde38b146104f5578063fc4caf5a1461051e57610140565b806370a0823114610338578063715018a6146103755780638d859f3e1461038c5780638da5cb5b146103b757806395d89b41146103e2578063a0712d681461040d57610140565b806323b872dd1161010857806323b872dd1461023e5780633ccfd60b1461026757806342842e0e1461027e57806355f804b3146102a75780636352211e146102d05780636c0360eb1461030d57610140565b806301ffc9a71461014557806306fdde0314610182578063081812fc146101ad578063095ea7b3146101ea57806318160ddd14610213575b600080fd5b34801561015157600080fd5b5061016c6004803603810190610167919061233b565b610549565b60405161017991906127ff565b60405180910390f35b34801561018e57600080fd5b5061019761062b565b6040516101a4919061281a565b60405180910390f35b3480156101b957600080fd5b506101d460048036038101906101cf91906123de565b6106bd565b6040516101e19190612798565b60405180910390f35b3480156101f657600080fd5b50610211600480360381019061020c91906122fb565b610742565b005b34801561021f57600080fd5b5061022861085a565b6040516102359190612a9c565b60405180910390f35b34801561024a57600080fd5b50610265600480360381019061026091906121e5565b610860565b005b34801561027357600080fd5b5061027c6108c0565b005b34801561028a57600080fd5b506102a560048036038101906102a091906121e5565b610931565b005b3480156102b357600080fd5b506102ce60048036038101906102c99190612395565b610951565b005b3480156102dc57600080fd5b506102f760048036038101906102f291906123de565b6109e7565b6040516103049190612798565b60405180910390f35b34801561031957600080fd5b50610322610a99565b60405161032f919061281a565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a9190612178565b610b27565b60405161036c9190612a9c565b60405180910390f35b34801561038157600080fd5b5061038a610bdf565b005b34801561039857600080fd5b506103a1610c67565b6040516103ae9190612a9c565b60405180910390f35b3480156103c357600080fd5b506103cc610c72565b6040516103d99190612798565b60405180910390f35b3480156103ee57600080fd5b506103f7610c9c565b604051610404919061281a565b60405180910390f35b610427600480360381019061042291906123de565b610d2e565b005b34801561043557600080fd5b50610450600480360381019061044b91906122bb565b610f43565b005b34801561045e57600080fd5b5061047960048036038101906104749190612238565b610f59565b005b34801561048757600080fd5b506104a2600480360381019061049d91906123de565b610fbb565b6040516104af919061281a565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da91906121a5565b611062565b6040516104ec91906127ff565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190612178565b6110f6565b005b34801561052a57600080fd5b506105336111ee565b6040516105409190612a9c565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061061457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106245750610623826111f4565b5b9050919050565b60606000805461063a90612d4c565b80601f016020809104026020016040519081016040528092919081815260200182805461066690612d4c565b80156106b35780601f10610688576101008083540402835291602001916106b3565b820191906000526020600020905b81548152906001019060200180831161069657829003601f168201915b5050505050905090565b60006106c88261125e565b610707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fe906129bc565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061074d826109e7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b590612a3c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107dd6112ca565b73ffffffffffffffffffffffffffffffffffffffff16148061080c575061080b816108066112ca565b611062565b5b61084b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108429061291c565b60405180910390fd5b61085583836112d2565b505050565b60085481565b61087161086b6112ca565b8261138b565b6108b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a790612a5c565b60405180910390fd5b6108bb838383611469565b505050565b6000479050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561092d573d6000803e3d6000fd5b5050565b61094c83838360405180602001604052806000815250610f59565b505050565b6109596112ca565b73ffffffffffffffffffffffffffffffffffffffff16610977610c72565b73ffffffffffffffffffffffffffffffffffffffff16146109cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c4906129dc565b60405180910390fd5b80600790805190602001906109e3929190611f8c565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a879061295c565b60405180910390fd5b80915050919050565b60078054610aa690612d4c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad290612d4c565b8015610b1f5780601f10610af457610100808354040283529160200191610b1f565b820191906000526020600020905b815481529060010190602001808311610b0257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8f9061293c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610be76112ca565b73ffffffffffffffffffffffffffffffffffffffff16610c05610c72565b73ffffffffffffffffffffffffffffffffffffffff1614610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c52906129dc565b60405180910390fd5b610c6560006116c5565b565b662386f26fc1000081565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610cab90612d4c565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd790612d4c565b8015610d245780601f10610cf957610100808354040283529160200191610d24565b820191906000526020600020905b815481529060010190602001808311610d0757829003601f168201915b5050505050905090565b600081118015610d3e5750600581105b610d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7490612a7c565b60405180910390fd5b61138881600854610d8e9190612b81565b1115610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc69061297c565b60405180910390fd5b3481662386f26fc10000610de39190612c08565b14610e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1a906128dc565b60405180910390fd5b60005b81811015610e5857610e453382600854610e409190612b81565b61178b565b8080610e5090612daf565b915050610e26565b508060086000828254610e6b9190612b81565b925050819055506000610e8e6008546001600854610e899190612b81565b6117a9565b90506002811015610f0257610eb1336001600854610eac9190612b81565b61178b565b600160086000828254610ec49190612b81565b92505081905550610ee3336001600854610ede9190612b81565b61178b565b600160086000828254610ef69190612b81565b92505081905550610f3f565b6004811015610f3e57610f23336001600854610f1e9190612b81565b61178b565b600160086000828254610f369190612b81565b925050819055505b5b5050565b610f55610f4e6112ca565b83836117f8565b5050565b610f6a610f646112ca565b8361138b565b610fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa090612a5c565b60405180910390fd5b610fb584848484611965565b50505050565b6060610fc68261125e565b611005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffc90612a1c565b60405180910390fd5b600061100f6119c1565b9050600081511161102f576040518060200160405280600081525061105a565b8061103984611a53565b60405160200161104a929190612774565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110fe6112ca565b73ffffffffffffffffffffffffffffffffffffffff1661111c610c72565b73ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611169906129dc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d99061285c565b60405180910390fd5b6111eb816116c5565b50565b61138881565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611345836109e7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006113968261125e565b6113d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cc906128fc565b60405180910390fd5b60006113e0836109e7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061144f57508373ffffffffffffffffffffffffffffffffffffffff16611437846106bd565b73ffffffffffffffffffffffffffffffffffffffff16145b80611460575061145f8185611062565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611489826109e7565b73ffffffffffffffffffffffffffffffffffffffff16146114df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d6906129fc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561154f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115469061289c565b60405180910390fd5b61155a838383611bb4565b6115656000826112d2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115b59190612c62565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461160c9190612b81565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6117a5828260405180602001604052806000815250611bb9565b5050565b6000804283856028436117bc9190612b81565b6117c69190612b81565b6117d09190612b81565b6117da9190612b81565b905060006064826117eb9190612df8565b9050809250505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185e906128bc565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161195891906127ff565b60405180910390a3505050565b611970848484611469565b61197c84848484611c14565b6119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b29061283c565b60405180910390fd5b50505050565b6060600780546119d090612d4c565b80601f01602080910402602001604051908101604052809291908181526020018280546119fc90612d4c565b8015611a495780601f10611a1e57610100808354040283529160200191611a49565b820191906000526020600020905b815481529060010190602001808311611a2c57829003601f168201915b5050505050905090565b60606000821415611a9b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611baf565b600082905060005b60008214611acd578080611ab690612daf565b915050600a82611ac69190612bd7565b9150611aa3565b60008167ffffffffffffffff811115611ae957611ae8612ee5565b5b6040519080825280601f01601f191660200182016040528015611b1b5781602001600182028036833780820191505090505b5090505b60008514611ba857600182611b349190612c62565b9150600a85611b439190612df8565b6030611b4f9190612b81565b60f81b818381518110611b6557611b64612eb6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ba19190612bd7565b9450611b1f565b8093505050505b919050565b505050565b611bc38383611dab565b611bd06000848484611c14565b611c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c069061283c565b60405180910390fd5b505050565b6000611c358473ffffffffffffffffffffffffffffffffffffffff16611f79565b15611d9e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c5e6112ca565b8786866040518563ffffffff1660e01b8152600401611c8094939291906127b3565b602060405180830381600087803b158015611c9a57600080fd5b505af1925050508015611ccb57506040513d601f19601f82011682018060405250810190611cc89190612368565b60015b611d4e573d8060008114611cfb576040519150601f19603f3d011682016040523d82523d6000602084013e611d00565b606091505b50600081511415611d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3d9061283c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611da3565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e129061299c565b60405180910390fd5b611e248161125e565b15611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5b9061287c565b60405180910390fd5b611e7060008383611bb4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ec09190612b81565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054611f9890612d4c565b90600052602060002090601f016020900481019282611fba5760008555612001565b82601f10611fd357805160ff1916838001178555612001565b82800160010185558215612001579182015b82811115612000578251825591602001919060010190611fe5565b5b50905061200e9190612012565b5090565b5b8082111561202b576000816000905550600101612013565b5090565b600061204261203d84612adc565b612ab7565b90508281526020810184848401111561205e5761205d612f19565b5b612069848285612d0a565b509392505050565b600061208461207f84612b0d565b612ab7565b9050828152602081018484840111156120a05761209f612f19565b5b6120ab848285612d0a565b509392505050565b6000813590506120c281613432565b92915050565b6000813590506120d781613449565b92915050565b6000813590506120ec81613460565b92915050565b60008151905061210181613460565b92915050565b600082601f83011261211c5761211b612f14565b5b813561212c84826020860161202f565b91505092915050565b600082601f83011261214a57612149612f14565b5b813561215a848260208601612071565b91505092915050565b60008135905061217281613477565b92915050565b60006020828403121561218e5761218d612f23565b5b600061219c848285016120b3565b91505092915050565b600080604083850312156121bc576121bb612f23565b5b60006121ca858286016120b3565b92505060206121db858286016120b3565b9150509250929050565b6000806000606084860312156121fe576121fd612f23565b5b600061220c868287016120b3565b935050602061221d868287016120b3565b925050604061222e86828701612163565b9150509250925092565b6000806000806080858703121561225257612251612f23565b5b6000612260878288016120b3565b9450506020612271878288016120b3565b935050604061228287828801612163565b925050606085013567ffffffffffffffff8111156122a3576122a2612f1e565b5b6122af87828801612107565b91505092959194509250565b600080604083850312156122d2576122d1612f23565b5b60006122e0858286016120b3565b92505060206122f1858286016120c8565b9150509250929050565b6000806040838503121561231257612311612f23565b5b6000612320858286016120b3565b925050602061233185828601612163565b9150509250929050565b60006020828403121561235157612350612f23565b5b600061235f848285016120dd565b91505092915050565b60006020828403121561237e5761237d612f23565b5b600061238c848285016120f2565b91505092915050565b6000602082840312156123ab576123aa612f23565b5b600082013567ffffffffffffffff8111156123c9576123c8612f1e565b5b6123d584828501612135565b91505092915050565b6000602082840312156123f4576123f3612f23565b5b600061240284828501612163565b91505092915050565b61241481612c96565b82525050565b61242381612ca8565b82525050565b600061243482612b3e565b61243e8185612b54565b935061244e818560208601612d19565b61245781612f28565b840191505092915050565b600061246d82612b49565b6124778185612b65565b9350612487818560208601612d19565b61249081612f28565b840191505092915050565b60006124a682612b49565b6124b08185612b76565b93506124c0818560208601612d19565b80840191505092915050565b60006124d9603283612b65565b91506124e482612f39565b604082019050919050565b60006124fc602683612b65565b915061250782612f88565b604082019050919050565b600061251f601c83612b65565b915061252a82612fd7565b602082019050919050565b6000612542602483612b65565b915061254d82613000565b604082019050919050565b6000612565601983612b65565b91506125708261304f565b602082019050919050565b6000612588601f83612b65565b915061259382613078565b602082019050919050565b60006125ab602c83612b65565b91506125b6826130a1565b604082019050919050565b60006125ce603883612b65565b91506125d9826130f0565b604082019050919050565b60006125f1602a83612b65565b91506125fc8261313f565b604082019050919050565b6000612614602983612b65565b915061261f8261318e565b604082019050919050565b6000612637602a83612b65565b9150612642826131dd565b604082019050919050565b600061265a602083612b65565b91506126658261322c565b602082019050919050565b600061267d602c83612b65565b915061268882613255565b604082019050919050565b60006126a0602083612b65565b91506126ab826132a4565b602082019050919050565b60006126c3602983612b65565b91506126ce826132cd565b604082019050919050565b60006126e6602f83612b65565b91506126f18261331c565b604082019050919050565b6000612709602183612b65565b91506127148261336b565b604082019050919050565b600061272c603183612b65565b9150612737826133ba565b604082019050919050565b600061274f601783612b65565b915061275a82613409565b602082019050919050565b61276e81612d00565b82525050565b6000612780828561249b565b915061278c828461249b565b91508190509392505050565b60006020820190506127ad600083018461240b565b92915050565b60006080820190506127c8600083018761240b565b6127d5602083018661240b565b6127e26040830185612765565b81810360608301526127f48184612429565b905095945050505050565b6000602082019050612814600083018461241a565b92915050565b600060208201905081810360008301526128348184612462565b905092915050565b60006020820190508181036000830152612855816124cc565b9050919050565b60006020820190508181036000830152612875816124ef565b9050919050565b6000602082019050818103600083015261289581612512565b9050919050565b600060208201905081810360008301526128b581612535565b9050919050565b600060208201905081810360008301526128d581612558565b9050919050565b600060208201905081810360008301526128f58161257b565b9050919050565b600060208201905081810360008301526129158161259e565b9050919050565b60006020820190508181036000830152612935816125c1565b9050919050565b60006020820190508181036000830152612955816125e4565b9050919050565b6000602082019050818103600083015261297581612607565b9050919050565b600060208201905081810360008301526129958161262a565b9050919050565b600060208201905081810360008301526129b58161264d565b9050919050565b600060208201905081810360008301526129d581612670565b9050919050565b600060208201905081810360008301526129f581612693565b9050919050565b60006020820190508181036000830152612a15816126b6565b9050919050565b60006020820190508181036000830152612a35816126d9565b9050919050565b60006020820190508181036000830152612a55816126fc565b9050919050565b60006020820190508181036000830152612a758161271f565b9050919050565b60006020820190508181036000830152612a9581612742565b9050919050565b6000602082019050612ab16000830184612765565b92915050565b6000612ac1612ad2565b9050612acd8282612d7e565b919050565b6000604051905090565b600067ffffffffffffffff821115612af757612af6612ee5565b5b612b0082612f28565b9050602081019050919050565b600067ffffffffffffffff821115612b2857612b27612ee5565b5b612b3182612f28565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612b8c82612d00565b9150612b9783612d00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612bcc57612bcb612e29565b5b828201905092915050565b6000612be282612d00565b9150612bed83612d00565b925082612bfd57612bfc612e58565b5b828204905092915050565b6000612c1382612d00565b9150612c1e83612d00565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c5757612c56612e29565b5b828202905092915050565b6000612c6d82612d00565b9150612c7883612d00565b925082821015612c8b57612c8a612e29565b5b828203905092915050565b6000612ca182612ce0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612d37578082015181840152602081019050612d1c565b83811115612d46576000848401525b50505050565b60006002820490506001821680612d6457607f821691505b60208210811415612d7857612d77612e87565b5b50919050565b612d8782612f28565b810181811067ffffffffffffffff82111715612da657612da5612ee5565b5b80604052505050565b6000612dba82612d00565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ded57612dec612e29565b5b600182019050919050565b6000612e0382612d00565b9150612e0e83612d00565b925082612e1e57612e1d612e58565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c696420707572636861736520616d6f756e74000000000000000000600082015250565b61343b81612c96565b811461344657600080fd5b50565b61345281612ca8565b811461345d57600080fd5b50565b61346981612cb4565b811461347457600080fd5b50565b61348081612d00565b811461348b57600080fd5b5056fea2646970667358221220309f11e780516972a6e9b075b630b6a34f2e7e6427b85ef0045b69ba862e965564736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101405760003560e01c806370a08231116100b6578063a22cb4651161006f578063a22cb46514610429578063b88d4fde14610452578063c87b56dd1461047b578063e985e9c5146104b8578063f2fde38b146104f5578063fc4caf5a1461051e57610140565b806370a0823114610338578063715018a6146103755780638d859f3e1461038c5780638da5cb5b146103b757806395d89b41146103e2578063a0712d681461040d57610140565b806323b872dd1161010857806323b872dd1461023e5780633ccfd60b1461026757806342842e0e1461027e57806355f804b3146102a75780636352211e146102d05780636c0360eb1461030d57610140565b806301ffc9a71461014557806306fdde0314610182578063081812fc146101ad578063095ea7b3146101ea57806318160ddd14610213575b600080fd5b34801561015157600080fd5b5061016c6004803603810190610167919061233b565b610549565b60405161017991906127ff565b60405180910390f35b34801561018e57600080fd5b5061019761062b565b6040516101a4919061281a565b60405180910390f35b3480156101b957600080fd5b506101d460048036038101906101cf91906123de565b6106bd565b6040516101e19190612798565b60405180910390f35b3480156101f657600080fd5b50610211600480360381019061020c91906122fb565b610742565b005b34801561021f57600080fd5b5061022861085a565b6040516102359190612a9c565b60405180910390f35b34801561024a57600080fd5b50610265600480360381019061026091906121e5565b610860565b005b34801561027357600080fd5b5061027c6108c0565b005b34801561028a57600080fd5b506102a560048036038101906102a091906121e5565b610931565b005b3480156102b357600080fd5b506102ce60048036038101906102c99190612395565b610951565b005b3480156102dc57600080fd5b506102f760048036038101906102f291906123de565b6109e7565b6040516103049190612798565b60405180910390f35b34801561031957600080fd5b50610322610a99565b60405161032f919061281a565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a9190612178565b610b27565b60405161036c9190612a9c565b60405180910390f35b34801561038157600080fd5b5061038a610bdf565b005b34801561039857600080fd5b506103a1610c67565b6040516103ae9190612a9c565b60405180910390f35b3480156103c357600080fd5b506103cc610c72565b6040516103d99190612798565b60405180910390f35b3480156103ee57600080fd5b506103f7610c9c565b604051610404919061281a565b60405180910390f35b610427600480360381019061042291906123de565b610d2e565b005b34801561043557600080fd5b50610450600480360381019061044b91906122bb565b610f43565b005b34801561045e57600080fd5b5061047960048036038101906104749190612238565b610f59565b005b34801561048757600080fd5b506104a2600480360381019061049d91906123de565b610fbb565b6040516104af919061281a565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da91906121a5565b611062565b6040516104ec91906127ff565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190612178565b6110f6565b005b34801561052a57600080fd5b506105336111ee565b6040516105409190612a9c565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061061457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106245750610623826111f4565b5b9050919050565b60606000805461063a90612d4c565b80601f016020809104026020016040519081016040528092919081815260200182805461066690612d4c565b80156106b35780601f10610688576101008083540402835291602001916106b3565b820191906000526020600020905b81548152906001019060200180831161069657829003601f168201915b5050505050905090565b60006106c88261125e565b610707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fe906129bc565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061074d826109e7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b590612a3c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107dd6112ca565b73ffffffffffffffffffffffffffffffffffffffff16148061080c575061080b816108066112ca565b611062565b5b61084b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108429061291c565b60405180910390fd5b61085583836112d2565b505050565b60085481565b61087161086b6112ca565b8261138b565b6108b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a790612a5c565b60405180910390fd5b6108bb838383611469565b505050565b6000479050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561092d573d6000803e3d6000fd5b5050565b61094c83838360405180602001604052806000815250610f59565b505050565b6109596112ca565b73ffffffffffffffffffffffffffffffffffffffff16610977610c72565b73ffffffffffffffffffffffffffffffffffffffff16146109cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c4906129dc565b60405180910390fd5b80600790805190602001906109e3929190611f8c565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a879061295c565b60405180910390fd5b80915050919050565b60078054610aa690612d4c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad290612d4c565b8015610b1f5780601f10610af457610100808354040283529160200191610b1f565b820191906000526020600020905b815481529060010190602001808311610b0257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8f9061293c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610be76112ca565b73ffffffffffffffffffffffffffffffffffffffff16610c05610c72565b73ffffffffffffffffffffffffffffffffffffffff1614610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c52906129dc565b60405180910390fd5b610c6560006116c5565b565b662386f26fc1000081565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610cab90612d4c565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd790612d4c565b8015610d245780601f10610cf957610100808354040283529160200191610d24565b820191906000526020600020905b815481529060010190602001808311610d0757829003601f168201915b5050505050905090565b600081118015610d3e5750600581105b610d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7490612a7c565b60405180910390fd5b61138881600854610d8e9190612b81565b1115610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc69061297c565b60405180910390fd5b3481662386f26fc10000610de39190612c08565b14610e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1a906128dc565b60405180910390fd5b60005b81811015610e5857610e453382600854610e409190612b81565b61178b565b8080610e5090612daf565b915050610e26565b508060086000828254610e6b9190612b81565b925050819055506000610e8e6008546001600854610e899190612b81565b6117a9565b90506002811015610f0257610eb1336001600854610eac9190612b81565b61178b565b600160086000828254610ec49190612b81565b92505081905550610ee3336001600854610ede9190612b81565b61178b565b600160086000828254610ef69190612b81565b92505081905550610f3f565b6004811015610f3e57610f23336001600854610f1e9190612b81565b61178b565b600160086000828254610f369190612b81565b925050819055505b5b5050565b610f55610f4e6112ca565b83836117f8565b5050565b610f6a610f646112ca565b8361138b565b610fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa090612a5c565b60405180910390fd5b610fb584848484611965565b50505050565b6060610fc68261125e565b611005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffc90612a1c565b60405180910390fd5b600061100f6119c1565b9050600081511161102f576040518060200160405280600081525061105a565b8061103984611a53565b60405160200161104a929190612774565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110fe6112ca565b73ffffffffffffffffffffffffffffffffffffffff1661111c610c72565b73ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611169906129dc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d99061285c565b60405180910390fd5b6111eb816116c5565b50565b61138881565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611345836109e7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006113968261125e565b6113d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cc906128fc565b60405180910390fd5b60006113e0836109e7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061144f57508373ffffffffffffffffffffffffffffffffffffffff16611437846106bd565b73ffffffffffffffffffffffffffffffffffffffff16145b80611460575061145f8185611062565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611489826109e7565b73ffffffffffffffffffffffffffffffffffffffff16146114df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d6906129fc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561154f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115469061289c565b60405180910390fd5b61155a838383611bb4565b6115656000826112d2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115b59190612c62565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461160c9190612b81565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6117a5828260405180602001604052806000815250611bb9565b5050565b6000804283856028436117bc9190612b81565b6117c69190612b81565b6117d09190612b81565b6117da9190612b81565b905060006064826117eb9190612df8565b9050809250505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185e906128bc565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161195891906127ff565b60405180910390a3505050565b611970848484611469565b61197c84848484611c14565b6119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b29061283c565b60405180910390fd5b50505050565b6060600780546119d090612d4c565b80601f01602080910402602001604051908101604052809291908181526020018280546119fc90612d4c565b8015611a495780601f10611a1e57610100808354040283529160200191611a49565b820191906000526020600020905b815481529060010190602001808311611a2c57829003601f168201915b5050505050905090565b60606000821415611a9b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611baf565b600082905060005b60008214611acd578080611ab690612daf565b915050600a82611ac69190612bd7565b9150611aa3565b60008167ffffffffffffffff811115611ae957611ae8612ee5565b5b6040519080825280601f01601f191660200182016040528015611b1b5781602001600182028036833780820191505090505b5090505b60008514611ba857600182611b349190612c62565b9150600a85611b439190612df8565b6030611b4f9190612b81565b60f81b818381518110611b6557611b64612eb6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ba19190612bd7565b9450611b1f565b8093505050505b919050565b505050565b611bc38383611dab565b611bd06000848484611c14565b611c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c069061283c565b60405180910390fd5b505050565b6000611c358473ffffffffffffffffffffffffffffffffffffffff16611f79565b15611d9e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c5e6112ca565b8786866040518563ffffffff1660e01b8152600401611c8094939291906127b3565b602060405180830381600087803b158015611c9a57600080fd5b505af1925050508015611ccb57506040513d601f19601f82011682018060405250810190611cc89190612368565b60015b611d4e573d8060008114611cfb576040519150601f19603f3d011682016040523d82523d6000602084013e611d00565b606091505b50600081511415611d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3d9061283c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611da3565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e129061299c565b60405180910390fd5b611e248161125e565b15611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5b9061287c565b60405180910390fd5b611e7060008383611bb4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ec09190612b81565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054611f9890612d4c565b90600052602060002090601f016020900481019282611fba5760008555612001565b82601f10611fd357805160ff1916838001178555612001565b82800160010185558215612001579182015b82811115612000578251825591602001919060010190611fe5565b5b50905061200e9190612012565b5090565b5b8082111561202b576000816000905550600101612013565b5090565b600061204261203d84612adc565b612ab7565b90508281526020810184848401111561205e5761205d612f19565b5b612069848285612d0a565b509392505050565b600061208461207f84612b0d565b612ab7565b9050828152602081018484840111156120a05761209f612f19565b5b6120ab848285612d0a565b509392505050565b6000813590506120c281613432565b92915050565b6000813590506120d781613449565b92915050565b6000813590506120ec81613460565b92915050565b60008151905061210181613460565b92915050565b600082601f83011261211c5761211b612f14565b5b813561212c84826020860161202f565b91505092915050565b600082601f83011261214a57612149612f14565b5b813561215a848260208601612071565b91505092915050565b60008135905061217281613477565b92915050565b60006020828403121561218e5761218d612f23565b5b600061219c848285016120b3565b91505092915050565b600080604083850312156121bc576121bb612f23565b5b60006121ca858286016120b3565b92505060206121db858286016120b3565b9150509250929050565b6000806000606084860312156121fe576121fd612f23565b5b600061220c868287016120b3565b935050602061221d868287016120b3565b925050604061222e86828701612163565b9150509250925092565b6000806000806080858703121561225257612251612f23565b5b6000612260878288016120b3565b9450506020612271878288016120b3565b935050604061228287828801612163565b925050606085013567ffffffffffffffff8111156122a3576122a2612f1e565b5b6122af87828801612107565b91505092959194509250565b600080604083850312156122d2576122d1612f23565b5b60006122e0858286016120b3565b92505060206122f1858286016120c8565b9150509250929050565b6000806040838503121561231257612311612f23565b5b6000612320858286016120b3565b925050602061233185828601612163565b9150509250929050565b60006020828403121561235157612350612f23565b5b600061235f848285016120dd565b91505092915050565b60006020828403121561237e5761237d612f23565b5b600061238c848285016120f2565b91505092915050565b6000602082840312156123ab576123aa612f23565b5b600082013567ffffffffffffffff8111156123c9576123c8612f1e565b5b6123d584828501612135565b91505092915050565b6000602082840312156123f4576123f3612f23565b5b600061240284828501612163565b91505092915050565b61241481612c96565b82525050565b61242381612ca8565b82525050565b600061243482612b3e565b61243e8185612b54565b935061244e818560208601612d19565b61245781612f28565b840191505092915050565b600061246d82612b49565b6124778185612b65565b9350612487818560208601612d19565b61249081612f28565b840191505092915050565b60006124a682612b49565b6124b08185612b76565b93506124c0818560208601612d19565b80840191505092915050565b60006124d9603283612b65565b91506124e482612f39565b604082019050919050565b60006124fc602683612b65565b915061250782612f88565b604082019050919050565b600061251f601c83612b65565b915061252a82612fd7565b602082019050919050565b6000612542602483612b65565b915061254d82613000565b604082019050919050565b6000612565601983612b65565b91506125708261304f565b602082019050919050565b6000612588601f83612b65565b915061259382613078565b602082019050919050565b60006125ab602c83612b65565b91506125b6826130a1565b604082019050919050565b60006125ce603883612b65565b91506125d9826130f0565b604082019050919050565b60006125f1602a83612b65565b91506125fc8261313f565b604082019050919050565b6000612614602983612b65565b915061261f8261318e565b604082019050919050565b6000612637602a83612b65565b9150612642826131dd565b604082019050919050565b600061265a602083612b65565b91506126658261322c565b602082019050919050565b600061267d602c83612b65565b915061268882613255565b604082019050919050565b60006126a0602083612b65565b91506126ab826132a4565b602082019050919050565b60006126c3602983612b65565b91506126ce826132cd565b604082019050919050565b60006126e6602f83612b65565b91506126f18261331c565b604082019050919050565b6000612709602183612b65565b91506127148261336b565b604082019050919050565b600061272c603183612b65565b9150612737826133ba565b604082019050919050565b600061274f601783612b65565b915061275a82613409565b602082019050919050565b61276e81612d00565b82525050565b6000612780828561249b565b915061278c828461249b565b91508190509392505050565b60006020820190506127ad600083018461240b565b92915050565b60006080820190506127c8600083018761240b565b6127d5602083018661240b565b6127e26040830185612765565b81810360608301526127f48184612429565b905095945050505050565b6000602082019050612814600083018461241a565b92915050565b600060208201905081810360008301526128348184612462565b905092915050565b60006020820190508181036000830152612855816124cc565b9050919050565b60006020820190508181036000830152612875816124ef565b9050919050565b6000602082019050818103600083015261289581612512565b9050919050565b600060208201905081810360008301526128b581612535565b9050919050565b600060208201905081810360008301526128d581612558565b9050919050565b600060208201905081810360008301526128f58161257b565b9050919050565b600060208201905081810360008301526129158161259e565b9050919050565b60006020820190508181036000830152612935816125c1565b9050919050565b60006020820190508181036000830152612955816125e4565b9050919050565b6000602082019050818103600083015261297581612607565b9050919050565b600060208201905081810360008301526129958161262a565b9050919050565b600060208201905081810360008301526129b58161264d565b9050919050565b600060208201905081810360008301526129d581612670565b9050919050565b600060208201905081810360008301526129f581612693565b9050919050565b60006020820190508181036000830152612a15816126b6565b9050919050565b60006020820190508181036000830152612a35816126d9565b9050919050565b60006020820190508181036000830152612a55816126fc565b9050919050565b60006020820190508181036000830152612a758161271f565b9050919050565b60006020820190508181036000830152612a9581612742565b9050919050565b6000602082019050612ab16000830184612765565b92915050565b6000612ac1612ad2565b9050612acd8282612d7e565b919050565b6000604051905090565b600067ffffffffffffffff821115612af757612af6612ee5565b5b612b0082612f28565b9050602081019050919050565b600067ffffffffffffffff821115612b2857612b27612ee5565b5b612b3182612f28565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612b8c82612d00565b9150612b9783612d00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612bcc57612bcb612e29565b5b828201905092915050565b6000612be282612d00565b9150612bed83612d00565b925082612bfd57612bfc612e58565b5b828204905092915050565b6000612c1382612d00565b9150612c1e83612d00565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c5757612c56612e29565b5b828202905092915050565b6000612c6d82612d00565b9150612c7883612d00565b925082821015612c8b57612c8a612e29565b5b828203905092915050565b6000612ca182612ce0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612d37578082015181840152602081019050612d1c565b83811115612d46576000848401525b50505050565b60006002820490506001821680612d6457607f821691505b60208210811415612d7857612d77612e87565b5b50919050565b612d8782612f28565b810181811067ffffffffffffffff82111715612da657612da5612ee5565b5b80604052505050565b6000612dba82612d00565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ded57612dec612e29565b5b600182019050919050565b6000612e0382612d00565b9150612e0e83612d00565b925082612e1e57612e1d612e58565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e76616c696420707572636861736520616d6f756e74000000000000000000600082015250565b61343b81612c96565b811461344657600080fd5b50565b61345281612ca8565b811461345d57600080fd5b50565b61346981612cb4565b811461347457600080fd5b50565b61348081612d00565b811461348b57600080fd5b5056fea2646970667358221220309f11e780516972a6e9b075b630b6a34f2e7e6427b85ef0045b69ba862e965564736f6c63430008070033

Deployed Bytecode Sourcemap

36301:2234:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23789:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24734:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26293:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25816:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36566:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27043:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38398:134;;;;;;;;;;;;;:::i;:::-;;27453:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38169:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24428:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36442:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24158:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8420:103;;;;;;;;;;;;;:::i;:::-;;36517:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7769:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24903:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36752:935;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26586:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27709:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25078:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26812:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8678:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36470:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23789:305;23891:4;23943:25;23928:40;;;:11;:40;;;;:105;;;;24000:33;23985:48;;;:11;:48;;;;23928:105;:158;;;;24050:36;24074:11;24050:23;:36::i;:::-;23928:158;23908:178;;23789:305;;;:::o;24734:100::-;24788:13;24821:5;24814:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24734:100;:::o;26293:221::-;26369:7;26397:16;26405:7;26397;:16::i;:::-;26389:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26482:15;:24;26498:7;26482:24;;;;;;;;;;;;;;;;;;;;;26475:31;;26293:221;;;:::o;25816:411::-;25897:13;25913:23;25928:7;25913:14;:23::i;:::-;25897:39;;25961:5;25955:11;;:2;:11;;;;25947:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26055:5;26039:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26064:37;26081:5;26088:12;:10;:12::i;:::-;26064:16;:37::i;:::-;26039:62;26017:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26198:21;26207:2;26211:7;26198:8;:21::i;:::-;25886:341;25816:411;;:::o;36566:26::-;;;;:::o;27043:339::-;27238:41;27257:12;:10;:12::i;:::-;27271:7;27238:18;:41::i;:::-;27230:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27346:28;27356:4;27362:2;27366:7;27346:9;:28::i;:::-;27043:339;;;:::o;38398:134::-;38436:15;38454:21;38436:39;;38494:11;;;;;;;;;;;38486:29;;:38;38516:7;38486:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38425:107;38398:134::o;27453:185::-;27591:39;27608:4;27614:2;27618:7;27591:39;;;;;;;;;;;;:16;:39::i;:::-;27453:185;;;:::o;38169:88::-;8000:12;:10;:12::i;:::-;7989:23;;:7;:5;:7::i;:::-;:23;;;7981:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38246:3:::1;38236:7;:13;;;;;;;;;;;;:::i;:::-;;38169:88:::0;:::o;24428:239::-;24500:7;24520:13;24536:7;:16;24544:7;24536:16;;;;;;;;;;;;;;;;;;;;;24520:32;;24588:1;24571:19;;:5;:19;;;;24563:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24654:5;24647:12;;;24428:239;;;:::o;36442:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24158:208::-;24230:7;24275:1;24258:19;;:5;:19;;;;24250:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24342:9;:16;24352:5;24342:16;;;;;;;;;;;;;;;;24335:23;;24158:208;;;:::o;8420:103::-;8000:12;:10;:12::i;:::-;7989:23;;:7;:5;:7::i;:::-;:23;;;7981:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8485:30:::1;8512:1;8485:18;:30::i;:::-;8420:103::o:0;36517:42::-;36549:10;36517:42;:::o;7769:87::-;7815:7;7842:6;;;;;;;;;;;7835:13;;7769:87;:::o;24903:104::-;24959:13;24992:7;24985:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24903:104;:::o;36752:935::-;36839:1;36823:13;:17;:38;;;;;36860:1;36844:13;:17;36823:38;36815:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;36506:4;36934:13;36920:11;;:27;;;;:::i;:::-;:40;;36912:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37059:9;37042:13;36549:10;37034:21;;;;:::i;:::-;:34;37026:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;37135:9;37131:104;37150:13;37146:1;:17;37131:104;;;37185:38;37195:10;37221:1;37207:11;;:15;;;;:::i;:::-;37185:9;:38::i;:::-;37165:3;;;;;:::i;:::-;;;;37131:104;;;;37260:13;37245:11;;:28;;;;;;;:::i;:::-;;;;;;;;37284:18;37305:36;37312:11;;37339:1;37325:11;;:15;;;;:::i;:::-;37305:6;:36::i;:::-;37284:57;;37369:1;37356:10;:14;37352:328;;;37386:38;37396:10;37422:1;37408:11;;:15;;;;:::i;:::-;37386:9;:38::i;:::-;37454:1;37439:11;;:16;;;;;;;:::i;:::-;;;;;;;;37470:38;37480:10;37506:1;37492:11;;:15;;;;:::i;:::-;37470:9;:38::i;:::-;37538:1;37523:11;;:16;;;;;;;:::i;:::-;;;;;;;;37352:328;;;37582:1;37569:10;:14;37566:114;;;37599:38;37609:10;37635:1;37621:11;;:15;;;;:::i;:::-;37599:9;:38::i;:::-;37667:1;37652:11;;:16;;;;;;;:::i;:::-;;;;;;;;37566:114;37352:328;36804:883;36752:935;:::o;26586:155::-;26681:52;26700:12;:10;:12::i;:::-;26714:8;26724;26681:18;:52::i;:::-;26586:155;;:::o;27709:328::-;27884:41;27903:12;:10;:12::i;:::-;27917:7;27884:18;:41::i;:::-;27876:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27990:39;28004:4;28010:2;28014:7;28023:5;27990:13;:39::i;:::-;27709:328;;;;:::o;25078:334::-;25151:13;25185:16;25193:7;25185;:16::i;:::-;25177:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25266:21;25290:10;:8;:10::i;:::-;25266:34;;25342:1;25324:7;25318:21;:25;:86;;;;;;;;;;;;;;;;;25370:7;25379:18;:7;:16;:18::i;:::-;25353:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25318:86;25311:93;;;25078:334;;;:::o;26812:164::-;26909:4;26933:18;:25;26952:5;26933:25;;;;;;;;;;;;;;;:35;26959:8;26933:35;;;;;;;;;;;;;;;;;;;;;;;;;26926:42;;26812:164;;;;:::o;8678:201::-;8000:12;:10;:12::i;:::-;7989:23;;:7;:5;:7::i;:::-;:23;;;7981:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8787:1:::1;8767:22;;:8;:22;;;;8759:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8843:28;8862:8;8843:18;:28::i;:::-;8678:201:::0;:::o;36470:40::-;36506:4;36470:40;:::o;10102:157::-;10187:4;10226:25;10211:40;;;:11;:40;;;;10204:47;;10102:157;;;:::o;29547:127::-;29612:4;29664:1;29636:30;;:7;:16;29644:7;29636:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29629:37;;29547:127;;;:::o;857:98::-;910:7;937:10;930:17;;857:98;:::o;33529:174::-;33631:2;33604:15;:24;33620:7;33604:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33687:7;33683:2;33649:46;;33658:23;33673:7;33658:14;:23::i;:::-;33649:46;;;;;;;;;;;;33529:174;;:::o;29841:348::-;29934:4;29959:16;29967:7;29959;:16::i;:::-;29951:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30035:13;30051:23;30066:7;30051:14;:23::i;:::-;30035:39;;30104:5;30093:16;;:7;:16;;;:51;;;;30137:7;30113:31;;:20;30125:7;30113:11;:20::i;:::-;:31;;;30093:51;:87;;;;30148:32;30165:5;30172:7;30148:16;:32::i;:::-;30093:87;30085:96;;;29841:348;;;;:::o;32833:578::-;32992:4;32965:31;;:23;32980:7;32965:14;:23::i;:::-;:31;;;32957:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33075:1;33061:16;;:2;:16;;;;33053:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33131:39;33152:4;33158:2;33162:7;33131:20;:39::i;:::-;33235:29;33252:1;33256:7;33235:8;:29::i;:::-;33296:1;33277:9;:15;33287:4;33277:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33325:1;33308:9;:13;33318:2;33308:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33356:2;33337:7;:16;33345:7;33337:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33395:7;33391:2;33376:27;;33385:4;33376:27;;;;;;;;;;;;32833:578;;;:::o;9039:191::-;9113:16;9132:6;;;;;;;;;;;9113:25;;9158:8;9149:6;;:17;;;;;;;;;;;;;;;;;;9213:8;9182:40;;9203:8;9182:40;;;;;;;;;;;;9102:128;9039:191;:::o;30531:110::-;30607:26;30617:2;30621:7;30607:26;;;;;;;;;;;;:9;:26::i;:::-;30531:110;;:::o;37910:247::-;37981:7;38001:19;38062:15;38053:6;38043:7;38038:2;38023:12;:17;;;;:::i;:::-;:27;;;;:::i;:::-;:36;;;;:::i;:::-;:54;;;;:::i;:::-;38001:76;;38089:15;38121:3;38107:11;:17;;;;:::i;:::-;38089:35;;38142:7;38135:14;;;;37910:247;;;;:::o;33845:315::-;34000:8;33991:17;;:5;:17;;;;33983:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;34087:8;34049:18;:25;34068:5;34049:25;;;;;;;;;;;;;;;:35;34075:8;34049:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;34133:8;34111:41;;34126:5;34111:41;;;34143:8;34111:41;;;;;;:::i;:::-;;;;;;;;33845:315;;;:::o;28919:::-;29076:28;29086:4;29092:2;29096:7;29076:9;:28::i;:::-;29123:48;29146:4;29152:2;29156:7;29165:5;29123:22;:48::i;:::-;29115:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28919:315;;;;:::o;38263:100::-;38315:13;38348:7;38341:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38263:100;:::o;10631:723::-;10687:13;10917:1;10908:5;:10;10904:53;;;10935:10;;;;;;;;;;;;;;;;;;;;;10904:53;10967:12;10982:5;10967:20;;10998:14;11023:78;11038:1;11030:4;:9;11023:78;;11056:8;;;;;:::i;:::-;;;;11087:2;11079:10;;;;;:::i;:::-;;;11023:78;;;11111:19;11143:6;11133:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11111:39;;11161:154;11177:1;11168:5;:10;11161:154;;11205:1;11195:11;;;;;:::i;:::-;;;11272:2;11264:5;:10;;;;:::i;:::-;11251:2;:24;;;;:::i;:::-;11238:39;;11221:6;11228;11221:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;11301:2;11292:11;;;;;:::i;:::-;;;11161:154;;;11339:6;11325:21;;;;;10631:723;;;;:::o;36096:126::-;;;;:::o;30868:321::-;30998:18;31004:2;31008:7;30998:5;:18::i;:::-;31049:54;31080:1;31084:2;31088:7;31097:5;31049:22;:54::i;:::-;31027:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30868:321;;;:::o;34725:799::-;34880:4;34901:15;:2;:13;;;:15::i;:::-;34897:620;;;34953:2;34937:36;;;34974:12;:10;:12::i;:::-;34988:4;34994:7;35003:5;34937:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34933:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35196:1;35179:6;:13;:18;35175:272;;;35222:60;;;;;;;;;;:::i;:::-;;;;;;;;35175:272;35397:6;35391:13;35382:6;35378:2;35374:15;35367:38;34933:529;35070:41;;;35060:51;;;:6;:51;;;;35053:58;;;;;34897:620;35501:4;35494:11;;34725:799;;;;;;;:::o;31525:382::-;31619:1;31605:16;;:2;:16;;;;31597:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31678:16;31686:7;31678;:16::i;:::-;31677:17;31669:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31740:45;31769:1;31773:2;31777:7;31740:20;:45::i;:::-;31815:1;31798:9;:13;31808:2;31798:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31846:2;31827:7;:16;31835:7;31827:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31891:7;31887:2;31866:33;;31883:1;31866:33;;;;;;;;;;;;31525:382;;:::o;13214:387::-;13274:4;13482:12;13549:7;13537:20;13529:28;;13592:1;13585:4;:8;13578:15;;;13214: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;8516:366::-;8658:3;8679:67;8743:2;8738:3;8679:67;:::i;:::-;8672:74;;8755:93;8844:3;8755:93;:::i;:::-;8873:2;8868:3;8864:12;8857:19;;8516:366;;;:::o;8888:::-;9030:3;9051:67;9115:2;9110:3;9051:67;:::i;:::-;9044:74;;9127:93;9216:3;9127:93;:::i;:::-;9245:2;9240:3;9236:12;9229:19;;8888:366;;;:::o;9260:::-;9402:3;9423:67;9487:2;9482:3;9423:67;:::i;:::-;9416:74;;9499:93;9588:3;9499:93;:::i;:::-;9617:2;9612:3;9608:12;9601:19;;9260:366;;;:::o;9632:::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9632:366;;;:::o;10004:::-;10146:3;10167:67;10231:2;10226:3;10167:67;:::i;:::-;10160:74;;10243:93;10332:3;10243:93;:::i;:::-;10361:2;10356:3;10352:12;10345:19;;10004:366;;;:::o;10376:::-;10518:3;10539:67;10603:2;10598:3;10539:67;:::i;:::-;10532:74;;10615:93;10704:3;10615:93;:::i;:::-;10733:2;10728:3;10724:12;10717:19;;10376:366;;;:::o;10748:::-;10890:3;10911:67;10975:2;10970:3;10911:67;:::i;:::-;10904:74;;10987:93;11076:3;10987:93;:::i;:::-;11105:2;11100:3;11096:12;11089:19;;10748:366;;;:::o;11120:::-;11262:3;11283:67;11347:2;11342:3;11283:67;:::i;:::-;11276:74;;11359:93;11448:3;11359:93;:::i;:::-;11477:2;11472:3;11468:12;11461:19;;11120:366;;;:::o;11492:::-;11634:3;11655:67;11719:2;11714:3;11655:67;:::i;:::-;11648:74;;11731:93;11820:3;11731:93;:::i;:::-;11849:2;11844:3;11840:12;11833:19;;11492:366;;;:::o;11864:::-;12006:3;12027:67;12091:2;12086:3;12027:67;:::i;:::-;12020:74;;12103:93;12192:3;12103:93;:::i;:::-;12221:2;12216:3;12212:12;12205:19;;11864:366;;;:::o;12236:::-;12378:3;12399:67;12463:2;12458:3;12399:67;:::i;:::-;12392:74;;12475:93;12564:3;12475:93;:::i;:::-;12593:2;12588:3;12584:12;12577:19;;12236:366;;;:::o;12608:::-;12750:3;12771:67;12835:2;12830:3;12771:67;:::i;:::-;12764:74;;12847:93;12936:3;12847:93;:::i;:::-;12965:2;12960:3;12956:12;12949:19;;12608:366;;;:::o;12980:::-;13122:3;13143:67;13207:2;13202:3;13143:67;:::i;:::-;13136:74;;13219:93;13308:3;13219:93;:::i;:::-;13337:2;13332:3;13328:12;13321:19;;12980:366;;;:::o;13352:::-;13494:3;13515:67;13579:2;13574:3;13515:67;:::i;:::-;13508:74;;13591:93;13680:3;13591:93;:::i;:::-;13709:2;13704:3;13700:12;13693:19;;13352:366;;;:::o;13724:::-;13866:3;13887:67;13951:2;13946:3;13887:67;:::i;:::-;13880:74;;13963:93;14052:3;13963:93;:::i;:::-;14081:2;14076:3;14072:12;14065:19;;13724:366;;;:::o;14096:::-;14238:3;14259:67;14323:2;14318:3;14259:67;:::i;:::-;14252:74;;14335:93;14424:3;14335:93;:::i;:::-;14453:2;14448:3;14444:12;14437:19;;14096:366;;;:::o;14468:::-;14610:3;14631:67;14695:2;14690:3;14631:67;:::i;:::-;14624:74;;14707:93;14796:3;14707:93;:::i;:::-;14825:2;14820:3;14816:12;14809:19;;14468:366;;;:::o;14840:::-;14982:3;15003:67;15067:2;15062:3;15003:67;:::i;:::-;14996:74;;15079:93;15168:3;15079:93;:::i;:::-;15197:2;15192:3;15188:12;15181:19;;14840:366;;;:::o;15212:::-;15354:3;15375:67;15439:2;15434:3;15375:67;:::i;:::-;15368:74;;15451:93;15540:3;15451:93;:::i;:::-;15569:2;15564:3;15560:12;15553:19;;15212:366;;;:::o;15584:118::-;15671:24;15689:5;15671:24;:::i;:::-;15666:3;15659:37;15584:118;;:::o;15708:435::-;15888:3;15910:95;16001:3;15992:6;15910:95;:::i;:::-;15903:102;;16022:95;16113:3;16104:6;16022:95;:::i;:::-;16015:102;;16134:3;16127:10;;15708:435;;;;;:::o;16149:222::-;16242:4;16280:2;16269:9;16265:18;16257:26;;16293:71;16361:1;16350:9;16346:17;16337:6;16293:71;:::i;:::-;16149:222;;;;:::o;16377:640::-;16572:4;16610:3;16599:9;16595:19;16587:27;;16624:71;16692:1;16681:9;16677:17;16668:6;16624:71;:::i;:::-;16705:72;16773:2;16762:9;16758:18;16749:6;16705:72;:::i;:::-;16787;16855:2;16844:9;16840:18;16831:6;16787:72;:::i;:::-;16906:9;16900:4;16896:20;16891:2;16880:9;16876:18;16869:48;16934:76;17005:4;16996:6;16934:76;:::i;:::-;16926:84;;16377:640;;;;;;;:::o;17023:210::-;17110:4;17148:2;17137:9;17133:18;17125:26;;17161:65;17223:1;17212:9;17208:17;17199:6;17161:65;:::i;:::-;17023:210;;;;:::o;17239:313::-;17352:4;17390:2;17379:9;17375:18;17367:26;;17439:9;17433:4;17429:20;17425:1;17414:9;17410:17;17403:47;17467:78;17540:4;17531:6;17467:78;:::i;:::-;17459:86;;17239:313;;;;:::o;17558:419::-;17724:4;17762:2;17751:9;17747:18;17739:26;;17811:9;17805:4;17801:20;17797:1;17786:9;17782:17;17775:47;17839:131;17965:4;17839:131;:::i;:::-;17831:139;;17558:419;;;:::o;17983:::-;18149:4;18187:2;18176:9;18172:18;18164:26;;18236:9;18230:4;18226:20;18222:1;18211:9;18207:17;18200:47;18264:131;18390:4;18264:131;:::i;:::-;18256:139;;17983:419;;;:::o;18408:::-;18574:4;18612:2;18601:9;18597:18;18589:26;;18661:9;18655:4;18651:20;18647:1;18636:9;18632:17;18625:47;18689:131;18815:4;18689:131;:::i;:::-;18681:139;;18408:419;;;:::o;18833:::-;18999:4;19037:2;19026:9;19022:18;19014:26;;19086:9;19080:4;19076:20;19072:1;19061:9;19057:17;19050:47;19114:131;19240:4;19114:131;:::i;:::-;19106:139;;18833:419;;;:::o;19258:::-;19424:4;19462:2;19451:9;19447:18;19439:26;;19511:9;19505:4;19501:20;19497:1;19486:9;19482:17;19475:47;19539:131;19665:4;19539:131;:::i;:::-;19531:139;;19258:419;;;:::o;19683:::-;19849:4;19887:2;19876:9;19872:18;19864:26;;19936:9;19930:4;19926:20;19922:1;19911:9;19907:17;19900:47;19964:131;20090:4;19964:131;:::i;:::-;19956:139;;19683:419;;;:::o;20108:::-;20274:4;20312:2;20301:9;20297:18;20289:26;;20361:9;20355:4;20351:20;20347:1;20336:9;20332:17;20325:47;20389:131;20515:4;20389:131;:::i;:::-;20381:139;;20108:419;;;:::o;20533:::-;20699:4;20737:2;20726:9;20722:18;20714:26;;20786:9;20780:4;20776:20;20772:1;20761:9;20757:17;20750:47;20814:131;20940:4;20814:131;:::i;:::-;20806:139;;20533:419;;;:::o;20958:::-;21124:4;21162:2;21151:9;21147:18;21139:26;;21211:9;21205:4;21201:20;21197:1;21186:9;21182:17;21175:47;21239:131;21365:4;21239:131;:::i;:::-;21231:139;;20958:419;;;:::o;21383:::-;21549:4;21587:2;21576:9;21572:18;21564:26;;21636:9;21630:4;21626:20;21622:1;21611:9;21607:17;21600:47;21664:131;21790:4;21664:131;:::i;:::-;21656:139;;21383:419;;;:::o;21808:::-;21974:4;22012:2;22001:9;21997:18;21989:26;;22061:9;22055:4;22051:20;22047:1;22036:9;22032:17;22025:47;22089:131;22215:4;22089:131;:::i;:::-;22081:139;;21808:419;;;:::o;22233:::-;22399:4;22437:2;22426:9;22422:18;22414:26;;22486:9;22480:4;22476:20;22472:1;22461:9;22457:17;22450:47;22514:131;22640:4;22514:131;:::i;:::-;22506:139;;22233:419;;;:::o;22658:::-;22824:4;22862:2;22851:9;22847:18;22839:26;;22911:9;22905:4;22901:20;22897:1;22886:9;22882:17;22875:47;22939:131;23065:4;22939:131;:::i;:::-;22931:139;;22658:419;;;:::o;23083:::-;23249:4;23287:2;23276:9;23272:18;23264:26;;23336:9;23330:4;23326:20;23322:1;23311:9;23307:17;23300:47;23364:131;23490:4;23364:131;:::i;:::-;23356:139;;23083:419;;;:::o;23508:::-;23674:4;23712:2;23701:9;23697:18;23689:26;;23761:9;23755:4;23751:20;23747:1;23736:9;23732:17;23725:47;23789:131;23915:4;23789:131;:::i;:::-;23781:139;;23508:419;;;:::o;23933:::-;24099:4;24137:2;24126:9;24122:18;24114:26;;24186:9;24180:4;24176:20;24172:1;24161:9;24157:17;24150:47;24214:131;24340:4;24214:131;:::i;:::-;24206:139;;23933:419;;;:::o;24358:::-;24524:4;24562:2;24551:9;24547:18;24539:26;;24611:9;24605:4;24601:20;24597:1;24586:9;24582:17;24575:47;24639:131;24765:4;24639:131;:::i;:::-;24631:139;;24358:419;;;:::o;24783:::-;24949:4;24987:2;24976:9;24972:18;24964:26;;25036:9;25030:4;25026:20;25022:1;25011:9;25007:17;25000:47;25064:131;25190:4;25064:131;:::i;:::-;25056:139;;24783:419;;;:::o;25208:::-;25374:4;25412:2;25401:9;25397:18;25389:26;;25461:9;25455:4;25451:20;25447:1;25436:9;25432:17;25425:47;25489:131;25615:4;25489:131;:::i;:::-;25481:139;;25208:419;;;:::o;25633:222::-;25726:4;25764:2;25753:9;25749:18;25741:26;;25777:71;25845:1;25834:9;25830:17;25821:6;25777:71;:::i;:::-;25633:222;;;;:::o;25861:129::-;25895:6;25922:20;;:::i;:::-;25912:30;;25951:33;25979:4;25971:6;25951:33;:::i;:::-;25861:129;;;:::o;25996:75::-;26029:6;26062:2;26056:9;26046:19;;25996:75;:::o;26077:307::-;26138:4;26228:18;26220:6;26217:30;26214:56;;;26250:18;;:::i;:::-;26214:56;26288:29;26310:6;26288:29;:::i;:::-;26280:37;;26372:4;26366;26362:15;26354:23;;26077:307;;;:::o;26390:308::-;26452:4;26542:18;26534:6;26531:30;26528:56;;;26564:18;;:::i;:::-;26528:56;26602:29;26624:6;26602:29;:::i;:::-;26594:37;;26686:4;26680;26676:15;26668:23;;26390:308;;;:::o;26704:98::-;26755:6;26789:5;26783:12;26773:22;;26704:98;;;:::o;26808:99::-;26860:6;26894:5;26888:12;26878:22;;26808:99;;;:::o;26913:168::-;26996:11;27030:6;27025:3;27018:19;27070:4;27065:3;27061:14;27046:29;;26913:168;;;;:::o;27087:169::-;27171:11;27205:6;27200:3;27193:19;27245:4;27240:3;27236:14;27221:29;;27087:169;;;;:::o;27262:148::-;27364:11;27401:3;27386:18;;27262:148;;;;:::o;27416:305::-;27456:3;27475:20;27493:1;27475:20;:::i;:::-;27470:25;;27509:20;27527:1;27509:20;:::i;:::-;27504:25;;27663:1;27595:66;27591:74;27588:1;27585:81;27582:107;;;27669:18;;:::i;:::-;27582:107;27713:1;27710;27706:9;27699:16;;27416:305;;;;:::o;27727:185::-;27767:1;27784:20;27802:1;27784:20;:::i;:::-;27779:25;;27818:20;27836:1;27818:20;:::i;:::-;27813:25;;27857:1;27847:35;;27862:18;;:::i;:::-;27847:35;27904:1;27901;27897:9;27892:14;;27727:185;;;;:::o;27918:348::-;27958:7;27981:20;27999:1;27981:20;:::i;:::-;27976:25;;28015:20;28033:1;28015:20;:::i;:::-;28010:25;;28203:1;28135:66;28131:74;28128:1;28125:81;28120:1;28113:9;28106:17;28102:105;28099:131;;;28210:18;;:::i;:::-;28099:131;28258:1;28255;28251:9;28240:20;;27918:348;;;;:::o;28272:191::-;28312:4;28332:20;28350:1;28332:20;:::i;:::-;28327:25;;28366:20;28384:1;28366:20;:::i;:::-;28361:25;;28405:1;28402;28399:8;28396:34;;;28410:18;;:::i;:::-;28396:34;28455:1;28452;28448:9;28440:17;;28272:191;;;;:::o;28469:96::-;28506:7;28535:24;28553:5;28535:24;:::i;:::-;28524:35;;28469:96;;;:::o;28571:90::-;28605:7;28648:5;28641:13;28634:21;28623:32;;28571:90;;;:::o;28667:149::-;28703:7;28743:66;28736:5;28732:78;28721:89;;28667:149;;;:::o;28822:126::-;28859:7;28899:42;28892:5;28888:54;28877:65;;28822:126;;;:::o;28954:77::-;28991:7;29020:5;29009:16;;28954:77;;;:::o;29037:154::-;29121:6;29116:3;29111;29098:30;29183:1;29174:6;29169:3;29165:16;29158:27;29037:154;;;:::o;29197:307::-;29265:1;29275:113;29289:6;29286:1;29283:13;29275:113;;;29374:1;29369:3;29365:11;29359:18;29355:1;29350:3;29346:11;29339:39;29311:2;29308:1;29304:10;29299:15;;29275:113;;;29406:6;29403:1;29400:13;29397:101;;;29486:1;29477:6;29472:3;29468:16;29461:27;29397:101;29246:258;29197:307;;;:::o;29510:320::-;29554:6;29591:1;29585:4;29581:12;29571:22;;29638:1;29632:4;29628:12;29659:18;29649:81;;29715:4;29707:6;29703:17;29693:27;;29649:81;29777:2;29769:6;29766:14;29746:18;29743:38;29740:84;;;29796:18;;:::i;:::-;29740:84;29561:269;29510:320;;;:::o;29836:281::-;29919:27;29941:4;29919:27;:::i;:::-;29911:6;29907:40;30049:6;30037:10;30034:22;30013:18;30001:10;29998:34;29995:62;29992:88;;;30060:18;;:::i;:::-;29992:88;30100:10;30096:2;30089:22;29879:238;29836:281;;:::o;30123:233::-;30162:3;30185:24;30203:5;30185:24;:::i;:::-;30176:33;;30231:66;30224:5;30221:77;30218:103;;;30301:18;;:::i;:::-;30218:103;30348:1;30341:5;30337:13;30330:20;;30123:233;;;:::o;30362:176::-;30394:1;30411:20;30429:1;30411:20;:::i;:::-;30406:25;;30445:20;30463:1;30445:20;:::i;:::-;30440:25;;30484:1;30474:35;;30489:18;;:::i;:::-;30474:35;30530:1;30527;30523:9;30518:14;;30362:176;;;;:::o;30544:180::-;30592:77;30589:1;30582:88;30689:4;30686:1;30679:15;30713:4;30710:1;30703:15;30730:180;30778:77;30775:1;30768:88;30875:4;30872:1;30865:15;30899:4;30896:1;30889:15;30916:180;30964:77;30961:1;30954:88;31061:4;31058:1;31051:15;31085:4;31082:1;31075:15;31102:180;31150:77;31147:1;31140:88;31247:4;31244:1;31237:15;31271:4;31268:1;31261:15;31288:180;31336:77;31333:1;31326:88;31433:4;31430:1;31423:15;31457:4;31454:1;31447:15;31474:117;31583:1;31580;31573:12;31597:117;31706:1;31703;31696:12;31720:117;31829:1;31826;31819:12;31843:117;31952:1;31949;31942:12;31966:102;32007:6;32058:2;32054:7;32049:2;32042:5;32038:14;32034:28;32024:38;;31966:102;;;:::o;32074:237::-;32214:34;32210:1;32202:6;32198:14;32191:58;32283:20;32278:2;32270:6;32266:15;32259:45;32074:237;:::o;32317:225::-;32457:34;32453:1;32445:6;32441:14;32434:58;32526:8;32521:2;32513:6;32509:15;32502:33;32317:225;:::o;32548:178::-;32688:30;32684:1;32676:6;32672:14;32665:54;32548:178;:::o;32732:223::-;32872:34;32868:1;32860:6;32856:14;32849:58;32941:6;32936:2;32928:6;32924:15;32917:31;32732:223;:::o;32961:175::-;33101:27;33097:1;33089:6;33085:14;33078:51;32961:175;:::o;33142:181::-;33282:33;33278:1;33270:6;33266:14;33259:57;33142:181;:::o;33329:231::-;33469:34;33465:1;33457:6;33453:14;33446:58;33538:14;33533:2;33525:6;33521:15;33514:39;33329:231;:::o;33566:243::-;33706:34;33702:1;33694:6;33690:14;33683:58;33775:26;33770:2;33762:6;33758:15;33751:51;33566:243;:::o;33815:229::-;33955:34;33951:1;33943:6;33939:14;33932:58;34024:12;34019:2;34011:6;34007:15;34000:37;33815:229;:::o;34050:228::-;34190:34;34186:1;34178:6;34174:14;34167:58;34259:11;34254:2;34246:6;34242:15;34235:36;34050:228;:::o;34284:229::-;34424:34;34420:1;34412:6;34408:14;34401:58;34493:12;34488:2;34480:6;34476:15;34469:37;34284:229;:::o;34519:182::-;34659:34;34655:1;34647:6;34643:14;34636:58;34519:182;:::o;34707:231::-;34847:34;34843:1;34835:6;34831:14;34824:58;34916:14;34911:2;34903:6;34899:15;34892:39;34707:231;:::o;34944:182::-;35084:34;35080:1;35072:6;35068:14;35061:58;34944:182;:::o;35132:228::-;35272:34;35268:1;35260:6;35256:14;35249:58;35341:11;35336:2;35328:6;35324:15;35317:36;35132:228;:::o;35366:234::-;35506:34;35502:1;35494:6;35490:14;35483:58;35575:17;35570:2;35562:6;35558:15;35551:42;35366:234;:::o;35606:220::-;35746:34;35742:1;35734:6;35730:14;35723:58;35815:3;35810:2;35802:6;35798:15;35791:28;35606:220;:::o;35832:236::-;35972:34;35968:1;35960:6;35956:14;35949:58;36041:19;36036:2;36028:6;36024:15;36017:44;35832:236;:::o;36074:173::-;36214:25;36210:1;36202:6;36198:14;36191:49;36074:173;:::o;36253:122::-;36326:24;36344:5;36326:24;:::i;:::-;36319:5;36316:35;36306:63;;36365:1;36362;36355:12;36306:63;36253:122;:::o;36381:116::-;36451:21;36466:5;36451:21;:::i;:::-;36444:5;36441:32;36431:60;;36487:1;36484;36477:12;36431:60;36381:116;:::o;36503:120::-;36575:23;36592:5;36575:23;:::i;:::-;36568:5;36565:34;36555:62;;36613:1;36610;36603:12;36555:62;36503:120;:::o;36629:122::-;36702:24;36720:5;36702:24;:::i;:::-;36695:5;36692:35;36682:63;;36741:1;36738;36731:12;36682:63;36629:122;:::o

Swarm Source

ipfs://309f11e780516972a6e9b075b630b6a34f2e7e6427b85ef0045b69ba862e9655
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.