ETH Price: $2,666.30 (+9.37%)
Gas: 4 Gwei

Token

My Breathtaking Pixel Bois (BOI)
 

Overview

Max Total Supply

0 BOI

Holders

374

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BOI
0xeef3e150eed3f78790883a87d4764dee039e3450
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:
NFT

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/a5445b0afb8b350417b6e6ab3160554967bc151f/contracts/utils/Counters.sol


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/a5445b0afb8b350417b6e6ab3160554967bc151f/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/a5445b0afb8b350417b6e6ab3160554967bc151f/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/a5445b0afb8b350417b6e6ab3160554967bc151f/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/a5445b0afb8b350417b6e6ab3160554967bc151f/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/a5445b0afb8b350417b6e6ab3160554967bc151f/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/a5445b0afb8b350417b6e6ab3160554967bc151f/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/a5445b0afb8b350417b6e6ab3160554967bc151f/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/a5445b0afb8b350417b6e6ab3160554967bc151f/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/a5445b0afb8b350417b6e6ab3160554967bc151f/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/a5445b0afb8b350417b6e6ab3160554967bc151f/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.5.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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: contracts/pixelbois.sol


pragma solidity ^0.8.0;




contract NFT is ERC721,Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private currentTokenId;
    /// @dev Base token URI used as a prefix by tokenURI().
    string public baseTokenURI;
    uint256 maxNftAmount;
    constructor() ERC721("My Breathtaking Pixel Bois", "BOI") {
      baseTokenURI = "QmdjAPjtUTVGfPKumoUqMnsvDER28hcwB3jMAUgFaiGRQk/";
       maxNftAmount = 888;
    }
    
    function contractURI() public pure returns (string memory) {
       return "QmdzNse3GwYaDBxshS1jnBXAFqX3hepJtBBBQxEutn1Ave";
    }

    function mintFree()
        public
        returns (uint256)
    {
        require(currentTokenId.current() < maxNftAmount);
        require(balanceOf(address(msg.sender)) < 2);
        currentTokenId.increment();
        uint256 newItemId = currentTokenId.current();
        _safeMint(address(msg.sender), newItemId);
        return newItemId;
    }
  
    /// @dev Returns an URI for a given token ID
  function _baseURI() internal view virtual override returns (string memory) {
    return baseTokenURI;
  }

  /// @dev Sets the base token URI prefix.
  function setBaseTokenURI(string memory _baseTokenURI) public onlyOwner {
    baseTokenURI = _baseTokenURI;
  }

  function changeMaxMint(uint256 _maxAmount)public onlyOwner {
    maxNftAmount = _maxAmount;
  }

  function totalMinted() public view returns (uint) {
        return currentTokenId.current();
    }

}

Contract Security Audit

Contract ABI

