Token IP&ITdoggieNFT

 

Overview ERC-721

Total Supply:
0 DOGGIE

Holders:
5 addresses

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
IPITdoggieNFT

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-08
*/

// SPDX-License-Identifier: IPLedger

// Sources flattened with hardhat v2.8.3 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]

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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

// 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 @openzeppelin/contracts/access/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/interfaces/[email protected]

// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;


// File IERC2981.sol

// OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be payed in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


// File ERC2981.sol

// OpenZeppelin Contracts v4.4.0 (token/common/ERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        virtual
        override
        returns (address, uint256)
    {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `tokenId` must be already minted.
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}


// File ERC721Royalty.sol


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

pragma solidity ^0.8.0;



/**
 * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment
 * information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC721Royalty is ERC2981, ERC721 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);
        _resetTokenRoyalty(tokenId);
    }
}


// File ICopyrightAgreement.sol

pragma solidity ^0.8.11;

interface ICopyrightAgreement {
    function generalLicense() external view returns (string memory);
}


// File INFTNonExclusiveLicenseCopyrightAgreement.sol

pragma solidity ^0.8.11;

interface INFTNonExclusiveLicenseCopyrightAgreement is ICopyrightAgreement {}


// File CopyrightAgreement.sol

pragma solidity ^0.8.11;

abstract contract CopyrightAgreement is ICopyrightAgreement {

    string private _generalLicense;

    constructor (string memory generalLicense_) {
        _generalLicense = generalLicense_;
    }

    function generalLicense() public view returns(string memory) {
        return _generalLicense;
    }
}


// File NFTNonExclusiveLicenseCopyrightAgreement.sol

pragma solidity ^0.8.11;


abstract contract NFTNonExclusiveLicenseCopyrightAgreement is
    CopyrightAgreement,
    INFTNonExclusiveLicenseCopyrightAgreement
{
    constructor(string memory generalLicense_)
        CopyrightAgreement(generalLicense_)
    {}
}


// File IPITdoggieNFT.sol

pragma solidity ^0.8.11;





contract IPITdoggieNFT is ERC721Royalty, Ownable, NFTNonExclusiveLicenseCopyrightAgreement {
    using Counters for Counters.Counter;
    using Strings for uint256;
    Counters.Counter private _tokenIds;
    mapping(uint256 => string) private _tokenURIs;

    constructor()
        ERC721("IP&ITdoggieNFT", "DOGGIE")
        NFTNonExclusiveLicenseCopyrightAgreement("ipfs://QmPujur8Ktba38kTj9q1DMhSrrqBAjTL1u2CM36MXCWZEM")
    {
        _setDefaultRoyalty(0x5B5ac150ff40A56cDB0A8f5676425E4611d6400A, 500);
    }

    function _setTokenURI(uint256 tokenId, string memory _tokenURI)
        internal
        virtual
    {
        _tokenURIs[tokenId] = _tokenURI;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        string memory _tokenURI = _tokenURIs[tokenId];
        return _tokenURI;
    }

    function mint(address recipient, string memory uri)
        public
        onlyOwner
        returns (uint256)
    {
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        _mint(recipient, newItemId);
        _setTokenURI(newItemId, uri);
        return newItemId;
    }
}

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":"generalLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"mint","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":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"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":[{"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"}]

60806040523480156200001157600080fd5b506040518060600160405280603581526020016200351e60359139806040518060400160405280600e81526020017f4950264954646f676769654e46540000000000000000000000000000000000008152506040518060400160405280600681526020017f444f4747494500000000000000000000000000000000000000000000000000008152508160029080519060200190620000b1929190620003b1565b508060039080519060200190620000ca929190620003b1565b505050620000ed620000e16200013660201b60201c565b6200013e60201b60201c565b806009908051906020019062000105929190620003b1565b50505062000130735b5ac150ff40a56cdb0a8f5676425e4611d6400a6101f46200020460201b60201c565b620005e1565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000214620003a760201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000275576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026c90620004e8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620002e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002df906200055a565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b828054620003bf90620005ab565b90600052602060002090601f016020900481019282620003e357600085556200042f565b82601f10620003fe57805160ff19168380011785556200042f565b828001600101855582156200042f579182015b828111156200042e57825182559160200191906001019062000411565b5b5090506200043e919062000442565b5090565b5b808211156200045d57600081600090555060010162000443565b5090565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000620004d0602a8362000461565b9150620004dd8262000472565b604082019050919050565b600060208201905081810360008301526200050381620004c1565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006200054260198362000461565b91506200054f826200050a565b602082019050919050565b60006020820190508181036000830152620005758162000533565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005c457607f821691505b60208210811415620005db57620005da6200057c565b5b50919050565b612f2d80620005f16000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c8063715018a6116100ad578063c87b56dd11610071578063c87b56dd14610307578063d0def52114610337578063d7d0b06b14610367578063e985e9c514610385578063f2fde38b146103b557610121565b8063715018a6146102895780638da5cb5b1461029357806395d89b41146102b1578063a22cb465146102cf578063b88d4fde146102eb57610121565b806323b872dd116100f457806323b872dd146101c05780632a55205a146101dc57806342842e0e1461020d5780636352211e1461022957806370a082311461025957610121565b806301ffc9a71461012657806306fdde0314610156578063081812fc14610174578063095ea7b3146101a4575b600080fd5b610140600480360381019061013b9190611cfb565b6103d1565b60405161014d9190611d43565b60405180910390f35b61015e6103e3565b60405161016b9190611df7565b60405180910390f35b61018e60048036038101906101899190611e4f565b610475565b60405161019b9190611ebd565b60405180910390f35b6101be60048036038101906101b99190611f04565b6104fa565b005b6101da60048036038101906101d59190611f44565b610612565b005b6101f660048036038101906101f19190611f97565b610672565b604051610204929190611fe6565b60405180910390f35b61022760048036038101906102229190611f44565b61085d565b005b610243600480360381019061023e9190611e4f565b61087d565b6040516102509190611ebd565b60405180910390f35b610273600480360381019061026e919061200f565b61092f565b604051610280919061203c565b60405180910390f35b6102916109e7565b005b61029b610a6f565b6040516102a89190611ebd565b60405180910390f35b6102b9610a99565b6040516102c69190611df7565b60405180910390f35b6102e960048036038101906102e49190612083565b610b2b565b005b610305600480360381019061030091906121f8565b610b41565b005b610321600480360381019061031c9190611e4f565b610ba3565b60405161032e9190611df7565b60405180910390f35b610351600480360381019061034c919061231c565b610c96565b60405161035e919061203c565b60405180910390f35b61036f610d4a565b60405161037c9190611df7565b60405180910390f35b61039f600480360381019061039a9190612378565b610ddc565b6040516103ac9190611d43565b60405180910390f35b6103cf60048036038101906103ca919061200f565b610e70565b005b60006103dc82610f68565b9050919050565b6060600280546103f2906123e7565b80601f016020809104026020016040519081016040528092919081815260200182805461041e906123e7565b801561046b5780601f106104405761010080835404028352916020019161046b565b820191906000526020600020905b81548152906001019060200180831161044e57829003601f168201915b5050505050905090565b60006104808261104a565b6104bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b69061248b565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105058261087d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056d9061251d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166105956110b6565b73ffffffffffffffffffffffffffffffffffffffff1614806105c457506105c3816105be6110b6565b610ddc565b5b610603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fa906125af565b60405180910390fd5b61060d83836110be565b505050565b61062361061d6110b6565b82611177565b610662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065990612641565b60405180910390fd5b61066d838383611255565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156108085760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006108126114b1565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661083e9190612690565b6108489190612719565b90508160000151819350935050509250929050565b61087883838360405180602001604052806000815250610b41565b505050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091d906127bc565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156109a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109979061284e565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109ef6110b6565b73ffffffffffffffffffffffffffffffffffffffff16610a0d610a6f565b73ffffffffffffffffffffffffffffffffffffffff1614610a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5a906128ba565b60405180910390fd5b610a6d60006114bb565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610aa8906123e7565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad4906123e7565b8015610b215780601f10610af657610100808354040283529160200191610b21565b820191906000526020600020905b815481529060010190602001808311610b0457829003601f168201915b5050505050905090565b610b3d610b366110b6565b8383611581565b5050565b610b52610b4c6110b6565b83611177565b610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8890612641565b60405180910390fd5b610b9d848484846116ee565b50505050565b6060610bae8261104a565b610bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be49061294c565b60405180910390fd5b6000600b60008481526020019081526020016000208054610c0d906123e7565b80601f0160208091040260200160405190810160405280929190818152602001828054610c39906123e7565b8015610c865780601f10610c5b57610100808354040283529160200191610c86565b820191906000526020600020905b815481529060010190602001808311610c6957829003601f168201915b5050505050905080915050919050565b6000610ca06110b6565b73ffffffffffffffffffffffffffffffffffffffff16610cbe610a6f565b73ffffffffffffffffffffffffffffffffffffffff1614610d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0b906128ba565b60405180910390fd5b610d1e600a61174a565b6000610d2a600a611760565b9050610d36848261176e565b610d40818461193c565b8091505092915050565b606060098054610d59906123e7565b80601f0160208091040260200160405190810160405280929190818152602001828054610d85906123e7565b8015610dd25780601f10610da757610100808354040283529160200191610dd2565b820191906000526020600020905b815481529060010190602001808311610db557829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e786110b6565b73ffffffffffffffffffffffffffffffffffffffff16610e96610a6f565b73ffffffffffffffffffffffffffffffffffffffff1614610eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee3906128ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f53906129de565b60405180910390fd5b610f65816114bb565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061103357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611043575061104282611968565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166111318361087d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006111828261104a565b6111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b890612a70565b60405180910390fd5b60006111cc8361087d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061123b57508373ffffffffffffffffffffffffffffffffffffffff1661122384610475565b73ffffffffffffffffffffffffffffffffffffffff16145b8061124c575061124b8185610ddc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166112758261087d565b73ffffffffffffffffffffffffffffffffffffffff16146112cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c290612b02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561133b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133290612b94565b60405180910390fd5b6113468383836119e2565b6113516000826110be565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113a19190612bb4565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113f89190612be8565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612710905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e790612c8a565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116e19190611d43565b60405180910390a3505050565b6116f9848484611255565b611705848484846119e7565b611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173b90612d1c565b60405180910390fd5b50505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d590612d88565b60405180910390fd5b6117e78161104a565b15611827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181e90612df4565b60405180910390fd5b611833600083836119e2565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118839190612be8565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b80600b60008481526020019081526020016000209080519060200190611963929190611bec565b505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119db57506119da82611b6f565b5b9050919050565b505050565b6000611a088473ffffffffffffffffffffffffffffffffffffffff16611bd9565b15611b62578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611a316110b6565b8786866040518563ffffffff1660e01b8152600401611a539493929190612e69565b6020604051808303816000875af1925050508015611a8f57506040513d601f19601f82011682018060405250810190611a8c9190612eca565b60015b611b12573d8060008114611abf576040519150601f19603f3d011682016040523d82523d6000602084013e611ac4565b606091505b50600081511415611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0190612d1c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611b67565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080823b905060008111915050919050565b828054611bf8906123e7565b90600052602060002090601f016020900481019282611c1a5760008555611c61565b82601f10611c3357805160ff1916838001178555611c61565b82800160010185558215611c61579182015b82811115611c60578251825591602001919060010190611c45565b5b509050611c6e9190611c72565b5090565b5b80821115611c8b576000816000905550600101611c73565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611cd881611ca3565b8114611ce357600080fd5b50565b600081359050611cf581611ccf565b92915050565b600060208284031215611d1157611d10611c99565b5b6000611d1f84828501611ce6565b91505092915050565b60008115159050919050565b611d3d81611d28565b82525050565b6000602082019050611d586000830184611d34565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611d98578082015181840152602081019050611d7d565b83811115611da7576000848401525b50505050565b6000601f19601f8301169050919050565b6000611dc982611d5e565b611dd38185611d69565b9350611de3818560208601611d7a565b611dec81611dad565b840191505092915050565b60006020820190508181036000830152611e118184611dbe565b905092915050565b6000819050919050565b611e2c81611e19565b8114611e3757600080fd5b50565b600081359050611e4981611e23565b92915050565b600060208284031215611e6557611e64611c99565b5b6000611e7384828501611e3a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611ea782611e7c565b9050919050565b611eb781611e9c565b82525050565b6000602082019050611ed26000830184611eae565b92915050565b611ee181611e9c565b8114611eec57600080fd5b50565b600081359050611efe81611ed8565b92915050565b60008060408385031215611f1b57611f1a611c99565b5b6000611f2985828601611eef565b9250506020611f3a85828601611e3a565b9150509250929050565b600080600060608486031215611f5d57611f5c611c99565b5b6000611f6b86828701611eef565b9350506020611f7c86828701611eef565b9250506040611f8d86828701611e3a565b9150509250925092565b60008060408385031215611fae57611fad611c99565b5b6000611fbc85828601611e3a565b9250506020611fcd85828601611e3a565b9150509250929050565b611fe081611e19565b82525050565b6000604082019050611ffb6000830185611eae565b6120086020830184611fd7565b9392505050565b60006020828403121561202557612024611c99565b5b600061203384828501611eef565b91505092915050565b60006020820190506120516000830184611fd7565b92915050565b61206081611d28565b811461206b57600080fd5b50565b60008135905061207d81612057565b92915050565b6000806040838503121561209a57612099611c99565b5b60006120a885828601611eef565b92505060206120b98582860161206e565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61210582611dad565b810181811067ffffffffffffffff82111715612124576121236120cd565b5b80604052505050565b6000612137611c8f565b905061214382826120fc565b919050565b600067ffffffffffffffff821115612163576121626120cd565b5b61216c82611dad565b9050602081019050919050565b82818337600083830152505050565b600061219b61219684612148565b61212d565b9050828152602081018484840111156121b7576121b66120c8565b5b6121c2848285612179565b509392505050565b600082601f8301126121df576121de6120c3565b5b81356121ef848260208601612188565b91505092915050565b6000806000806080858703121561221257612211611c99565b5b600061222087828801611eef565b945050602061223187828801611eef565b935050604061224287828801611e3a565b925050606085013567ffffffffffffffff81111561226357612262611c9e565b5b61226f878288016121ca565b91505092959194509250565b600067ffffffffffffffff821115612296576122956120cd565b5b61229f82611dad565b9050602081019050919050565b60006122bf6122ba8461227b565b61212d565b9050828152602081018484840111156122db576122da6120c8565b5b6122e6848285612179565b509392505050565b600082601f830112612303576123026120c3565b5b81356123138482602086016122ac565b91505092915050565b6000806040838503121561233357612332611c99565b5b600061234185828601611eef565b925050602083013567ffffffffffffffff81111561236257612361611c9e565b5b61236e858286016122ee565b9150509250929050565b6000806040838503121561238f5761238e611c99565b5b600061239d85828601611eef565b92505060206123ae85828601611eef565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806123ff57607f821691505b60208210811415612413576124126123b8565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612475602c83611d69565b915061248082612419565b604082019050919050565b600060208201905081810360008301526124a481612468565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612507602183611d69565b9150612512826124ab565b604082019050919050565b60006020820190508181036000830152612536816124fa565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612599603883611d69565b91506125a48261253d565b604082019050919050565b600060208201905081810360008301526125c88161258c565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061262b603183611d69565b9150612636826125cf565b604082019050919050565b6000602082019050818103600083015261265a8161261e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061269b82611e19565b91506126a683611e19565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156126df576126de612661565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061272482611e19565b915061272f83611e19565b92508261273f5761273e6126ea565b5b828204905092915050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006127a6602983611d69565b91506127b18261274a565b604082019050919050565b600060208201905081810360008301526127d581612799565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612838602a83611d69565b9150612843826127dc565b604082019050919050565b600060208201905081810360008301526128678161282b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006128a4602083611d69565b91506128af8261286e565b602082019050919050565b600060208201905081810360008301526128d381612897565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612936602f83611d69565b9150612941826128da565b604082019050919050565b6000602082019050818103600083015261296581612929565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006129c8602683611d69565b91506129d38261296c565b604082019050919050565b600060208201905081810360008301526129f7816129bb565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612a5a602c83611d69565b9150612a65826129fe565b604082019050919050565b60006020820190508181036000830152612a8981612a4d565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000612aec602983611d69565b9150612af782612a90565b604082019050919050565b60006020820190508181036000830152612b1b81612adf565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612b7e602483611d69565b9150612b8982612b22565b604082019050919050565b60006020820190508181036000830152612bad81612b71565b9050919050565b6000612bbf82611e19565b9150612bca83611e19565b925082821015612bdd57612bdc612661565b5b828203905092915050565b6000612bf382611e19565b9150612bfe83611e19565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c3357612c32612661565b5b828201905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612c74601983611d69565b9150612c7f82612c3e565b602082019050919050565b60006020820190508181036000830152612ca381612c67565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612d06603283611d69565b9150612d1182612caa565b604082019050919050565b60006020820190508181036000830152612d3581612cf9565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612d72602083611d69565b9150612d7d82612d3c565b602082019050919050565b60006020820190508181036000830152612da181612d65565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612dde601c83611d69565b9150612de982612da8565b602082019050919050565b60006020820190508181036000830152612e0d81612dd1565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000612e3b82612e14565b612e458185612e1f565b9350612e55818560208601611d7a565b612e5e81611dad565b840191505092915050565b6000608082019050612e7e6000830187611eae565b612e8b6020830186611eae565b612e986040830185611fd7565b8181036060830152612eaa8184612e30565b905095945050505050565b600081519050612ec481611ccf565b92915050565b600060208284031215612ee057612edf611c99565b5b6000612eee84828501612eb5565b9150509291505056fea2646970667358221220db2f59ee437f3b64aec30d276c61f77648af7e9735089548dbdfcfcdc678aa5c64736f6c634300080b0033697066733a2f2f516d50756a7572384b74626133386b546a397131444d685372727142416a544c317532434d33364d5843575a454d

Deployed ByteCode Sourcemap

45569:1370:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44000:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22305:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23864:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23387:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24614:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40407:494;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;25024:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21999:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21729:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36988:103;;;:::i;:::-;;36337:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22474:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24157:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25280:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46262:353;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46623:313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45061:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24383:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37246:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44000:170;44102:4;44126:36;44150:11;44126:23;:36::i;:::-;44119:43;;44000:170;;;:::o;22305:100::-;22359:13;22392:5;22385:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22305:100;:::o;23864:221::-;23940:7;23968:16;23976:7;23968;:16::i;:::-;23960:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24053:15;:24;24069:7;24053:24;;;;;;;;;;;;;;;;;;;;;24046:31;;23864:221;;;:::o;23387:411::-;23468:13;23484:23;23499:7;23484:14;:23::i;:::-;23468:39;;23532:5;23526:11;;:2;:11;;;;23518:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23626:5;23610:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23635:37;23652:5;23659:12;:10;:12::i;:::-;23635:16;:37::i;:::-;23610:62;23588:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23769:21;23778:2;23782:7;23769:8;:21::i;:::-;23457:341;23387:411;;:::o;24614:339::-;24809:41;24828:12;:10;:12::i;:::-;24842:7;24809:18;:41::i;:::-;24801:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24917:28;24927:4;24933:2;24937:7;24917:9;:28::i;:::-;24614:339;;;:::o;40407:494::-;40551:7;40560;40585:26;40614:17;:27;40632:8;40614:27;;;;;;;;;;;40585:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40686:1;40658:30;;:7;:16;;;:30;;;40654:92;;;40715:19;40705:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40654:92;40758:21;40823:17;:15;:17::i;:::-;40782:58;;40796:7;:23;;;40783:36;;:10;:36;;;;:::i;:::-;40782:58;;;;:::i;:::-;40758:82;;40861:7;:16;;;40879:13;40853:40;;;;;;40407:494;;;;;:::o;25024:185::-;25162:39;25179:4;25185:2;25189:7;25162:39;;;;;;;;;;;;:16;:39::i;:::-;25024:185;;;:::o;21999:239::-;22071:7;22091:13;22107:7;:16;22115:7;22107:16;;;;;;;;;;;;;;;;;;;;;22091:32;;22159:1;22142:19;;:5;:19;;;;22134:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22225:5;22218:12;;;21999:239;;;:::o;21729:208::-;21801:7;21846:1;21829:19;;:5;:19;;;;21821:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21913:9;:16;21923:5;21913:16;;;;;;;;;;;;;;;;21906:23;;21729:208;;;:::o;36988:103::-;36568:12;:10;:12::i;:::-;36557:23;;:7;:5;:7::i;:::-;:23;;;36549:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37053:30:::1;37080:1;37053:18;:30::i;:::-;36988:103::o:0;36337:87::-;36383:7;36410:6;;;;;;;;;;;36403:13;;36337:87;:::o;22474:104::-;22530:13;22563:7;22556:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22474:104;:::o;24157:155::-;24252:52;24271:12;:10;:12::i;:::-;24285:8;24295;24252:18;:52::i;:::-;24157:155;;:::o;25280:328::-;25455:41;25474:12;:10;:12::i;:::-;25488:7;25455:18;:41::i;:::-;25447:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25561:39;25575:4;25581:2;25585:7;25594:5;25561:13;:39::i;:::-;25280:328;;;;:::o;46262:353::-;46380:13;46433:16;46441:7;46433;:16::i;:::-;46411:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;46535:23;46561:10;:19;46572:7;46561:19;;;;;;;;;;;46535:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46598:9;46591:16;;;46262:353;;;:::o;46623:313::-;46728:7;36568:12;:10;:12::i;:::-;36557:23;;:7;:5;:7::i;:::-;:23;;;36549:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46753:21:::1;:9;:19;:21::i;:::-;46785:17;46805:19;:9;:17;:19::i;:::-;46785:39;;46835:27;46841:9;46852;46835:5;:27::i;:::-;46873:28;46886:9;46897:3;46873:12;:28::i;:::-;46919:9;46912:16;;;46623:313:::0;;;;:::o;45061:102::-;45107:13;45140:15;45133:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45061:102;:::o;24383:164::-;24480:4;24504:18;:25;24523:5;24504:25;;;;;;;;;;;;;;;:35;24530:8;24504:35;;;;;;;;;;;;;;;;;;;;;;;;;24497:42;;24383:164;;;;:::o;37246:201::-;36568:12;:10;:12::i;:::-;36557:23;;:7;:5;:7::i;:::-;:23;;;36549:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37355:1:::1;37335:22;;:8;:22;;;;37327:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37411:28;37430:8;37411:18;:28::i;:::-;37246:201:::0;:::o;21360:305::-;21462:4;21514:25;21499:40;;;:11;:40;;;;:105;;;;21571:33;21556:48;;;:11;:48;;;;21499:105;:158;;;;21621:36;21645:11;21621:23;:36::i;:::-;21499:158;21479:178;;21360:305;;;:::o;27118:127::-;27183:4;27235:1;27207:30;;:7;:16;27215:7;27207:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27200:37;;27118:127;;;:::o;16587:98::-;16640:7;16667:10;16660:17;;16587:98;:::o;31100:174::-;31202:2;31175:15;:24;31191:7;31175:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31258:7;31254:2;31220:46;;31229:23;31244:7;31229:14;:23::i;:::-;31220:46;;;;;;;;;;;;31100:174;;:::o;27412:348::-;27505:4;27530:16;27538:7;27530;:16::i;:::-;27522:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27606:13;27622:23;27637:7;27622:14;:23::i;:::-;27606:39;;27675:5;27664:16;;:7;:16;;;:51;;;;27708:7;27684:31;;:20;27696:7;27684:11;:20::i;:::-;:31;;;27664:51;:87;;;;27719:32;27736:5;27743:7;27719:16;:32::i;:::-;27664:87;27656:96;;;27412:348;;;;:::o;30404:578::-;30563:4;30536:31;;:23;30551:7;30536:14;:23::i;:::-;:31;;;30528:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30646:1;30632:16;;:2;:16;;;;30624:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30702:39;30723:4;30729:2;30733:7;30702:20;:39::i;:::-;30806:29;30823:1;30827:7;30806:8;:29::i;:::-;30867:1;30848:9;:15;30858:4;30848:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30896:1;30879:9;:13;30889:2;30879:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30927:2;30908:7;:16;30916:7;30908:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30966:7;30962:2;30947:27;;30956:4;30947:27;;;;;;;;;;;;30404:578;;;:::o;41183:97::-;41241:6;41267:5;41260:12;;41183:97;:::o;37607:191::-;37681:16;37700:6;;;;;;;;;;;37681:25;;37726:8;37717:6;;:17;;;;;;;;;;;;;;;;;;37781:8;37750:40;;37771:8;37750:40;;;;;;;;;;;;37670:128;37607:191;:::o;31416:315::-;31571:8;31562:17;;:5;:17;;;;31554:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31658:8;31620:18;:25;31639:5;31620:25;;;;;;;;;;;;;;;:35;31646:8;31620:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31704:8;31682:41;;31697:5;31682:41;;;31714:8;31682:41;;;;;;:::i;:::-;;;;;;;;31416:315;;;:::o;26490:::-;26647:28;26657:4;26663:2;26667:7;26647:9;:28::i;:::-;26694:48;26717:4;26723:2;26727:7;26736:5;26694:22;:48::i;:::-;26686:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26490:315;;;;:::o;34800:127::-;34907:1;34889:7;:14;;;:19;;;;;;;;;;;34800:127;:::o;34678:114::-;34743:7;34770;:14;;;34763:21;;34678:114;;;:::o;29096:382::-;29190:1;29176:16;;:2;:16;;;;29168:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29249:16;29257:7;29249;:16::i;:::-;29248:17;29240:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29311:45;29340:1;29344:2;29348:7;29311:20;:45::i;:::-;29386:1;29369:9;:13;29379:2;29369:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29417:2;29398:7;:16;29406:7;29398:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29462:7;29458:2;29437:33;;29454:1;29437:33;;;;;;;;;;;;29096:382;;:::o;46100:154::-;46237:9;46215:10;:19;46226:7;46215:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;46100:154;;:::o;40137:215::-;40239:4;40278:26;40263:41;;;:11;:41;;;;:81;;;;40308:36;40332:11;40308:23;:36::i;:::-;40263:81;40256:88;;40137:215;;;:::o;33667:126::-;;;;:::o;32296:799::-;32451:4;32472:15;:2;:13;;;:15::i;:::-;32468:620;;;32524:2;32508:36;;;32545:12;:10;:12::i;:::-;32559:4;32565:7;32574:5;32508:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32504:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32767:1;32750:6;:13;:18;32746:272;;;32793:60;;;;;;;;;;:::i;:::-;;;;;;;;32746:272;32968:6;32962:13;32953:6;32949:2;32945:15;32938:38;32504:529;32641:41;;;32631:51;;;:6;:51;;;;32624:58;;;;;32468:620;33072:4;33065:11;;32296:799;;;;;;;:::o;19800:157::-;19885:4;19924:25;19909:40;;;:11;:40;;;;19902:47;;19800:157;;;:::o;8571:387::-;8631:4;8839:12;8906:7;8894:20;8886:28;;8949:1;8942:4;:8;8935:15;;;8571:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:619::-;5015:6;5023;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:53;5404:7;5395:6;5384:9;5380:22;5359:53;:::i;:::-;5349:63;;5304:118;5461:2;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5432:118;4938:619;;;;;:::o;5563:474::-;5631:6;5639;5688:2;5676:9;5667:7;5663:23;5659:32;5656:119;;;5694:79;;:::i;:::-;5656:119;5814:1;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5785:117;5941:2;5967:53;6012:7;6003:6;5992:9;5988:22;5967:53;:::i;:::-;5957:63;;5912:118;5563:474;;;;;:::o;6043:118::-;6130:24;6148:5;6130:24;:::i;:::-;6125:3;6118:37;6043:118;;:::o;6167:332::-;6288:4;6326:2;6315:9;6311:18;6303:26;;6339:71;6407:1;6396:9;6392:17;6383:6;6339:71;:::i;:::-;6420:72;6488:2;6477:9;6473:18;6464:6;6420:72;:::i;:::-;6167:332;;;;;:::o;6505:329::-;6564:6;6613:2;6601:9;6592:7;6588:23;6584:32;6581:119;;;6619:79;;:::i;:::-;6581:119;6739:1;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;:::i;:::-;6754:63;;6710:117;6505:329;;;;:::o;6840:222::-;6933:4;6971:2;6960:9;6956:18;6948:26;;6984:71;7052:1;7041:9;7037:17;7028:6;6984:71;:::i;:::-;6840:222;;;;:::o;7068:116::-;7138:21;7153:5;7138:21;:::i;:::-;7131:5;7128:32;7118:60;;7174:1;7171;7164:12;7118:60;7068:116;:::o;7190:133::-;7233:5;7271:6;7258:20;7249:29;;7287:30;7311:5;7287:30;:::i;:::-;7190:133;;;;:::o;7329:468::-;7394:6;7402;7451:2;7439:9;7430:7;7426:23;7422:32;7419:119;;;7457:79;;:::i;:::-;7419:119;7577:1;7602:53;7647:7;7638:6;7627:9;7623:22;7602:53;:::i;:::-;7592:63;;7548:117;7704:2;7730:50;7772:7;7763:6;7752:9;7748:22;7730:50;:::i;:::-;7720:60;;7675:115;7329:468;;;;;:::o;7803:117::-;7912:1;7909;7902:12;7926:117;8035:1;8032;8025:12;8049:180;8097:77;8094:1;8087:88;8194:4;8191:1;8184:15;8218:4;8215:1;8208:15;8235:281;8318:27;8340:4;8318:27;:::i;:::-;8310:6;8306:40;8448:6;8436:10;8433:22;8412:18;8400:10;8397:34;8394:62;8391:88;;;8459:18;;:::i;:::-;8391:88;8499:10;8495:2;8488:22;8278:238;8235:281;;:::o;8522:129::-;8556:6;8583:20;;:::i;:::-;8573:30;;8612:33;8640:4;8632:6;8612:33;:::i;:::-;8522:129;;;:::o;8657:307::-;8718:4;8808:18;8800:6;8797:30;8794:56;;;8830:18;;:::i;:::-;8794:56;8868:29;8890:6;8868:29;:::i;:::-;8860:37;;8952:4;8946;8942:15;8934:23;;8657:307;;;:::o;8970:154::-;9054:6;9049:3;9044;9031:30;9116:1;9107:6;9102:3;9098:16;9091:27;8970:154;;;:::o;9130:410::-;9207:5;9232:65;9248:48;9289:6;9248:48;:::i;:::-;9232:65;:::i;:::-;9223:74;;9320:6;9313:5;9306:21;9358:4;9351:5;9347:16;9396:3;9387:6;9382:3;9378:16;9375:25;9372:112;;;9403:79;;:::i;:::-;9372:112;9493:41;9527:6;9522:3;9517;9493:41;:::i;:::-;9213:327;9130:410;;;;;:::o;9559:338::-;9614:5;9663:3;9656:4;9648:6;9644:17;9640:27;9630:122;;9671:79;;:::i;:::-;9630:122;9788:6;9775:20;9813:78;9887:3;9879:6;9872:4;9864:6;9860:17;9813:78;:::i;:::-;9804:87;;9620:277;9559:338;;;;:::o;9903:943::-;9998:6;10006;10014;10022;10071:3;10059:9;10050:7;10046:23;10042:33;10039:120;;;10078:79;;:::i;:::-;10039:120;10198:1;10223:53;10268:7;10259:6;10248:9;10244:22;10223:53;:::i;:::-;10213:63;;10169:117;10325:2;10351:53;10396:7;10387:6;10376:9;10372:22;10351:53;:::i;:::-;10341:63;;10296:118;10453:2;10479:53;10524:7;10515:6;10504:9;10500:22;10479:53;:::i;:::-;10469:63;;10424:118;10609:2;10598:9;10594:18;10581:32;10640:18;10632:6;10629:30;10626:117;;;10662:79;;:::i;:::-;10626:117;10767:62;10821:7;10812:6;10801:9;10797:22;10767:62;:::i;:::-;10757:72;;10552:287;9903:943;;;;;;;:::o;10852:308::-;10914:4;11004:18;10996:6;10993:30;10990:56;;;11026:18;;:::i;:::-;10990:56;11064:29;11086:6;11064:29;:::i;:::-;11056:37;;11148:4;11142;11138:15;11130:23;;10852:308;;;:::o;11166:412::-;11244:5;11269:66;11285:49;11327:6;11285:49;:::i;:::-;11269:66;:::i;:::-;11260:75;;11358:6;11351:5;11344:21;11396:4;11389:5;11385:16;11434:3;11425:6;11420:3;11416:16;11413:25;11410:112;;;11441:79;;:::i;:::-;11410:112;11531:41;11565:6;11560:3;11555;11531:41;:::i;:::-;11250:328;11166:412;;;;;:::o;11598:340::-;11654:5;11703:3;11696:4;11688:6;11684:17;11680:27;11670:122;;11711:79;;:::i;:::-;11670:122;11828:6;11815:20;11853:79;11928:3;11920:6;11913:4;11905:6;11901:17;11853:79;:::i;:::-;11844:88;;11660:278;11598:340;;;;:::o;11944:654::-;12022:6;12030;12079:2;12067:9;12058:7;12054:23;12050:32;12047:119;;;12085:79;;:::i;:::-;12047:119;12205:1;12230:53;12275:7;12266:6;12255:9;12251:22;12230:53;:::i;:::-;12220:63;;12176:117;12360:2;12349:9;12345:18;12332:32;12391:18;12383:6;12380:30;12377:117;;;12413:79;;:::i;:::-;12377:117;12518:63;12573:7;12564:6;12553:9;12549:22;12518:63;:::i;:::-;12508:73;;12303:288;11944:654;;;;;:::o;12604:474::-;12672:6;12680;12729:2;12717:9;12708:7;12704:23;12700:32;12697:119;;;12735:79;;:::i;:::-;12697:119;12855:1;12880:53;12925:7;12916:6;12905:9;12901:22;12880:53;:::i;:::-;12870:63;;12826:117;12982:2;13008:53;13053:7;13044:6;13033:9;13029:22;13008:53;:::i;:::-;12998:63;;12953:118;12604:474;;;;;:::o;13084:180::-;13132:77;13129:1;13122:88;13229:4;13226:1;13219:15;13253:4;13250:1;13243:15;13270:320;13314:6;13351:1;13345:4;13341:12;13331:22;;13398:1;13392:4;13388:12;13419:18;13409:81;;13475:4;13467:6;13463:17;13453:27;;13409:81;13537:2;13529:6;13526:14;13506:18;13503:38;13500:84;;;13556:18;;:::i;:::-;13500:84;13321:269;13270:320;;;:::o;13596:231::-;13736:34;13732:1;13724:6;13720:14;13713:58;13805:14;13800:2;13792:6;13788:15;13781:39;13596:231;:::o;13833:366::-;13975:3;13996:67;14060:2;14055:3;13996:67;:::i;:::-;13989:74;;14072:93;14161:3;14072:93;:::i;:::-;14190:2;14185:3;14181:12;14174:19;;13833:366;;;:::o;14205:419::-;14371:4;14409:2;14398:9;14394:18;14386:26;;14458:9;14452:4;14448:20;14444:1;14433:9;14429:17;14422:47;14486:131;14612:4;14486:131;:::i;:::-;14478:139;;14205:419;;;:::o;14630:220::-;14770:34;14766:1;14758:6;14754:14;14747:58;14839:3;14834:2;14826:6;14822:15;14815:28;14630:220;:::o;14856:366::-;14998:3;15019:67;15083:2;15078:3;15019:67;:::i;:::-;15012:74;;15095:93;15184:3;15095:93;:::i;:::-;15213:2;15208:3;15204:12;15197:19;;14856:366;;;:::o;15228:419::-;15394:4;15432:2;15421:9;15417:18;15409:26;;15481:9;15475:4;15471:20;15467:1;15456:9;15452:17;15445:47;15509:131;15635:4;15509:131;:::i;:::-;15501:139;;15228:419;;;:::o;15653:243::-;15793:34;15789:1;15781:6;15777:14;15770:58;15862:26;15857:2;15849:6;15845:15;15838:51;15653:243;:::o;15902:366::-;16044:3;16065:67;16129:2;16124:3;16065:67;:::i;:::-;16058:74;;16141:93;16230:3;16141:93;:::i;:::-;16259:2;16254:3;16250:12;16243:19;;15902:366;;;:::o;16274:419::-;16440:4;16478:2;16467:9;16463:18;16455:26;;16527:9;16521:4;16517:20;16513:1;16502:9;16498:17;16491:47;16555:131;16681:4;16555:131;:::i;:::-;16547:139;;16274:419;;;:::o;16699:236::-;16839:34;16835:1;16827:6;16823:14;16816:58;16908:19;16903:2;16895:6;16891:15;16884:44;16699:236;:::o;16941:366::-;17083:3;17104:67;17168:2;17163:3;17104:67;:::i;:::-;17097:74;;17180:93;17269:3;17180:93;:::i;:::-;17298:2;17293:3;17289:12;17282:19;;16941:366;;;:::o;17313:419::-;17479:4;17517:2;17506:9;17502:18;17494:26;;17566:9;17560:4;17556:20;17552:1;17541:9;17537:17;17530:47;17594:131;17720:4;17594:131;:::i;:::-;17586:139;;17313:419;;;:::o;17738:180::-;17786:77;17783:1;17776:88;17883:4;17880:1;17873:15;17907:4;17904:1;17897:15;17924:348;17964:7;17987:20;18005:1;17987:20;:::i;:::-;17982:25;;18021:20;18039:1;18021:20;:::i;:::-;18016:25;;18209:1;18141:66;18137:74;18134:1;18131:81;18126:1;18119:9;18112:17;18108:105;18105:131;;;18216:18;;:::i;:::-;18105:131;18264:1;18261;18257:9;18246:20;;17924:348;;;;:::o;18278:180::-;18326:77;18323:1;18316:88;18423:4;18420:1;18413:15;18447:4;18444:1;18437:15;18464:185;18504:1;18521:20;18539:1;18521:20;:::i;:::-;18516:25;;18555:20;18573:1;18555:20;:::i;:::-;18550:25;;18594:1;18584:35;;18599:18;;:::i;:::-;18584:35;18641:1;18638;18634:9;18629:14;;18464:185;;;;:::o;18655:228::-;18795:34;18791:1;18783:6;18779:14;18772:58;18864:11;18859:2;18851:6;18847:15;18840:36;18655:228;:::o;18889:366::-;19031:3;19052:67;19116:2;19111:3;19052:67;:::i;:::-;19045:74;;19128:93;19217:3;19128:93;:::i;:::-;19246:2;19241:3;19237:12;19230:19;;18889:366;;;:::o;19261:419::-;19427:4;19465:2;19454:9;19450:18;19442:26;;19514:9;19508:4;19504:20;19500:1;19489:9;19485:17;19478:47;19542:131;19668:4;19542:131;:::i;:::-;19534:139;;19261:419;;;:::o;19686:229::-;19826:34;19822:1;19814:6;19810:14;19803:58;19895:12;19890:2;19882:6;19878:15;19871:37;19686:229;:::o;19921:366::-;20063:3;20084:67;20148:2;20143:3;20084:67;:::i;:::-;20077:74;;20160:93;20249:3;20160:93;:::i;:::-;20278:2;20273:3;20269:12;20262:19;;19921:366;;;:::o;20293:419::-;20459:4;20497:2;20486:9;20482:18;20474:26;;20546:9;20540:4;20536:20;20532:1;20521:9;20517:17;20510:47;20574:131;20700:4;20574:131;:::i;:::-;20566:139;;20293:419;;;:::o;20718:182::-;20858:34;20854:1;20846:6;20842:14;20835:58;20718:182;:::o;20906:366::-;21048:3;21069:67;21133:2;21128:3;21069:67;:::i;:::-;21062:74;;21145:93;21234:3;21145:93;:::i;:::-;21263:2;21258:3;21254:12;21247:19;;20906:366;;;:::o;21278:419::-;21444:4;21482:2;21471:9;21467:18;21459:26;;21531:9;21525:4;21521:20;21517:1;21506:9;21502:17;21495:47;21559:131;21685:4;21559:131;:::i;:::-;21551:139;;21278:419;;;:::o;21703:234::-;21843:34;21839:1;21831:6;21827:14;21820:58;21912:17;21907:2;21899:6;21895:15;21888:42;21703:234;:::o;21943:366::-;22085:3;22106:67;22170:2;22165:3;22106:67;:::i;:::-;22099:74;;22182:93;22271:3;22182:93;:::i;:::-;22300:2;22295:3;22291:12;22284:19;;21943:366;;;:::o;22315:419::-;22481:4;22519:2;22508:9;22504:18;22496:26;;22568:9;22562:4;22558:20;22554:1;22543:9;22539:17;22532:47;22596:131;22722:4;22596:131;:::i;:::-;22588:139;;22315:419;;;:::o;22740:225::-;22880:34;22876:1;22868:6;22864:14;22857:58;22949:8;22944:2;22936:6;22932:15;22925:33;22740:225;:::o;22971:366::-;23113:3;23134:67;23198:2;23193:3;23134:67;:::i;:::-;23127:74;;23210:93;23299:3;23210:93;:::i;:::-;23328:2;23323:3;23319:12;23312:19;;22971:366;;;:::o;23343:419::-;23509:4;23547:2;23536:9;23532:18;23524:26;;23596:9;23590:4;23586:20;23582:1;23571:9;23567:17;23560:47;23624:131;23750:4;23624:131;:::i;:::-;23616:139;;23343:419;;;:::o;23768:231::-;23908:34;23904:1;23896:6;23892:14;23885:58;23977:14;23972:2;23964:6;23960:15;23953:39;23768:231;:::o;24005:366::-;24147:3;24168:67;24232:2;24227:3;24168:67;:::i;:::-;24161:74;;24244:93;24333:3;24244:93;:::i;:::-;24362:2;24357:3;24353:12;24346:19;;24005:366;;;:::o;24377:419::-;24543:4;24581:2;24570:9;24566:18;24558:26;;24630:9;24624:4;24620:20;24616:1;24605:9;24601:17;24594:47;24658:131;24784:4;24658:131;:::i;:::-;24650:139;;24377:419;;;:::o;24802:228::-;24942:34;24938:1;24930:6;24926:14;24919:58;25011:11;25006:2;24998:6;24994:15;24987:36;24802:228;:::o;25036:366::-;25178:3;25199:67;25263:2;25258:3;25199:67;:::i;:::-;25192:74;;25275:93;25364:3;25275:93;:::i;:::-;25393:2;25388:3;25384:12;25377:19;;25036:366;;;:::o;25408:419::-;25574:4;25612:2;25601:9;25597:18;25589:26;;25661:9;25655:4;25651:20;25647:1;25636:9;25632:17;25625:47;25689:131;25815:4;25689:131;:::i;:::-;25681:139;;25408:419;;;:::o;25833:223::-;25973:34;25969:1;25961:6;25957:14;25950:58;26042:6;26037:2;26029:6;26025:15;26018:31;25833:223;:::o;26062:366::-;26204:3;26225:67;26289:2;26284:3;26225:67;:::i;:::-;26218:74;;26301:93;26390:3;26301:93;:::i;:::-;26419:2;26414:3;26410:12;26403:19;;26062:366;;;:::o;26434:419::-;26600:4;26638:2;26627:9;26623:18;26615:26;;26687:9;26681:4;26677:20;26673:1;26662:9;26658:17;26651:47;26715:131;26841:4;26715:131;:::i;:::-;26707:139;;26434:419;;;:::o;26859:191::-;26899:4;26919:20;26937:1;26919:20;:::i;:::-;26914:25;;26953:20;26971:1;26953:20;:::i;:::-;26948:25;;26992:1;26989;26986:8;26983:34;;;26997:18;;:::i;:::-;26983:34;27042:1;27039;27035:9;27027:17;;26859:191;;;;:::o;27056:305::-;27096:3;27115:20;27133:1;27115:20;:::i;:::-;27110:25;;27149:20;27167:1;27149:20;:::i;:::-;27144:25;;27303:1;27235:66;27231:74;27228:1;27225:81;27222:107;;;27309:18;;:::i;:::-;27222:107;27353:1;27350;27346:9;27339:16;;27056:305;;;;:::o;27367:175::-;27507:27;27503:1;27495:6;27491:14;27484:51;27367:175;:::o;27548:366::-;27690:3;27711:67;27775:2;27770:3;27711:67;:::i;:::-;27704:74;;27787:93;27876:3;27787:93;:::i;:::-;27905:2;27900:3;27896:12;27889:19;;27548:366;;;:::o;27920:419::-;28086:4;28124:2;28113:9;28109:18;28101:26;;28173:9;28167:4;28163:20;28159:1;28148:9;28144:17;28137:47;28201:131;28327:4;28201:131;:::i;:::-;28193:139;;27920:419;;;:::o;28345:237::-;28485:34;28481:1;28473:6;28469:14;28462:58;28554:20;28549:2;28541:6;28537:15;28530:45;28345:237;:::o;28588:366::-;28730:3;28751:67;28815:2;28810:3;28751:67;:::i;:::-;28744:74;;28827:93;28916:3;28827:93;:::i;:::-;28945:2;28940:3;28936:12;28929:19;;28588:366;;;:::o;28960:419::-;29126:4;29164:2;29153:9;29149:18;29141:26;;29213:9;29207:4;29203:20;29199:1;29188:9;29184:17;29177:47;29241:131;29367:4;29241:131;:::i;:::-;29233:139;;28960:419;;;:::o;29385:182::-;29525:34;29521:1;29513:6;29509:14;29502:58;29385:182;:::o;29573:366::-;29715:3;29736:67;29800:2;29795:3;29736:67;:::i;:::-;29729:74;;29812:93;29901:3;29812:93;:::i;:::-;29930:2;29925:3;29921:12;29914:19;;29573:366;;;:::o;29945:419::-;30111:4;30149:2;30138:9;30134:18;30126:26;;30198:9;30192:4;30188:20;30184:1;30173:9;30169:17;30162:47;30226:131;30352:4;30226:131;:::i;:::-;30218:139;;29945:419;;;:::o;30370:178::-;30510:30;30506:1;30498:6;30494:14;30487:54;30370:178;:::o;30554:366::-;30696:3;30717:67;30781:2;30776:3;30717:67;:::i;:::-;30710:74;;30793:93;30882:3;30793:93;:::i;:::-;30911:2;30906:3;30902:12;30895:19;;30554:366;;;:::o;30926:419::-;31092:4;31130:2;31119:9;31115:18;31107:26;;31179:9;31173:4;31169:20;31165:1;31154:9;31150:17;31143:47;31207:131;31333:4;31207:131;:::i;:::-;31199:139;;30926:419;;;:::o;31351:98::-;31402:6;31436:5;31430:12;31420:22;;31351:98;;;:::o;31455:168::-;31538:11;31572:6;31567:3;31560:19;31612:4;31607:3;31603:14;31588:29;;31455:168;;;;:::o;31629:360::-;31715:3;31743:38;31775:5;31743:38;:::i;:::-;31797:70;31860:6;31855:3;31797:70;:::i;:::-;31790:77;;31876:52;31921:6;31916:3;31909:4;31902:5;31898:16;31876:52;:::i;:::-;31953:29;31975:6;31953:29;:::i;:::-;31948:3;31944:39;31937:46;;31719:270;31629:360;;;;:::o;31995:640::-;32190:4;32228:3;32217:9;32213:19;32205:27;;32242:71;32310:1;32299:9;32295:17;32286:6;32242:71;:::i;:::-;32323:72;32391:2;32380:9;32376:18;32367:6;32323:72;:::i;:::-;32405;32473:2;32462:9;32458:18;32449:6;32405:72;:::i;:::-;32524:9;32518:4;32514:20;32509:2;32498:9;32494:18;32487:48;32552:76;32623:4;32614:6;32552:76;:::i;:::-;32544:84;;31995:640;;;;;;;:::o;32641:141::-;32697:5;32728:6;32722:13;32713:22;;32744:32;32770:5;32744:32;:::i;:::-;32641:141;;;;:::o;32788:349::-;32857:6;32906:2;32894:9;32885:7;32881:23;32877:32;32874:119;;;32912:79;;:::i;:::-;32874:119;33032:1;33057:63;33112:7;33103:6;33092:9;33088:22;33057:63;:::i;:::-;33047:73;;33003:127;32788:349;;;;:::o

Swarm Source

ipfs://db2f59ee437f3b64aec30d276c61f77648af7e9735089548dbdfcfcdc678aa5c
Loading