[{"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":[{"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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxAmount","type":"uint256"}],"name":"changeMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","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":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","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":"totalMinted","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"}]

60806040523480156200001157600080fd5b506040518060400160405280601a81526020017f4d792042726561746874616b696e6720506978656c20426f69730000000000008152506040518060400160405280600381526020017f424f490000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001e1565b508060019080519060200190620000af929190620001e1565b505050620000d2620000c66200011360201b60201c565b6200011b60201b60201c565b6040518060600160405280602f815260200162003380602f91396008908051906020019062000103929190620001e1565b50610378600981905550620002f6565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001ef9062000291565b90600052602060002090601f0160209004810192826200021357600085556200025f565b82601f106200022e57805160ff19168380011785556200025f565b828001600101855582156200025f579182015b828111156200025e57825182559160200191906001019062000241565b5b5090506200026e919062000272565b5090565b5b808211156200028d57600081600090555060010162000273565b5090565b60006002820490506001821680620002aa57607f821691505b60208210811415620002c157620002c0620002c7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61307a80620003066000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638ab53447116100b8578063b88d4fde1161007c578063b88d4fde1461034f578063c87b56dd1461036b578063d547cfb71461039b578063e8a3d485146103b9578063e985e9c5146103d7578063f2fde38b1461040757610142565b80638ab53447146102bb5780638da5cb5b146102d957806395d89b41146102f7578063a22cb46514610315578063a2309ff81461033157610142565b806323b872dd1161010a57806323b872dd146101fd57806330176e131461021957806342842e0e146102355780636352211e1461025157806370a0823114610281578063715018a6146102b157610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806320c63e3b146101e1575b600080fd5b610161600480360381019061015c9190612087565b610423565b60405161016e91906124e2565b60405180910390f35b61017f610505565b60405161018c91906124fd565b60405180910390f35b6101af60048036038101906101aa919061212a565b610597565b6040516101bc919061247b565b60405180910390f35b6101df60048036038101906101da9190612047565b61061c565b005b6101fb60048036038101906101f6919061212a565b610734565b005b61021760048036038101906102129190611f31565b6107ba565b005b610233600480360381019061022e91906120e1565b61081a565b005b61024f600480360381019061024a9190611f31565b6108b0565b005b61026b6004803603810190610266919061212a565b6108d0565b604051610278919061247b565b60405180910390f35b61029b60048036038101906102969190611ec4565b610982565b6040516102a8919061271f565b60405180910390f35b6102b9610a3a565b005b6102c3610ac2565b6040516102d0919061271f565b60405180910390f35b6102e1610b19565b6040516102ee919061247b565b60405180910390f35b6102ff610b43565b60405161030c91906124fd565b60405180910390f35b61032f600480360381019061032a9190612007565b610bd5565b005b610339610beb565b604051610346919061271f565b60405180910390f35b61036960048036038101906103649190611f84565b610bfc565b005b6103856004803603810190610380919061212a565b610c5e565b60405161039291906124fd565b60405180910390f35b6103a3610d05565b6040516103b091906124fd565b60405180910390f35b6103c1610d93565b6040516103ce91906124fd565b60405180910390f35b6103f160048036038101906103ec9190611ef1565b610db3565b6040516103fe91906124e2565b60405180910390f35b610421600480360381019061041c9190611ec4565b610e47565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104ee57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104fe57506104fd82610f3f565b5b9050919050565b60606000805461051490612975565b80601f016020809104026020016040519081016040528092919081815260200182805461054090612975565b801561058d5780601f106105625761010080835404028352916020019161058d565b820191906000526020600020905b81548152906001019060200180831161057057829003601f168201915b5050505050905090565b60006105a282610fa9565b6105e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d89061267f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610627826108d0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068f906126df565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106b7611015565b73ffffffffffffffffffffffffffffffffffffffff1614806106e657506106e5816106e0611015565b610db3565b5b610725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071c906125ff565b60405180910390fd5b61072f838361101d565b505050565b61073c611015565b73ffffffffffffffffffffffffffffffffffffffff1661075a610b19565b73ffffffffffffffffffffffffffffffffffffffff16146107b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a79061269f565b60405180910390fd5b8060098190555050565b6107cb6107c5611015565b826110d6565b61080a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610801906126ff565b60405180910390fd5b6108158383836111b4565b505050565b610822611015565b73ffffffffffffffffffffffffffffffffffffffff16610840610b19565b73ffffffffffffffffffffffffffffffffffffffff1614610896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088d9061269f565b60405180910390fd5b80600890805190602001906108ac929190611cd8565b5050565b6108cb83838360405180602001604052806000815250610bfc565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109709061263f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156109f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ea9061261f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a42611015565b73ffffffffffffffffffffffffffffffffffffffff16610a60610b19565b73ffffffffffffffffffffffffffffffffffffffff1614610ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aad9061269f565b60405180910390fd5b610ac0600061141b565b565b6000600954610ad160076114e1565b10610adb57600080fd5b6002610ae633610982565b10610af057600080fd5b610afa60076114ef565b6000610b0660076114e1565b9050610b123382611505565b8091505090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610b5290612975565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7e90612975565b8015610bcb5780601f10610ba057610100808354040283529160200191610bcb565b820191906000526020600020905b815481529060010190602001808311610bae57829003601f168201915b5050505050905090565b610be7610be0611015565b8383611523565b5050565b6000610bf760076114e1565b905090565b610c0d610c07611015565b836110d6565b610c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c43906126ff565b60405180910390fd5b610c5884848484611690565b50505050565b6060610c6982610fa9565b610ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9f906126bf565b60405180910390fd5b6000610cb26116ec565b90506000815111610cd25760405180602001604052806000815250610cfd565b80610cdc8461177e565b604051602001610ced929190612457565b6040516020818303038152906040525b915050919050565b60088054610d1290612975565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3e90612975565b8015610d8b5780601f10610d6057610100808354040283529160200191610d8b565b820191906000526020600020905b815481529060010190602001808311610d6e57829003601f168201915b505050505081565b60606040518060600160405280602e8152602001613017602e9139905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e4f611015565b73ffffffffffffffffffffffffffffffffffffffff16610e6d610b19565b73ffffffffffffffffffffffffffffffffffffffff1614610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba9061269f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a9061253f565b60405180910390fd5b610f3c8161141b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611090836108d0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006110e182610fa9565b611120576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611117906125df565b60405180910390fd5b600061112b836108d0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061119a57508373ffffffffffffffffffffffffffffffffffffffff1661118284610597565b73ffffffffffffffffffffffffffffffffffffffff16145b806111ab57506111aa8185610db3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166111d4826108d0565b73ffffffffffffffffffffffffffffffffffffffff161461122a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112219061255f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561129a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112919061259f565b60405180910390fd5b6112a58383836118df565b6112b060008261101d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611300919061288b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113579190612804565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114168383836118e4565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61151f8282604051806020016040528060008152506118e9565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611592576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611589906125bf565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161168391906124e2565b60405180910390a3505050565b61169b8484846111b4565b6116a784848484611944565b6116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd9061251f565b60405180910390fd5b50505050565b6060600880546116fb90612975565b80601f016020809104026020016040519081016040528092919081815260200182805461172790612975565b80156117745780601f1061174957610100808354040283529160200191611774565b820191906000526020600020905b81548152906001019060200180831161175757829003601f168201915b5050505050905090565b606060008214156117c6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506118da565b600082905060005b600082146117f85780806117e1906129d8565b915050600a826117f1919061285a565b91506117ce565b60008167ffffffffffffffff81111561181457611813612b0e565b5b6040519080825280601f01601f1916602001820160405280156118465781602001600182028036833780820191505090505b5090505b600085146118d35760018261185f919061288b565b9150600a8561186e9190612a21565b603061187a9190612804565b60f81b8183815181106118905761188f612adf565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856118cc919061285a565b945061184a565b8093505050505b919050565b505050565b505050565b6118f38383611adb565b6119006000848484611944565b61193f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119369061251f565b60405180910390fd5b505050565b60006119658473ffffffffffffffffffffffffffffffffffffffff16611cb5565b15611ace578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261198e611015565b8786866040518563ffffffff1660e01b81526004016119b09493929190612496565b602060405180830381600087803b1580156119ca57600080fd5b505af19250505080156119fb57506040513d601f19601f820116820180604052508101906119f891906120b4565b60015b611a7e573d8060008114611a2b576040519150601f19603f3d011682016040523d82523d6000602084013e611a30565b606091505b50600081511415611a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6d9061251f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ad3565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b429061265f565b60405180910390fd5b611b5481610fa9565b15611b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8b9061257f565b60405180910390fd5b611ba0600083836118df565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bf09190612804565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cb1600083836118e4565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054611ce490612975565b90600052602060002090601f016020900481019282611d065760008555611d4d565b82601f10611d1f57805160ff1916838001178555611d4d565b82800160010185558215611d4d579182015b82811115611d4c578251825591602001919060010190611d31565b5b509050611d5a9190611d5e565b5090565b5b80821115611d77576000816000905550600101611d5f565b5090565b6000611d8e611d898461275f565b61273a565b905082815260208101848484011115611daa57611da9612b42565b5b611db5848285612933565b509392505050565b6000611dd0611dcb84612790565b61273a565b905082815260208101848484011115611dec57611deb612b42565b5b611df7848285612933565b509392505050565b600081359050611e0e81612fba565b92915050565b600081359050611e2381612fd1565b92915050565b600081359050611e3881612fe8565b92915050565b600081519050611e4d81612fe8565b92915050565b600082601f830112611e6857611e67612b3d565b5b8135611e78848260208601611d7b565b91505092915050565b600082601f830112611e9657611e95612b3d565b5b8135611ea6848260208601611dbd565b91505092915050565b600081359050611ebe81612fff565b92915050565b600060208284031215611eda57611ed9612b4c565b5b6000611ee884828501611dff565b91505092915050565b60008060408385031215611f0857611f07612b4c565b5b6000611f1685828601611dff565b9250506020611f2785828601611dff565b9150509250929050565b600080600060608486031215611f4a57611f49612b4c565b5b6000611f5886828701611dff565b9350506020611f6986828701611dff565b9250506040611f7a86828701611eaf565b9150509250925092565b60008060008060808587031215611f9e57611f9d612b4c565b5b6000611fac87828801611dff565b9450506020611fbd87828801611dff565b9350506040611fce87828801611eaf565b925050606085013567ffffffffffffffff811115611fef57611fee612b47565b5b611ffb87828801611e53565b91505092959194509250565b6000806040838503121561201e5761201d612b4c565b5b600061202c85828601611dff565b925050602061203d85828601611e14565b9150509250929050565b6000806040838503121561205e5761205d612b4c565b5b600061206c85828601611dff565b925050602061207d85828601611eaf565b9150509250929050565b60006020828403121561209d5761209c612b4c565b5b60006120ab84828501611e29565b91505092915050565b6000602082840312156120ca576120c9612b4c565b5b60006120d884828501611e3e565b91505092915050565b6000602082840312156120f7576120f6612b4c565b5b600082013567ffffffffffffffff81111561211557612114612b47565b5b61212184828501611e81565b91505092915050565b6000602082840312156121405761213f612b4c565b5b600061214e84828501611eaf565b91505092915050565b612160816128bf565b82525050565b61216f816128d1565b82525050565b6000612180826127c1565b61218a81856127d7565b935061219a818560208601612942565b6121a381612b51565b840191505092915050565b60006121b9826127cc565b6121c381856127e8565b93506121d3818560208601612942565b6121dc81612b51565b840191505092915050565b60006121f2826127cc565b6121fc81856127f9565b935061220c818560208601612942565b80840191505092915050565b60006122256032836127e8565b915061223082612b62565b604082019050919050565b60006122486026836127e8565b915061225382612bb1565b604082019050919050565b600061226b6025836127e8565b915061227682612c00565b604082019050919050565b600061228e601c836127e8565b915061229982612c4f565b602082019050919050565b60006122b16024836127e8565b91506122bc82612c78565b604082019050919050565b60006122d46019836127e8565b91506122df82612cc7565b602082019050919050565b60006122f7602c836127e8565b915061230282612cf0565b604082019050919050565b600061231a6038836127e8565b915061232582612d3f565b604082019050919050565b600061233d602a836127e8565b915061234882612d8e565b604082019050919050565b60006123606029836127e8565b915061236b82612ddd565b604082019050919050565b60006123836020836127e8565b915061238e82612e2c565b602082019050919050565b60006123a6602c836127e8565b91506123b182612e55565b604082019050919050565b60006123c96020836127e8565b91506123d482612ea4565b602082019050919050565b60006123ec602f836127e8565b91506123f782612ecd565b604082019050919050565b600061240f6021836127e8565b915061241a82612f1c565b604082019050919050565b60006124326031836127e8565b915061243d82612f6b565b604082019050919050565b61245181612929565b82525050565b600061246382856121e7565b915061246f82846121e7565b91508190509392505050565b60006020820190506124906000830184612157565b92915050565b60006080820190506124ab6000830187612157565b6124b86020830186612157565b6124c56040830185612448565b81810360608301526124d78184612175565b905095945050505050565b60006020820190506124f76000830184612166565b92915050565b6000602082019050818103600083015261251781846121ae565b905092915050565b6000602082019050818103600083015261253881612218565b9050919050565b600060208201905081810360008301526125588161223b565b9050919050565b600060208201905081810360008301526125788161225e565b9050919050565b6000602082019050818103600083015261259881612281565b9050919050565b600060208201905081810360008301526125b8816122a4565b9050919050565b600060208201905081810360008301526125d8816122c7565b9050919050565b600060208201905081810360008301526125f8816122ea565b9050919050565b600060208201905081810360008301526126188161230d565b9050919050565b6000602082019050818103600083015261263881612330565b9050919050565b6000602082019050818103600083015261265881612353565b9050919050565b6000602082019050818103600083015261267881612376565b9050919050565b6000602082019050818103600083015261269881612399565b9050919050565b600060208201905081810360008301526126b8816123bc565b9050919050565b600060208201905081810360008301526126d8816123df565b9050919050565b600060208201905081810360008301526126f881612402565b9050919050565b6000602082019050818103600083015261271881612425565b9050919050565b60006020820190506127346000830184612448565b92915050565b6000612744612755565b905061275082826129a7565b919050565b6000604051905090565b600067ffffffffffffffff82111561277a57612779612b0e565b5b61278382612b51565b9050602081019050919050565b600067ffffffffffffffff8211156127ab576127aa612b0e565b5b6127b482612b51565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061280f82612929565b915061281a83612929565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561284f5761284e612a52565b5b828201905092915050565b600061286582612929565b915061287083612929565b9250826128805761287f612a81565b5b828204905092915050565b600061289682612929565b91506128a183612929565b9250828210156128b4576128b3612a52565b5b828203905092915050565b60006128ca82612909565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612960578082015181840152602081019050612945565b8381111561296f576000848401525b50505050565b6000600282049050600182168061298d57607f821691505b602082108114156129a1576129a0612ab0565b5b50919050565b6129b082612b51565b810181811067ffffffffffffffff821117156129cf576129ce612b0e565b5b80604052505050565b60006129e382612929565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a1657612a15612a52565b5b600182019050919050565b6000612a2c82612929565b9150612a3783612929565b925082612a4757612a46612a81565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b612fc3816128bf565b8114612fce57600080fd5b50565b612fda816128d1565b8114612fe557600080fd5b50565b612ff1816128dd565b8114612ffc57600080fd5b50565b61300881612929565b811461301357600080fd5b5056fe516d647a4e73653347775961444278736853316a6e425841467158336865704a7442424251784575746e31417665a2646970667358221220b8fcb9769944ddfa092a397452a6c6daa97f00d18c4359521e96e32522374f1964736f6c63430008070033516d646a41506a745554564766504b756d6f55714d6e7376444552323868637742336a4d4155674661694752516b2f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c80638ab53447116100b8578063b88d4fde1161007c578063b88d4fde1461034f578063c87b56dd1461036b578063d547cfb71461039b578063e8a3d485146103b9578063e985e9c5146103d7578063f2fde38b1461040757610142565b80638ab53447146102bb5780638da5cb5b146102d957806395d89b41146102f7578063a22cb46514610315578063a2309ff81461033157610142565b806323b872dd1161010a57806323b872dd146101fd57806330176e131461021957806342842e0e146102355780636352211e1461025157806370a0823114610281578063715018a6146102b157610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806320c63e3b146101e1575b600080fd5b610161600480360381019061015c9190612087565b610423565b60405161016e91906124e2565b60405180910390f35b61017f610505565b60405161018c91906124fd565b60405180910390f35b6101af60048036038101906101aa919061212a565b610597565b6040516101bc919061247b565b60405180910390f35b6101df60048036038101906101da9190612047565b61061c565b005b6101fb60048036038101906101f6919061212a565b610734565b005b61021760048036038101906102129190611f31565b6107ba565b005b610233600480360381019061022e91906120e1565b61081a565b005b61024f600480360381019061024a9190611f31565b6108b0565b005b61026b6004803603810190610266919061212a565b6108d0565b604051610278919061247b565b60405180910390f35b61029b60048036038101906102969190611ec4565b610982565b6040516102a8919061271f565b60405180910390f35b6102b9610a3a565b005b6102c3610ac2565b6040516102d0919061271f565b60405180910390f35b6102e1610b19565b6040516102ee919061247b565b60405180910390f35b6102ff610b43565b60405161030c91906124fd565b60405180910390f35b61032f600480360381019061032a9190612007565b610bd5565b005b610339610beb565b604051610346919061271f565b60405180910390f35b61036960048036038101906103649190611f84565b610bfc565b005b6103856004803603810190610380919061212a565b610c5e565b60405161039291906124fd565b60405180910390f35b6103a3610d05565b6040516103b091906124fd565b60405180910390f35b6103c1610d93565b6040516103ce91906124fd565b60405180910390f35b6103f160048036038101906103ec9190611ef1565b610db3565b6040516103fe91906124e2565b60405180910390f35b610421600480360381019061041c9190611ec4565b610e47565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104ee57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104fe57506104fd82610f3f565b5b9050919050565b60606000805461051490612975565b80601f016020809104026020016040519081016040528092919081815260200182805461054090612975565b801561058d5780601f106105625761010080835404028352916020019161058d565b820191906000526020600020905b81548152906001019060200180831161057057829003601f168201915b5050505050905090565b60006105a282610fa9565b6105e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d89061267f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610627826108d0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068f906126df565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106b7611015565b73ffffffffffffffffffffffffffffffffffffffff1614806106e657506106e5816106e0611015565b610db3565b5b610725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071c906125ff565b60405180910390fd5b61072f838361101d565b505050565b61073c611015565b73ffffffffffffffffffffffffffffffffffffffff1661075a610b19565b73ffffffffffffffffffffffffffffffffffffffff16146107b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a79061269f565b60405180910390fd5b8060098190555050565b6107cb6107c5611015565b826110d6565b61080a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610801906126ff565b60405180910390fd5b6108158383836111b4565b505050565b610822611015565b73ffffffffffffffffffffffffffffffffffffffff16610840610b19565b73ffffffffffffffffffffffffffffffffffffffff1614610896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088d9061269f565b60405180910390fd5b80600890805190602001906108ac929190611cd8565b5050565b6108cb83838360405180602001604052806000815250610bfc565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610979576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109709061263f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156109f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ea9061261f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a42611015565b73ffffffffffffffffffffffffffffffffffffffff16610a60610b19565b73ffffffffffffffffffffffffffffffffffffffff1614610ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aad9061269f565b60405180910390fd5b610ac0600061141b565b565b6000600954610ad160076114e1565b10610adb57600080fd5b6002610ae633610982565b10610af057600080fd5b610afa60076114ef565b6000610b0660076114e1565b9050610b123382611505565b8091505090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610b5290612975565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7e90612975565b8015610bcb5780601f10610ba057610100808354040283529160200191610bcb565b820191906000526020600020905b815481529060010190602001808311610bae57829003601f168201915b5050505050905090565b610be7610be0611015565b8383611523565b5050565b6000610bf760076114e1565b905090565b610c0d610c07611015565b836110d6565b610c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c43906126ff565b60405180910390fd5b610c5884848484611690565b50505050565b6060610c6982610fa9565b610ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9f906126bf565b60405180910390fd5b6000610cb26116ec565b90506000815111610cd25760405180602001604052806000815250610cfd565b80610cdc8461177e565b604051602001610ced929190612457565b6040516020818303038152906040525b915050919050565b60088054610d1290612975565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3e90612975565b8015610d8b5780601f10610d6057610100808354040283529160200191610d8b565b820191906000526020600020905b815481529060010190602001808311610d6e57829003601f168201915b505050505081565b60606040518060600160405280602e8152602001613017602e9139905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e4f611015565b73ffffffffffffffffffffffffffffffffffffffff16610e6d610b19565b73ffffffffffffffffffffffffffffffffffffffff1614610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba9061269f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a9061253f565b60405180910390fd5b610f3c8161141b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611090836108d0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006110e182610fa9565b611120576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611117906125df565b60405180910390fd5b600061112b836108d0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061119a57508373ffffffffffffffffffffffffffffffffffffffff1661118284610597565b73ffffffffffffffffffffffffffffffffffffffff16145b806111ab57506111aa8185610db3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166111d4826108d0565b73ffffffffffffffffffffffffffffffffffffffff161461122a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112219061255f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561129a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112919061259f565b60405180910390fd5b6112a58383836118df565b6112b060008261101d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611300919061288b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113579190612804565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114168383836118e4565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61151f8282604051806020016040528060008152506118e9565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611592576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611589906125bf565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161168391906124e2565b60405180910390a3505050565b61169b8484846111b4565b6116a784848484611944565b6116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd9061251f565b60405180910390fd5b50505050565b6060600880546116fb90612975565b80601f016020809104026020016040519081016040528092919081815260200182805461172790612975565b80156117745780601f1061174957610100808354040283529160200191611774565b820191906000526020600020905b81548152906001019060200180831161175757829003601f168201915b5050505050905090565b606060008214156117c6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506118da565b600082905060005b600082146117f85780806117e1906129d8565b915050600a826117f1919061285a565b91506117ce565b60008167ffffffffffffffff81111561181457611813612b0e565b5b6040519080825280601f01601f1916602001820160405280156118465781602001600182028036833780820191505090505b5090505b600085146118d35760018261185f919061288b565b9150600a8561186e9190612a21565b603061187a9190612804565b60f81b8183815181106118905761188f612adf565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856118cc919061285a565b945061184a565b8093505050505b919050565b505050565b505050565b6118f38383611adb565b6119006000848484611944565b61193f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119369061251f565b60405180910390fd5b505050565b60006119658473ffffffffffffffffffffffffffffffffffffffff16611cb5565b15611ace578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261198e611015565b8786866040518563ffffffff1660e01b81526004016119b09493929190612496565b602060405180830381600087803b1580156119ca57600080fd5b505af19250505080156119fb57506040513d601f19601f820116820180604052508101906119f891906120b4565b60015b611a7e573d8060008114611a2b576040519150601f19603f3d011682016040523d82523d6000602084013e611a30565b606091505b50600081511415611a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6d9061251f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ad3565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b429061265f565b60405180910390fd5b611b5481610fa9565b15611b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8b9061257f565b60405180910390fd5b611ba0600083836118df565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bf09190612804565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cb1600083836118e4565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054611ce490612975565b90600052602060002090601f016020900481019282611d065760008555611d4d565b82601f10611d1f57805160ff1916838001178555611d4d565b82800160010185558215611d4d579182015b82811115611d4c578251825591602001919060010190611d31565b5b509050611d5a9190611d5e565b5090565b5b80821115611d77576000816000905550600101611d5f565b5090565b6000611d8e611d898461275f565b61273a565b905082815260208101848484011115611daa57611da9612b42565b5b611db5848285612933565b509392505050565b6000611dd0611dcb84612790565b61273a565b905082815260208101848484011115611dec57611deb612b42565b5b611df7848285612933565b509392505050565b600081359050611e0e81612fba565b92915050565b600081359050611e2381612fd1565b92915050565b600081359050611e3881612fe8565b92915050565b600081519050611e4d81612fe8565b92915050565b600082601f830112611e6857611e67612b3d565b5b8135611e78848260208601611d7b565b91505092915050565b600082601f830112611e9657611e95612b3d565b5b8135611ea6848260208601611dbd565b91505092915050565b600081359050611ebe81612fff565b92915050565b600060208284031215611eda57611ed9612b4c565b5b6000611ee884828501611dff565b91505092915050565b60008060408385031215611f0857611f07612b4c565b5b6000611f1685828601611dff565b9250506020611f2785828601611dff565b9150509250929050565b600080600060608486031215611f4a57611f49612b4c565b5b6000611f5886828701611dff565b9350506020611f6986828701611dff565b9250506040611f7a86828701611eaf565b9150509250925092565b60008060008060808587031215611f9e57611f9d612b4c565b5b6000611fac87828801611dff565b9450506020611fbd87828801611dff565b9350506040611fce87828801611eaf565b925050606085013567ffffffffffffffff811115611fef57611fee612b47565b5b611ffb87828801611e53565b91505092959194509250565b6000806040838503121561201e5761201d612b4c565b5b600061202c85828601611dff565b925050602061203d85828601611e14565b9150509250929050565b6000806040838503121561205e5761205d612b4c565b5b600061206c85828601611dff565b925050602061207d85828601611eaf565b9150509250929050565b60006020828403121561209d5761209c612b4c565b5b60006120ab84828501611e29565b91505092915050565b6000602082840312156120ca576120c9612b4c565b5b60006120d884828501611e3e565b91505092915050565b6000602082840312156120f7576120f6612b4c565b5b600082013567ffffffffffffffff81111561211557612114612b47565b5b61212184828501611e81565b91505092915050565b6000602082840312156121405761213f612b4c565b5b600061214e84828501611eaf565b91505092915050565b612160816128bf565b82525050565b61216f816128d1565b82525050565b6000612180826127c1565b61218a81856127d7565b935061219a818560208601612942565b6121a381612b51565b840191505092915050565b60006121b9826127cc565b6121c381856127e8565b93506121d3818560208601612942565b6121dc81612b51565b840191505092915050565b60006121f2826127cc565b6121fc81856127f9565b935061220c818560208601612942565b80840191505092915050565b60006122256032836127e8565b915061223082612b62565b604082019050919050565b60006122486026836127e8565b915061225382612bb1565b604082019050919050565b600061226b6025836127e8565b915061227682612c00565b604082019050919050565b600061228e601c836127e8565b915061229982612c4f565b602082019050919050565b60006122b16024836127e8565b91506122bc82612c78565b604082019050919050565b60006122d46019836127e8565b91506122df82612cc7565b602082019050919050565b60006122f7602c836127e8565b915061230282612cf0565b604082019050919050565b600061231a6038836127e8565b915061232582612d3f565b604082019050919050565b600061233d602a836127e8565b915061234882612d8e565b604082019050919050565b60006123606029836127e8565b915061236b82612ddd565b604082019050919050565b60006123836020836127e8565b915061238e82612e2c565b602082019050919050565b60006123a6602c836127e8565b91506123b182612e55565b604082019050919050565b60006123c96020836127e8565b91506123d482612ea4565b602082019050919050565b60006123ec602f836127e8565b91506123f782612ecd565b604082019050919050565b600061240f6021836127e8565b915061241a82612f1c565b604082019050919050565b60006124326031836127e8565b915061243d82612f6b565b604082019050919050565b61245181612929565b82525050565b600061246382856121e7565b915061246f82846121e7565b91508190509392505050565b60006020820190506124906000830184612157565b92915050565b60006080820190506124ab6000830187612157565b6124b86020830186612157565b6124c56040830185612448565b81810360608301526124d78184612175565b905095945050505050565b60006020820190506124f76000830184612166565b92915050565b6000602082019050818103600083015261251781846121ae565b905092915050565b6000602082019050818103600083015261253881612218565b9050919050565b600060208201905081810360008301526125588161223b565b9050919050565b600060208201905081810360008301526125788161225e565b9050919050565b6000602082019050818103600083015261259881612281565b9050919050565b600060208201905081810360008301526125b8816122a4565b9050919050565b600060208201905081810360008301526125d8816122c7565b9050919050565b600060208201905081810360008301526125f8816122ea565b9050919050565b600060208201905081810360008301526126188161230d565b9050919050565b6000602082019050818103600083015261263881612330565b9050919050565b6000602082019050818103600083015261265881612353565b9050919050565b6000602082019050818103600083015261267881612376565b9050919050565b6000602082019050818103600083015261269881612399565b9050919050565b600060208201905081810360008301526126b8816123bc565b9050919050565b600060208201905081810360008301526126d8816123df565b9050919050565b600060208201905081810360008301526126f881612402565b9050919050565b6000602082019050818103600083015261271881612425565b9050919050565b60006020820190506127346000830184612448565b92915050565b6000612744612755565b905061275082826129a7565b919050565b6000604051905090565b600067ffffffffffffffff82111561277a57612779612b0e565b5b61278382612b51565b9050602081019050919050565b600067ffffffffffffffff8211156127ab576127aa612b0e565b5b6127b482612b51565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061280f82612929565b915061281a83612929565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561284f5761284e612a52565b5b828201905092915050565b600061286582612929565b915061287083612929565b9250826128805761287f612a81565b5b828204905092915050565b600061289682612929565b91506128a183612929565b9250828210156128b4576128b3612a52565b5b828203905092915050565b60006128ca82612909565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612960578082015181840152602081019050612945565b8381111561296f576000848401525b50505050565b6000600282049050600182168061298d57607f821691505b602082108114156129a1576129a0612ab0565b5b50919050565b6129b082612b51565b810181811067ffffffffffffffff821117156129cf576129ce612b0e565b5b80604052505050565b60006129e382612929565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a1657612a15612a52565b5b600182019050919050565b6000612a2c82612929565b9150612a3783612929565b925082612a4757612a46612a81565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b612fc3816128bf565b8114612fce57600080fd5b50565b612fda816128d1565b8114612fe557600080fd5b50565b612ff1816128dd565b8114612ffc57600080fd5b50565b61300881612929565b811461301357600080fd5b5056fe516d647a4e73653347775961444278736853316a6e425841467158336865704a7442424251784575746e31417665a2646970667358221220b8fcb9769944ddfa092a397452a6c6daa97f00d18c4359521e96e32522374f1964736f6c63430008070033

Deployed Bytecode Sourcemap

39716:1467:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26531:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27476:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29035:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28558:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40975:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29785:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40857:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30195:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27170:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26900:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6543:103;;;:::i;:::-;;40282:360;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5892:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27645:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29328:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41078:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30451:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27820:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39903:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40142:132;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29554:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6801:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26531:305;26633:4;26685:25;26670:40;;;:11;:40;;;;:105;;;;26742:33;26727:48;;;:11;:48;;;;26670:105;:158;;;;26792:36;26816:11;26792:23;:36::i;:::-;26670:158;26650:178;;26531:305;;;:::o;27476:100::-;27530:13;27563:5;27556:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27476:100;:::o;29035:221::-;29111:7;29139:16;29147:7;29139;:16::i;:::-;29131:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29224:15;:24;29240:7;29224:24;;;;;;;;;;;;;;;;;;;;;29217:31;;29035:221;;;:::o;28558:411::-;28639:13;28655:23;28670:7;28655:14;:23::i;:::-;28639:39;;28703:5;28697:11;;:2;:11;;;;28689:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28797:5;28781:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28806:37;28823:5;28830:12;:10;:12::i;:::-;28806:16;:37::i;:::-;28781:62;28759:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28940:21;28949:2;28953:7;28940:8;:21::i;:::-;28628:341;28558:411;;:::o;40975:97::-;6123:12;:10;:12::i;:::-;6112:23;;:7;:5;:7::i;:::-;:23;;;6104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41056:10:::1;41041:12;:25;;;;40975:97:::0;:::o;29785:339::-;29980:41;29999:12;:10;:12::i;:::-;30013:7;29980:18;:41::i;:::-;29972:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30088:28;30098:4;30104:2;30108:7;30088:9;:28::i;:::-;29785:339;;;:::o;40857:112::-;6123:12;:10;:12::i;:::-;6112:23;;:7;:5;:7::i;:::-;:23;;;6104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40950:13:::1;40935:12;:28;;;;;;;;;;;;:::i;:::-;;40857:112:::0;:::o;30195:185::-;30333:39;30350:4;30356:2;30360:7;30333:39;;;;;;;;;;;;:16;:39::i;:::-;30195:185;;;:::o;27170:239::-;27242:7;27262:13;27278:7;:16;27286:7;27278:16;;;;;;;;;;;;;;;;;;;;;27262:32;;27330:1;27313:19;;:5;:19;;;;27305:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27396:5;27389:12;;;27170:239;;;:::o;26900:208::-;26972:7;27017:1;27000:19;;:5;:19;;;;26992:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27084:9;:16;27094:5;27084:16;;;;;;;;;;;;;;;;27077:23;;26900:208;;;:::o;6543:103::-;6123:12;:10;:12::i;:::-;6112:23;;:7;:5;:7::i;:::-;:23;;;6104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6608:30:::1;6635:1;6608:18;:30::i;:::-;6543:103::o:0;40282:360::-;40336:7;40396:12;;40369:24;:14;:22;:24::i;:::-;:39;40361:48;;;;;;40461:1;40428:30;40446:10;40428:9;:30::i;:::-;:34;40420:43;;;;;;40474:26;:14;:24;:26::i;:::-;40511:17;40531:24;:14;:22;:24::i;:::-;40511:44;;40566:41;40584:10;40597:9;40566;:41::i;:::-;40625:9;40618:16;;;40282:360;:::o;5892:87::-;5938:7;5965:6;;;;;;;;;;;5958:13;;5892:87;:::o;27645:104::-;27701:13;27734:7;27727:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27645:104;:::o;29328:155::-;29423:52;29442:12;:10;:12::i;:::-;29456:8;29466;29423:18;:52::i;:::-;29328:155;;:::o;41078:100::-;41122:4;41146:24;:14;:22;:24::i;:::-;41139:31;;41078:100;:::o;30451:328::-;30626:41;30645:12;:10;:12::i;:::-;30659:7;30626:18;:41::i;:::-;30618:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30732:39;30746:4;30752:2;30756:7;30765:5;30732:13;:39::i;:::-;30451:328;;;;:::o;27820:334::-;27893:13;27927:16;27935:7;27927;:16::i;:::-;27919:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28008:21;28032:10;:8;:10::i;:::-;28008:34;;28084:1;28066:7;28060:21;:25;:86;;;;;;;;;;;;;;;;;28112:7;28121:18;:7;:16;:18::i;:::-;28095:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28060:86;28053:93;;;27820:334;;;:::o;39903:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40142:132::-;40186:13;40211:55;;;;;;;;;;;;;;;;;;;40142:132;:::o;29554:164::-;29651:4;29675:18;:25;29694:5;29675:25;;;;;;;;;;;;;;;:35;29701:8;29675:35;;;;;;;;;;;;;;;;;;;;;;;;;29668:42;;29554:164;;;;:::o;6801:201::-;6123:12;:10;:12::i;:::-;6112:23;;:7;:5;:7::i;:::-;:23;;;6104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6910:1:::1;6890:22;;:8;:22;;;;6882:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6966:28;6985:8;6966:18;:28::i;:::-;6801:201:::0;:::o;19024:157::-;19109:4;19148:25;19133:40;;;:11;:40;;;;19126:47;;19024:157;;;:::o;32289:127::-;32354:4;32406:1;32378:30;;:7;:16;32386:7;32378:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32371:37;;32289:127;;;:::o;4529:98::-;4582:7;4609:10;4602:17;;4529:98;:::o;36435:174::-;36537:2;36510:15;:24;36526:7;36510:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36593:7;36589:2;36555:46;;36564:23;36579:7;36564:14;:23::i;:::-;36555:46;;;;;;;;;;;;36435:174;;:::o;32583:348::-;32676:4;32701:16;32709:7;32701;:16::i;:::-;32693:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32777:13;32793:23;32808:7;32793:14;:23::i;:::-;32777:39;;32846:5;32835:16;;:7;:16;;;:51;;;;32879:7;32855:31;;:20;32867:7;32855:11;:20::i;:::-;:31;;;32835:51;:87;;;;32890:32;32907:5;32914:7;32890:16;:32::i;:::-;32835:87;32827:96;;;32583:348;;;;:::o;35692:625::-;35851:4;35824:31;;:23;35839:7;35824:14;:23::i;:::-;:31;;;35816:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35930:1;35916:16;;:2;:16;;;;35908:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35986:39;36007:4;36013:2;36017:7;35986:20;:39::i;:::-;36090:29;36107:1;36111:7;36090:8;:29::i;:::-;36151:1;36132:9;:15;36142:4;36132:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36180:1;36163:9;:13;36173:2;36163:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36211:2;36192:7;:16;36200:7;36192:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36250:7;36246:2;36231:27;;36240:4;36231:27;;;;;;;;;;;;36271:38;36291:4;36297:2;36301:7;36271:19;:38::i;:::-;35692:625;;;:::o;7162:191::-;7236:16;7255:6;;;;;;;;;;;7236:25;;7281:8;7272:6;;:17;;;;;;;;;;;;;;;;;;7336:8;7305:40;;7326:8;7305:40;;;;;;;;;;;;7225:128;7162:191;:::o;959:114::-;1024:7;1051;:14;;;1044:21;;959:114;;;:::o;1081:127::-;1188:1;1170:7;:14;;;:19;;;;;;;;;;;1081:127;:::o;33273:110::-;33349:26;33359:2;33363:7;33349:26;;;;;;;;;;;;:9;:26::i;:::-;33273:110;;:::o;36751:315::-;36906:8;36897:17;;:5;:17;;;;36889:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36993:8;36955:18;:25;36974:5;36955:25;;;;;;;;;;;;;;;:35;36981:8;36955:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;37039:8;37017:41;;37032:5;37017:41;;;37049:8;37017:41;;;;;;:::i;:::-;;;;;;;;36751:315;;;:::o;31661:::-;31818:28;31828:4;31834:2;31838:7;31818:9;:28::i;:::-;31865:48;31888:4;31894:2;31898:7;31907:5;31865:22;:48::i;:::-;31857:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31661:315;;;;:::o;40700:107::-;40760:13;40789:12;40782:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40700:107;:::o;2004:723::-;2060:13;2290:1;2281:5;:10;2277:53;;;2308:10;;;;;;;;;;;;;;;;;;;;;2277:53;2340:12;2355:5;2340:20;;2371:14;2396:78;2411:1;2403:4;:9;2396:78;;2429:8;;;;;:::i;:::-;;;;2460:2;2452:10;;;;;:::i;:::-;;;2396:78;;;2484:19;2516:6;2506:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2484:39;;2534:154;2550:1;2541:5;:10;2534:154;;2578:1;2568:11;;;;;:::i;:::-;;;2645:2;2637:5;:10;;;;:::i;:::-;2624:2;:24;;;;:::i;:::-;2611:39;;2594:6;2601;2594:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2674:2;2665:11;;;;;:::i;:::-;;;2534:154;;;2712:6;2698:21;;;;;2004:723;;;;:::o;39002:126::-;;;;:::o;39513:125::-;;;;:::o;33610:321::-;33740:18;33746:2;33750:7;33740:5;:18::i;:::-;33791:54;33822:1;33826:2;33830:7;33839:5;33791:22;:54::i;:::-;33769:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;33610:321;;;:::o;37631:799::-;37786:4;37807:15;:2;:13;;;:15::i;:::-;37803:620;;;37859:2;37843:36;;;37880:12;:10;:12::i;:::-;37894:4;37900:7;37909:5;37843:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37839:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38102:1;38085:6;:13;:18;38081:272;;;38128:60;;;;;;;;;;:::i;:::-;;;;;;;;38081:272;38303:6;38297:13;38288:6;38284:2;38280:15;38273:38;37839:529;37976:41;;;37966:51;;;:6;:51;;;;37959:58;;;;;37803:620;38407:4;38400:11;;37631:799;;;;;;;:::o;34267:439::-;34361:1;34347:16;;:2;:16;;;;34339:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34420:16;34428:7;34420;:16::i;:::-;34419:17;34411:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34482:45;34511:1;34515:2;34519:7;34482:20;:45::i;:::-;34557:1;34540:9;:13;34550:2;34540:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34588:2;34569:7;:16;34577:7;34569:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34633:7;34629:2;34608:33;;34625:1;34608:33;;;;;;;;;;;;34654:44;34682:1;34686:2;34690:7;34654:19;:44::i;:::-;34267:439;;:::o;8680:326::-;8740:4;8997:1;8975:7;:19;;;:23;8968:30;;8680:326;;;:::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:118::-;14555:24;14573:5;14555:24;:::i;:::-;14550:3;14543:37;14468:118;;:::o;14592:435::-;14772:3;14794:95;14885:3;14876:6;14794:95;:::i;:::-;14787:102;;14906:95;14997:3;14988:6;14906:95;:::i;:::-;14899:102;;15018:3;15011:10;;14592:435;;;;;:::o;15033:222::-;15126:4;15164:2;15153:9;15149:18;15141:26;;15177:71;15245:1;15234:9;15230:17;15221:6;15177:71;:::i;:::-;15033:222;;;;:::o;15261:640::-;15456:4;15494:3;15483:9;15479:19;15471:27;;15508:71;15576:1;15565:9;15561:17;15552:6;15508:71;:::i;:::-;15589:72;15657:2;15646:9;15642:18;15633:6;15589:72;:::i;:::-;15671;15739:2;15728:9;15724:18;15715:6;15671:72;:::i;:::-;15790:9;15784:4;15780:20;15775:2;15764:9;15760:18;15753:48;15818:76;15889:4;15880:6;15818:76;:::i;:::-;15810:84;;15261:640;;;;;;;:::o;15907:210::-;15994:4;16032:2;16021:9;16017:18;16009:26;;16045:65;16107:1;16096:9;16092:17;16083:6;16045:65;:::i;:::-;15907:210;;;;:::o;16123:313::-;16236:4;16274:2;16263:9;16259:18;16251:26;;16323:9;16317:4;16313:20;16309:1;16298:9;16294:17;16287:47;16351:78;16424:4;16415:6;16351:78;:::i;:::-;16343:86;;16123:313;;;;:::o;16442:419::-;16608:4;16646:2;16635:9;16631:18;16623:26;;16695:9;16689:4;16685:20;16681:1;16670:9;16666:17;16659:47;16723:131;16849:4;16723:131;:::i;:::-;16715:139;;16442:419;;;:::o;16867:::-;17033:4;17071:2;17060:9;17056:18;17048:26;;17120:9;17114:4;17110:20;17106:1;17095:9;17091:17;17084:47;17148:131;17274:4;17148:131;:::i;:::-;17140:139;;16867:419;;;:::o;17292:::-;17458:4;17496:2;17485:9;17481:18;17473:26;;17545:9;17539:4;17535:20;17531:1;17520:9;17516:17;17509:47;17573:131;17699:4;17573:131;:::i;:::-;17565:139;;17292:419;;;:::o;17717:::-;17883:4;17921:2;17910:9;17906:18;17898:26;;17970:9;17964:4;17960:20;17956:1;17945:9;17941:17;17934:47;17998:131;18124:4;17998:131;:::i;:::-;17990:139;;17717:419;;;:::o;18142:::-;18308:4;18346:2;18335:9;18331:18;18323:26;;18395:9;18389:4;18385:20;18381:1;18370:9;18366:17;18359:47;18423:131;18549:4;18423:131;:::i;:::-;18415:139;;18142:419;;;:::o;18567:::-;18733:4;18771:2;18760:9;18756:18;18748:26;;18820:9;18814:4;18810:20;18806:1;18795:9;18791:17;18784:47;18848:131;18974:4;18848:131;:::i;:::-;18840:139;;18567:419;;;:::o;18992:::-;19158:4;19196:2;19185:9;19181:18;19173:26;;19245:9;19239:4;19235:20;19231:1;19220:9;19216:17;19209:47;19273:131;19399:4;19273:131;:::i;:::-;19265:139;;18992:419;;;:::o;19417:::-;19583:4;19621:2;19610:9;19606:18;19598:26;;19670:9;19664:4;19660:20;19656:1;19645:9;19641:17;19634:47;19698:131;19824:4;19698:131;:::i;:::-;19690:139;;19417:419;;;:::o;19842:::-;20008:4;20046:2;20035:9;20031:18;20023:26;;20095:9;20089:4;20085:20;20081:1;20070:9;20066:17;20059:47;20123:131;20249:4;20123:131;:::i;:::-;20115:139;;19842:419;;;:::o;20267:::-;20433:4;20471:2;20460:9;20456:18;20448:26;;20520:9;20514:4;20510:20;20506:1;20495:9;20491:17;20484:47;20548:131;20674:4;20548:131;:::i;:::-;20540:139;;20267:419;;;:::o;20692:::-;20858:4;20896:2;20885:9;20881:18;20873:26;;20945:9;20939:4;20935:20;20931:1;20920:9;20916:17;20909:47;20973:131;21099:4;20973:131;:::i;:::-;20965:139;;20692:419;;;:::o;21117:::-;21283:4;21321:2;21310:9;21306:18;21298:26;;21370:9;21364:4;21360:20;21356:1;21345:9;21341:17;21334:47;21398:131;21524:4;21398:131;:::i;:::-;21390:139;;21117:419;;;:::o;21542:::-;21708:4;21746:2;21735:9;21731:18;21723:26;;21795:9;21789:4;21785:20;21781:1;21770:9;21766:17;21759:47;21823:131;21949:4;21823:131;:::i;:::-;21815:139;;21542:419;;;:::o;21967:::-;22133:4;22171:2;22160:9;22156:18;22148:26;;22220:9;22214:4;22210:20;22206:1;22195:9;22191:17;22184:47;22248:131;22374:4;22248:131;:::i;:::-;22240:139;;21967:419;;;:::o;22392:::-;22558:4;22596:2;22585:9;22581:18;22573:26;;22645:9;22639:4;22635:20;22631:1;22620:9;22616:17;22609:47;22673:131;22799:4;22673:131;:::i;:::-;22665:139;;22392:419;;;:::o;22817:::-;22983:4;23021:2;23010:9;23006:18;22998:26;;23070:9;23064:4;23060:20;23056:1;23045:9;23041:17;23034:47;23098:131;23224:4;23098:131;:::i;:::-;23090:139;;22817:419;;;:::o;23242:222::-;23335:4;23373:2;23362:9;23358:18;23350:26;;23386:71;23454:1;23443:9;23439:17;23430:6;23386:71;:::i;:::-;23242:222;;;;:::o;23470:129::-;23504:6;23531:20;;:::i;:::-;23521:30;;23560:33;23588:4;23580:6;23560:33;:::i;:::-;23470:129;;;:::o;23605:75::-;23638:6;23671:2;23665:9;23655:19;;23605:75;:::o;23686:307::-;23747:4;23837:18;23829:6;23826:30;23823:56;;;23859:18;;:::i;:::-;23823:56;23897:29;23919:6;23897:29;:::i;:::-;23889:37;;23981:4;23975;23971:15;23963:23;;23686:307;;;:::o;23999:308::-;24061:4;24151:18;24143:6;24140:30;24137:56;;;24173:18;;:::i;:::-;24137:56;24211:29;24233:6;24211:29;:::i;:::-;24203:37;;24295:4;24289;24285:15;24277:23;;23999:308;;;:::o;24313:98::-;24364:6;24398:5;24392:12;24382:22;;24313:98;;;:::o;24417:99::-;24469:6;24503:5;24497:12;24487:22;;24417:99;;;:::o;24522:168::-;24605:11;24639:6;24634:3;24627:19;24679:4;24674:3;24670:14;24655:29;;24522:168;;;;:::o;24696:169::-;24780:11;24814:6;24809:3;24802:19;24854:4;24849:3;24845:14;24830:29;;24696:169;;;;:::o;24871:148::-;24973:11;25010:3;24995:18;;24871:148;;;;:::o;25025:305::-;25065:3;25084:20;25102:1;25084:20;:::i;:::-;25079:25;;25118:20;25136:1;25118:20;:::i;:::-;25113:25;;25272:1;25204:66;25200:74;25197:1;25194:81;25191:107;;;25278:18;;:::i;:::-;25191:107;25322:1;25319;25315:9;25308:16;;25025:305;;;;:::o;25336:185::-;25376:1;25393:20;25411:1;25393:20;:::i;:::-;25388:25;;25427:20;25445:1;25427:20;:::i;:::-;25422:25;;25466:1;25456:35;;25471:18;;:::i;:::-;25456:35;25513:1;25510;25506:9;25501:14;;25336:185;;;;:::o;25527:191::-;25567:4;25587:20;25605:1;25587:20;:::i;:::-;25582:25;;25621:20;25639:1;25621:20;:::i;:::-;25616:25;;25660:1;25657;25654:8;25651:34;;;25665:18;;:::i;:::-;25651:34;25710:1;25707;25703:9;25695:17;;25527:191;;;;:::o;25724:96::-;25761:7;25790:24;25808:5;25790:24;:::i;:::-;25779:35;;25724:96;;;:::o;25826:90::-;25860:7;25903:5;25896:13;25889:21;25878:32;;25826:90;;;:::o;25922:149::-;25958:7;25998:66;25991:5;25987:78;25976:89;;25922:149;;;:::o;26077:126::-;26114:7;26154:42;26147:5;26143:54;26132:65;;26077:126;;;:::o;26209:77::-;26246:7;26275:5;26264:16;;26209:77;;;:::o;26292:154::-;26376:6;26371:3;26366;26353:30;26438:1;26429:6;26424:3;26420:16;26413:27;26292:154;;;:::o;26452:307::-;26520:1;26530:113;26544:6;26541:1;26538:13;26530:113;;;26629:1;26624:3;26620:11;26614:18;26610:1;26605:3;26601:11;26594:39;26566:2;26563:1;26559:10;26554:15;;26530:113;;;26661:6;26658:1;26655:13;26652:101;;;26741:1;26732:6;26727:3;26723:16;26716:27;26652:101;26501:258;26452:307;;;:::o;26765:320::-;26809:6;26846:1;26840:4;26836:12;26826:22;;26893:1;26887:4;26883:12;26914:18;26904:81;;26970:4;26962:6;26958:17;26948:27;;26904:81;27032:2;27024:6;27021:14;27001:18;26998:38;26995:84;;;27051:18;;:::i;:::-;26995:84;26816:269;26765:320;;;:::o;27091:281::-;27174:27;27196:4;27174:27;:::i;:::-;27166:6;27162:40;27304:6;27292:10;27289:22;27268:18;27256:10;27253:34;27250:62;27247:88;;;27315:18;;:::i;:::-;27247:88;27355:10;27351:2;27344:22;27134:238;27091:281;;:::o;27378:233::-;27417:3;27440:24;27458:5;27440:24;:::i;:::-;27431:33;;27486:66;27479:5;27476:77;27473:103;;;27556:18;;:::i;:::-;27473:103;27603:1;27596:5;27592:13;27585:20;;27378:233;;;:::o;27617:176::-;27649:1;27666:20;27684:1;27666:20;:::i;:::-;27661:25;;27700:20;27718:1;27700:20;:::i;:::-;27695:25;;27739:1;27729:35;;27744:18;;:::i;:::-;27729:35;27785:1;27782;27778:9;27773:14;;27617:176;;;;:::o;27799:180::-;27847:77;27844:1;27837:88;27944:4;27941:1;27934:15;27968:4;27965:1;27958:15;27985:180;28033:77;28030:1;28023:88;28130:4;28127:1;28120:15;28154:4;28151:1;28144:15;28171:180;28219:77;28216:1;28209:88;28316:4;28313:1;28306:15;28340:4;28337:1;28330:15;28357:180;28405:77;28402:1;28395:88;28502:4;28499:1;28492:15;28526:4;28523:1;28516:15;28543:180;28591:77;28588:1;28581:88;28688:4;28685:1;28678:15;28712:4;28709:1;28702:15;28729:117;28838:1;28835;28828:12;28852:117;28961:1;28958;28951:12;28975:117;29084:1;29081;29074:12;29098:117;29207:1;29204;29197:12;29221:102;29262:6;29313:2;29309:7;29304:2;29297:5;29293:14;29289:28;29279:38;;29221:102;;;:::o;29329:237::-;29469:34;29465:1;29457:6;29453:14;29446:58;29538:20;29533:2;29525:6;29521:15;29514:45;29329:237;:::o;29572:225::-;29712:34;29708:1;29700:6;29696:14;29689:58;29781:8;29776:2;29768:6;29764:15;29757:33;29572:225;:::o;29803:224::-;29943:34;29939:1;29931:6;29927:14;29920:58;30012:7;30007:2;29999:6;29995:15;29988:32;29803:224;:::o;30033:178::-;30173:30;30169:1;30161:6;30157:14;30150:54;30033:178;:::o;30217:223::-;30357:34;30353:1;30345:6;30341:14;30334:58;30426:6;30421:2;30413:6;30409:15;30402:31;30217:223;:::o;30446:175::-;30586:27;30582:1;30574:6;30570:14;30563:51;30446:175;:::o;30627:231::-;30767:34;30763:1;30755:6;30751:14;30744:58;30836:14;30831:2;30823:6;30819:15;30812:39;30627:231;:::o;30864:243::-;31004:34;31000:1;30992:6;30988:14;30981:58;31073:26;31068:2;31060:6;31056:15;31049:51;30864:243;:::o;31113:229::-;31253:34;31249:1;31241:6;31237:14;31230:58;31322:12;31317:2;31309:6;31305:15;31298:37;31113:229;:::o;31348:228::-;31488:34;31484:1;31476:6;31472:14;31465:58;31557:11;31552:2;31544:6;31540:15;31533:36;31348:228;:::o;31582:182::-;31722:34;31718:1;31710:6;31706:14;31699:58;31582:182;:::o;31770:231::-;31910:34;31906:1;31898:6;31894:14;31887:58;31979:14;31974:2;31966:6;31962:15;31955:39;31770:231;:::o;32007:182::-;32147:34;32143:1;32135:6;32131:14;32124:58;32007:182;:::o;32195:234::-;32335:34;32331:1;32323:6;32319:14;32312:58;32404:17;32399:2;32391:6;32387:15;32380:42;32195:234;:::o;32435:220::-;32575:34;32571:1;32563:6;32559:14;32552:58;32644:3;32639:2;32631:6;32627:15;32620:28;32435:220;:::o;32661:236::-;32801:34;32797:1;32789:6;32785:14;32778:58;32870:19;32865:2;32857:6;32853:15;32846:44;32661:236;:::o;32903:122::-;32976:24;32994:5;32976:24;:::i;:::-;32969:5;32966:35;32956:63;;33015:1;33012;33005:12;32956:63;32903:122;:::o;33031:116::-;33101:21;33116:5;33101:21;:::i;:::-;33094:5;33091:32;33081:60;;33137:1;33134;33127:12;33081:60;33031:116;:::o;33153:120::-;33225:23;33242:5;33225:23;:::i;:::-;33218:5;33215:34;33205:62;;33263:1;33260;33253:12;33205:62;33153:120;:::o;33279:122::-;33352:24;33370:5;33352:24;:::i;:::-;33345:5;33342:35;33332:63;;33391:1;33388;33381:12;33332:63;33279:122;:::o

Swarm Source

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