ETH Price: $3,998.40 (+3.48%)

Token

SWEETS (SWEETS)
 

Overview

Max Total Supply

0 SWEETS

Holders

2,059

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 SWEETS
0xb95d3bd430d5ae8959dbf82cc39f83c36aa5be1d
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
SWEETS

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

    /**
     * @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);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev 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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);
}

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

// File: contracts/SWEETS.sol


pragma solidity 0.8.12;




contract SWEETS is ERC721, Ownable, ReentrancyGuard {

    string[] private shapes = [
    "Pillhead",
    "Smiler",
    "Spektral",
    "Helix",
    "Tesseract",
    "Torus",
    "Obelisk"
    ];

    string[] private sizes = [
    "Nibble",
    "Bite",
    "Devour"
    ];

    string[] private surfaces = [
    "Hydro",
    "Plated",
    "Tactile"
    ];

    string[] private colors = [
    "#E7434F",
    "#E7973D",
    "#E7DC4E",
    "#5CE75D",
    "#2981E7",
    "#5D21E7",
    "#E777E4",
    "#E7E7E7",
    "#312624",
    "#E7969F",
    "#E7B277",
    "#E7DD8F",
    "#8CE7C3",
    "#87B2E7",
    "#A082E7",
    "#E4B7E7"
    ];

    string public algorithm;
    uint256 private n;

    constructor() ERC721 ("SWEETS", "SWEETS") Ownable() {}

    function mint() public nonReentrant {
        require(n < 4500);
        n++;
        _safeMint(msg.sender, n);
    }

    function ownerMint(uint256 id) public nonReentrant onlyOwner {
        require(id > 4500 && id <= 5000);
        _safeMint(msg.sender, id);
    }

    function setAlgo(string memory algo) public onlyOwner {
        algorithm = algo;
    }

    function rand(uint256 id, string memory trait, string[] memory values) internal pure returns (string memory) {
        uint256 k = uint256(keccak256(abi.encodePacked(trait, toString(id))));
        return values[k % values.length];
    }

    function getSize(uint256 id) public view returns (string memory) {
        return rand(id, "size", sizes);
    }

    function getSurface(uint256 id) public view returns (string memory) {
        return rand(id, "surface", surfaces);
    }

    function getShape(uint256 id) public view returns (string memory) {
        return rand(id, "shape", shapes);
    }

    function getParamValues(uint256 tokenId) public view returns (string[4] memory, string memory shape, string memory size, string memory surface) {
        return (getPalette(tokenId), getShape(tokenId), getSize(tokenId), getSurface(tokenId));
    }

    function getPalette(uint256 id) public view returns (string[4] memory) {
        string[4] memory palette;
        palette[0] = rand(id, "color 0", colors);
        palette[1] = rand(id, "color 1", colors);
        palette[2] = rand(id, "color 2", colors);
        palette[3] = rand(id, "color 3", colors);
        return palette;
    }

    function toString(uint256 value) internal pure returns (string memory) {
        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);
    }

    function _baseURI() internal view override returns (string memory) {
        return "https://rendering.rove.to/v1/rendered-nft/1/metadata/";
    }
}

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":[],"name":"algorithm","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getPalette","outputs":[{"internalType":"string[4]","name":"","type":"string[4]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getParamValues","outputs":[{"internalType":"string[4]","name":"","type":"string[4]"},{"internalType":"string","name":"shape","type":"string"},{"internalType":"string","name":"size","type":"string"},{"internalType":"string","name":"surface","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getShape","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getSize","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getSurface","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"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":"id","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"algo","type":"string"}],"name":"setAlgo","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"}]

60806040526040518060e001604052806040518060400160405280600881526020017f50696c6c6865616400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f536d696c6572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f5370656b7472616c00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f48656c697800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f546573736572616374000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f546f72757300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4f62656c69736b000000000000000000000000000000000000000000000000008152508152506008906007620001bc929190620008ce565b5060405180606001604052806040518060400160405280600681526020017f4e6962626c65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f426974650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4465766f7572000000000000000000000000000000000000000000000000000081525081525060099060036200028992919062000935565b5060405180606001604052806040518060400160405280600581526020017f487964726f00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f506c61746564000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f54616374696c6500000000000000000000000000000000000000000000000000815250815250600a9060036200035692919062000935565b506040518061020001604052806040518060400160405280600781526020017f234537343334460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234537393733440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234537444334450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233543453735440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233239383145370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233544323145370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234537373745340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234537453745370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233331323632340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234537393639460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234537423237370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234537444438460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233843453743330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233837423245370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234130383245370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2345344237453700000000000000000000000000000000000000000000000000815250815250600b906010620007239291906200099c565b503480156200073157600080fd5b506040518060400160405280600681526020017f53574545545300000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f53574545545300000000000000000000000000000000000000000000000000008152508160009080519060200190620007b692919062000a03565b508060019080519060200190620007cf92919062000a03565b505050620007f2620007e66200080060201b60201c565b6200080860201b60201c565b600160078190555062000b86565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805482825590600052602060002090810192821562000922579160200282015b82811115620009215782518290805190602001906200091092919062000a03565b5091602001919060010190620008ef565b5b50905062000931919062000a94565b5090565b82805482825590600052602060002090810192821562000989579160200282015b82811115620009885782518290805190602001906200097792919062000a03565b509160200191906001019062000956565b5b50905062000998919062000a94565b5090565b828054828255906000526020600020908101928215620009f0579160200282015b82811115620009ef578251829080519060200190620009de92919062000a03565b5091602001919060010190620009bd565b5b509050620009ff919062000a94565b5090565b82805462000a119062000b50565b90600052602060002090601f01602090048101928262000a35576000855562000a81565b82601f1062000a5057805160ff191683800117855562000a81565b8280016001018555821562000a81579182015b8281111562000a8057825182559160200191906001019062000a63565b5b50905062000a90919062000abc565b5090565b5b8082111562000ab8576000818162000aae919062000adb565b5060010162000a95565b5090565b5b8082111562000ad757600081600090555060010162000abd565b5090565b50805462000ae99062000b50565b6000825580601f1062000afd575062000b1e565b601f01602090049060005260206000209081019062000b1d919062000abc565b5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b6957607f821691505b6020821081141562000b805762000b7f62000b21565b5b50919050565b6139bc8062000b966000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c8063505e570a116100de578063a22cb46511610097578063c87b56dd11610071578063c87b56dd1461045f578063e985e9c51461048f578063f19e75d4146104bf578063f2fde38b146104db57610173565b8063a22cb465146103f4578063b88d4fde14610410578063c0dca2391461042c57610173565b8063505e570a1461031e5780636352211e1461034e57806370a082311461037e578063715018a6146103ae5780638da5cb5b146103b857806395d89b41146103d657610173565b806311ad80471161013057806311ad80471461025e5780631249c58b1461028e57806322ced7211461029857806323b872dd146102c85780632e58ca46146102e457806342842e0e1461030257610173565b806301ffc9a714610178578063023c23db146101a857806306fdde03146101d85780630764da1d146101f6578063081812fc14610212578063095ea7b314610242575b600080fd5b610192600480360381019061018d919061270f565b6104f7565b60405161019f9190612757565b60405180910390f35b6101c260048036038101906101bd91906127a8565b6105d9565b6040516101cf919061286e565b60405180910390f35b6101e06106f3565b6040516101ed919061286e565b60405180910390f35b610210600480360381019061020b91906129c5565b610785565b005b61022c600480360381019061022791906127a8565b6107a7565b6040516102399190612a4f565b60405180910390f35b61025c60048036038101906102579190612a96565b6107ed565b005b610278600480360381019061027391906127a8565b610905565b604051610285919061286e565b60405180910390f35b610296610a1f565b005b6102b260048036038101906102ad91906127a8565b610aab565b6040516102bf919061286e565b60405180910390f35b6102e260048036038101906102dd9190612ad6565b610bc5565b005b6102ec610c25565b6040516102f9919061286e565b60405180910390f35b61031c60048036038101906103179190612ad6565b610cb3565b005b610338600480360381019061033391906127a8565b610cd3565b6040516103459190612c29565b60405180910390f35b610368600480360381019061036391906127a8565b6111a0565b6040516103759190612a4f565b60405180910390f35b61039860048036038101906103939190612c4b565b611252565b6040516103a59190612c87565b60405180910390f35b6103b661130a565b005b6103c061131e565b6040516103cd9190612a4f565b60405180910390f35b6103de611348565b6040516103eb919061286e565b60405180910390f35b61040e60048036038101906104099190612cce565b6113da565b005b61042a60048036038101906104259190612daf565b6113f0565b005b610446600480360381019061044191906127a8565b611452565b6040516104569493929190612e32565b60405180910390f35b610479600480360381019061047491906127a8565b611492565b604051610486919061286e565b60405180910390f35b6104a960048036038101906104a49190612e93565b6114fa565b6040516104b69190612757565b60405180910390f35b6104d960048036038101906104d491906127a8565b61158e565b005b6104f560048036038101906104f09190612c4b565b611615565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105c257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105d257506105d182611699565b5b9050919050565b60606106ec826040518060400160405280600481526020017f73697a65000000000000000000000000000000000000000000000000000000008152506009805480602002602001604051908101604052809291908181526020016000905b828210156106e357838290600052602060002001805461065690612f02565b80601f016020809104026020016040519081016040528092919081815260200182805461068290612f02565b80156106cf5780601f106106a4576101008083540402835291602001916106cf565b820191906000526020600020905b8154815290600101906020018083116106b257829003601f168201915b505050505081526020019060010190610637565b50505050611703565b9050919050565b60606000805461070290612f02565b80601f016020809104026020016040519081016040528092919081815260200182805461072e90612f02565b801561077b5780601f106107505761010080835404028352916020019161077b565b820191906000526020600020905b81548152906001019060200180831161075e57829003601f168201915b5050505050905090565b61078d61176e565b80600c90805190602001906107a39291906125d9565b5050565b60006107b2826117ec565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107f8826111a0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086090612fa6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610888611837565b73ffffffffffffffffffffffffffffffffffffffff1614806108b757506108b6816108b1611837565b6114fa565b5b6108f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ed90613038565b60405180910390fd5b610900838361183f565b505050565b6060610a18826040518060400160405280600781526020017f7375726661636500000000000000000000000000000000000000000000000000815250600a805480602002602001604051908101604052809291908181526020016000905b82821015610a0f57838290600052602060002001805461098290612f02565b80601f01602080910402602001604051908101604052809291908181526020018280546109ae90612f02565b80156109fb5780601f106109d0576101008083540402835291602001916109fb565b820191906000526020600020905b8154815290600101906020018083116109de57829003601f168201915b505050505081526020019060010190610963565b50505050611703565b9050919050565b60026007541415610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906130a4565b60405180910390fd5b6002600781905550611194600d5410610a7d57600080fd5b600d6000815480929190610a90906130f3565b9190505550610aa133600d546118f8565b6001600781905550565b6060610bbe826040518060400160405280600581526020017f73686170650000000000000000000000000000000000000000000000000000008152506008805480602002602001604051908101604052809291908181526020016000905b82821015610bb5578382906000526020600020018054610b2890612f02565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5490612f02565b8015610ba15780601f10610b7657610100808354040283529160200191610ba1565b820191906000526020600020905b815481529060010190602001808311610b8457829003601f168201915b505050505081526020019060010190610b09565b50505050611703565b9050919050565b610bd6610bd0611837565b82611916565b610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c906131ae565b60405180910390fd5b610c208383836119ab565b505050565b600c8054610c3290612f02565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5e90612f02565b8015610cab5780601f10610c8057610100808354040283529160200191610cab565b820191906000526020600020905b815481529060010190602001808311610c8e57829003601f168201915b505050505081565b610cce838383604051806020016040528060008152506113f0565b505050565b610cdb61265f565b610ce361265f565b610df4836040518060400160405280600781526020017f636f6c6f72203000000000000000000000000000000000000000000000000000815250600b805480602002602001604051908101604052809291908181526020016000905b82821015610deb578382906000526020600020018054610d5e90612f02565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8a90612f02565b8015610dd75780601f10610dac57610100808354040283529160200191610dd7565b820191906000526020600020905b815481529060010190602001808311610dba57829003601f168201915b505050505081526020019060010190610d3f565b50505050611703565b81600060048110610e0857610e076131ce565b5b6020020181905250610f21836040518060400160405280600781526020017f636f6c6f72203100000000000000000000000000000000000000000000000000815250600b805480602002602001604051908101604052809291908181526020016000905b82821015610f18578382906000526020600020018054610e8b90612f02565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb790612f02565b8015610f045780601f10610ed957610100808354040283529160200191610f04565b820191906000526020600020905b815481529060010190602001808311610ee757829003601f168201915b505050505081526020019060010190610e6c565b50505050611703565b81600160048110610f3557610f346131ce565b5b602002018190525061104e836040518060400160405280600781526020017f636f6c6f72203200000000000000000000000000000000000000000000000000815250600b805480602002602001604051908101604052809291908181526020016000905b82821015611045578382906000526020600020018054610fb890612f02565b80601f0160208091040260200160405190810160405280929190818152602001828054610fe490612f02565b80156110315780601f1061100657610100808354040283529160200191611031565b820191906000526020600020905b81548152906001019060200180831161101457829003601f168201915b505050505081526020019060010190610f99565b50505050611703565b81600260048110611062576110616131ce565b5b602002018190525061117b836040518060400160405280600781526020017f636f6c6f72203300000000000000000000000000000000000000000000000000815250600b805480602002602001604051908101604052809291908181526020016000905b828210156111725783829060005260206000200180546110e590612f02565b80601f016020809104026020016040519081016040528092919081815260200182805461111190612f02565b801561115e5780601f106111335761010080835404028352916020019161115e565b820191906000526020600020905b81548152906001019060200180831161114157829003601f168201915b5050505050815260200190600101906110c6565b50505050611703565b8160036004811061118f5761118e6131ce565b5b602002018190525080915050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124090613249565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba906132db565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61131261176e565b61131c6000611c12565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461135790612f02565b80601f016020809104026020016040519081016040528092919081815260200182805461138390612f02565b80156113d05780601f106113a5576101008083540402835291602001916113d0565b820191906000526020600020905b8154815290600101906020018083116113b357829003601f168201915b5050505050905090565b6113ec6113e5611837565b8383611cd8565b5050565b6114016113fb611837565b83611916565b611440576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611437906131ae565b60405180910390fd5b61144c84848484611e45565b50505050565b61145a61265f565b606080606061146885610cd3565b61147186610aab565b61147a876105d9565b61148388610905565b93509350935093509193509193565b606061149d826117ec565b60006114a7611ea1565b905060008151116114c757604051806020016040528060008152506114f2565b806114d184611ec1565b6040516020016114e2929190613337565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600260075414156115d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cb906130a4565b60405180910390fd5b60026007819055506115e461176e565b611194811180156115f757506113888111155b61160057600080fd5b61160a33826118f8565b600160078190555050565b61161d61176e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561168d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611684906133cd565b60405180910390fd5b61169681611c12565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606060008361171186612022565b604051602001611722929190613337565b6040516020818303038152906040528051906020012060001c90508283518261174b919061341c565b8151811061175c5761175b6131ce565b5b60200260200101519150509392505050565b611776611837565b73ffffffffffffffffffffffffffffffffffffffff1661179461131e565b73ffffffffffffffffffffffffffffffffffffffff16146117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e190613499565b60405180910390fd5b565b6117f581612183565b611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613249565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118b2836111a0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6119128282604051806020016040528060008152506121ef565b5050565b600080611922836111a0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611964575061196381856114fa565b5b806119a257508373ffffffffffffffffffffffffffffffffffffffff1661198a846107a7565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119cb826111a0565b73ffffffffffffffffffffffffffffffffffffffff1614611a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a189061352b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a88906135bd565b60405180910390fd5b611a9c83838361224a565b611aa760008261183f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611af791906135dd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b4e9190613611565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c0d83838361224f565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3e906136b3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e389190612757565b60405180910390a3505050565b611e508484846119ab565b611e5c84848484612254565b611e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9290613745565b60405180910390fd5b50505050565b606060405180606001604052806035815260200161395260359139905090565b60606000821415611f09576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061201d565b600082905060005b60008214611f3b578080611f24906130f3565b915050600a82611f349190613765565b9150611f11565b60008167ffffffffffffffff811115611f5757611f5661289a565b5b6040519080825280601f01601f191660200182016040528015611f895781602001600182028036833780820191505090505b5090505b6000851461201657600182611fa291906135dd565b9150600a85611fb1919061341c565b6030611fbd9190613611565b60f81b818381518110611fd357611fd26131ce565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561200f9190613765565b9450611f8d565b8093505050505b919050565b6060600082141561206a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061217e565b600082905060005b6000821461209c578080612085906130f3565b915050600a826120959190613765565b9150612072565b60008167ffffffffffffffff8111156120b8576120b761289a565b5b6040519080825280601f01601f1916602001820160405280156120ea5781602001600182028036833780820191505090505b5090505b600085146121775760018261210391906135dd565b9150600a85612112919061341c565b603061211e9190613611565b60f81b818381518110612134576121336131ce565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121709190613765565b94506120ee565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6121f983836123dc565b6122066000848484612254565b612245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223c90613745565b60405180910390fd5b505050565b505050565b505050565b60006122758473ffffffffffffffffffffffffffffffffffffffff166125b6565b156123cf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261229e611837565b8786866040518563ffffffff1660e01b81526004016122c094939291906137eb565b6020604051808303816000875af19250505080156122fc57506040513d601f19601f820116820180604052508101906122f9919061384c565b60015b61237f573d806000811461232c576040519150601f19603f3d011682016040523d82523d6000602084013e612331565b606091505b50600081511415612377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236e90613745565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506123d4565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561244c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612443906138c5565b60405180910390fd5b61245581612183565b15612495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248c90613931565b60405180910390fd5b6124a16000838361224a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f19190613611565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125b26000838361224f565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546125e590612f02565b90600052602060002090601f016020900481019282612607576000855561264e565b82601f1061262057805160ff191683800117855561264e565b8280016001018555821561264e579182015b8281111561264d578251825591602001919060010190612632565b5b50905061265b9190612686565b5090565b60405180608001604052806004905b606081526020019060019003908161266e5790505090565b5b8082111561269f576000816000905550600101612687565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6126ec816126b7565b81146126f757600080fd5b50565b600081359050612709816126e3565b92915050565b600060208284031215612725576127246126ad565b5b6000612733848285016126fa565b91505092915050565b60008115159050919050565b6127518161273c565b82525050565b600060208201905061276c6000830184612748565b92915050565b6000819050919050565b61278581612772565b811461279057600080fd5b50565b6000813590506127a28161277c565b92915050565b6000602082840312156127be576127bd6126ad565b5b60006127cc84828501612793565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561280f5780820151818401526020810190506127f4565b8381111561281e576000848401525b50505050565b6000601f19601f8301169050919050565b6000612840826127d5565b61284a81856127e0565b935061285a8185602086016127f1565b61286381612824565b840191505092915050565b600060208201905081810360008301526128888184612835565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6128d282612824565b810181811067ffffffffffffffff821117156128f1576128f061289a565b5b80604052505050565b60006129046126a3565b905061291082826128c9565b919050565b600067ffffffffffffffff8211156129305761292f61289a565b5b61293982612824565b9050602081019050919050565b82818337600083830152505050565b600061296861296384612915565b6128fa565b90508281526020810184848401111561298457612983612895565b5b61298f848285612946565b509392505050565b600082601f8301126129ac576129ab612890565b5b81356129bc848260208601612955565b91505092915050565b6000602082840312156129db576129da6126ad565b5b600082013567ffffffffffffffff8111156129f9576129f86126b2565b5b612a0584828501612997565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a3982612a0e565b9050919050565b612a4981612a2e565b82525050565b6000602082019050612a646000830184612a40565b92915050565b612a7381612a2e565b8114612a7e57600080fd5b50565b600081359050612a9081612a6a565b92915050565b60008060408385031215612aad57612aac6126ad565b5b6000612abb85828601612a81565b9250506020612acc85828601612793565b9150509250929050565b600080600060608486031215612aef57612aee6126ad565b5b6000612afd86828701612a81565b9350506020612b0e86828701612a81565b9250506040612b1f86828701612793565b9150509250925092565b600060049050919050565b600081905092915050565b6000819050919050565b600082825260208201905092915050565b6000612b65826127d5565b612b6f8185612b49565b9350612b7f8185602086016127f1565b612b8881612824565b840191505092915050565b6000612b9f8383612b5a565b905092915050565b6000602082019050919050565b6000612bbf82612b29565b612bc98185612b34565b935083602082028501612bdb85612b3f565b8060005b85811015612c175784840389528151612bf88582612b93565b9450612c0383612ba7565b925060208a01995050600181019050612bdf565b50829750879550505050505092915050565b60006020820190508181036000830152612c438184612bb4565b905092915050565b600060208284031215612c6157612c606126ad565b5b6000612c6f84828501612a81565b91505092915050565b612c8181612772565b82525050565b6000602082019050612c9c6000830184612c78565b92915050565b612cab8161273c565b8114612cb657600080fd5b50565b600081359050612cc881612ca2565b92915050565b60008060408385031215612ce557612ce46126ad565b5b6000612cf385828601612a81565b9250506020612d0485828601612cb9565b9150509250929050565b600067ffffffffffffffff821115612d2957612d2861289a565b5b612d3282612824565b9050602081019050919050565b6000612d52612d4d84612d0e565b6128fa565b905082815260208101848484011115612d6e57612d6d612895565b5b612d79848285612946565b509392505050565b600082601f830112612d9657612d95612890565b5b8135612da6848260208601612d3f565b91505092915050565b60008060008060808587031215612dc957612dc86126ad565b5b6000612dd787828801612a81565b9450506020612de887828801612a81565b9350506040612df987828801612793565b925050606085013567ffffffffffffffff811115612e1a57612e196126b2565b5b612e2687828801612d81565b91505092959194509250565b60006080820190508181036000830152612e4c8187612bb4565b90508181036020830152612e608186612835565b90508181036040830152612e748185612835565b90508181036060830152612e888184612835565b905095945050505050565b60008060408385031215612eaa57612ea96126ad565b5b6000612eb885828601612a81565b9250506020612ec985828601612a81565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f1a57607f821691505b60208210811415612f2e57612f2d612ed3565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f906021836127e0565b9150612f9b82612f34565b604082019050919050565b60006020820190508181036000830152612fbf81612f83565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613022603e836127e0565b915061302d82612fc6565b604082019050919050565b6000602082019050818103600083015261305181613015565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061308e601f836127e0565b915061309982613058565b602082019050919050565b600060208201905081810360008301526130bd81613081565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130fe82612772565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613131576131306130c4565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613198602e836127e0565b91506131a38261313c565b604082019050919050565b600060208201905081810360008301526131c78161318b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006132336018836127e0565b915061323e826131fd565b602082019050919050565b6000602082019050818103600083015261326281613226565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006132c56029836127e0565b91506132d082613269565b604082019050919050565b600060208201905081810360008301526132f4816132b8565b9050919050565b600081905092915050565b6000613311826127d5565b61331b81856132fb565b935061332b8185602086016127f1565b80840191505092915050565b60006133438285613306565b915061334f8284613306565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006133b76026836127e0565b91506133c28261335b565b604082019050919050565b600060208201905081810360008301526133e6816133aa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061342782612772565b915061343283612772565b925082613442576134416133ed565b5b828206905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006134836020836127e0565b915061348e8261344d565b602082019050919050565b600060208201905081810360008301526134b281613476565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006135156025836127e0565b9150613520826134b9565b604082019050919050565b6000602082019050818103600083015261354481613508565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006135a76024836127e0565b91506135b28261354b565b604082019050919050565b600060208201905081810360008301526135d68161359a565b9050919050565b60006135e882612772565b91506135f383612772565b925082821015613606576136056130c4565b5b828203905092915050565b600061361c82612772565b915061362783612772565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561365c5761365b6130c4565b5b828201905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061369d6019836127e0565b91506136a882613667565b602082019050919050565b600060208201905081810360008301526136cc81613690565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061372f6032836127e0565b915061373a826136d3565b604082019050919050565b6000602082019050818103600083015261375e81613722565b9050919050565b600061377082612772565b915061377b83612772565b92508261378b5761378a6133ed565b5b828204905092915050565b600081519050919050565b600082825260208201905092915050565b60006137bd82613796565b6137c781856137a1565b93506137d78185602086016127f1565b6137e081612824565b840191505092915050565b60006080820190506138006000830187612a40565b61380d6020830186612a40565b61381a6040830185612c78565b818103606083015261382c81846137b2565b905095945050505050565b600081519050613846816126e3565b92915050565b600060208284031215613862576138616126ad565b5b600061387084828501613837565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006138af6020836127e0565b91506138ba82613879565b602082019050919050565b600060208201905081810360008301526138de816138a2565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061391b601c836127e0565b9150613926826138e5565b602082019050919050565b6000602082019050818103600083015261394a8161390e565b905091905056fe68747470733a2f2f72656e646572696e672e726f76652e746f2f76312f72656e64657265642d6e66742f312f6d657461646174612fa2646970667358221220e8f3a60bbab93bd4bbf4805c3ea32d0a479ea04eda24f250d58b55142aba0db064736f6c634300080c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c8063505e570a116100de578063a22cb46511610097578063c87b56dd11610071578063c87b56dd1461045f578063e985e9c51461048f578063f19e75d4146104bf578063f2fde38b146104db57610173565b8063a22cb465146103f4578063b88d4fde14610410578063c0dca2391461042c57610173565b8063505e570a1461031e5780636352211e1461034e57806370a082311461037e578063715018a6146103ae5780638da5cb5b146103b857806395d89b41146103d657610173565b806311ad80471161013057806311ad80471461025e5780631249c58b1461028e57806322ced7211461029857806323b872dd146102c85780632e58ca46146102e457806342842e0e1461030257610173565b806301ffc9a714610178578063023c23db146101a857806306fdde03146101d85780630764da1d146101f6578063081812fc14610212578063095ea7b314610242575b600080fd5b610192600480360381019061018d919061270f565b6104f7565b60405161019f9190612757565b60405180910390f35b6101c260048036038101906101bd91906127a8565b6105d9565b6040516101cf919061286e565b60405180910390f35b6101e06106f3565b6040516101ed919061286e565b60405180910390f35b610210600480360381019061020b91906129c5565b610785565b005b61022c600480360381019061022791906127a8565b6107a7565b6040516102399190612a4f565b60405180910390f35b61025c60048036038101906102579190612a96565b6107ed565b005b610278600480360381019061027391906127a8565b610905565b604051610285919061286e565b60405180910390f35b610296610a1f565b005b6102b260048036038101906102ad91906127a8565b610aab565b6040516102bf919061286e565b60405180910390f35b6102e260048036038101906102dd9190612ad6565b610bc5565b005b6102ec610c25565b6040516102f9919061286e565b60405180910390f35b61031c60048036038101906103179190612ad6565b610cb3565b005b610338600480360381019061033391906127a8565b610cd3565b6040516103459190612c29565b60405180910390f35b610368600480360381019061036391906127a8565b6111a0565b6040516103759190612a4f565b60405180910390f35b61039860048036038101906103939190612c4b565b611252565b6040516103a59190612c87565b60405180910390f35b6103b661130a565b005b6103c061131e565b6040516103cd9190612a4f565b60405180910390f35b6103de611348565b6040516103eb919061286e565b60405180910390f35b61040e60048036038101906104099190612cce565b6113da565b005b61042a60048036038101906104259190612daf565b6113f0565b005b610446600480360381019061044191906127a8565b611452565b6040516104569493929190612e32565b60405180910390f35b610479600480360381019061047491906127a8565b611492565b604051610486919061286e565b60405180910390f35b6104a960048036038101906104a49190612e93565b6114fa565b6040516104b69190612757565b60405180910390f35b6104d960048036038101906104d491906127a8565b61158e565b005b6104f560048036038101906104f09190612c4b565b611615565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105c257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105d257506105d182611699565b5b9050919050565b60606106ec826040518060400160405280600481526020017f73697a65000000000000000000000000000000000000000000000000000000008152506009805480602002602001604051908101604052809291908181526020016000905b828210156106e357838290600052602060002001805461065690612f02565b80601f016020809104026020016040519081016040528092919081815260200182805461068290612f02565b80156106cf5780601f106106a4576101008083540402835291602001916106cf565b820191906000526020600020905b8154815290600101906020018083116106b257829003601f168201915b505050505081526020019060010190610637565b50505050611703565b9050919050565b60606000805461070290612f02565b80601f016020809104026020016040519081016040528092919081815260200182805461072e90612f02565b801561077b5780601f106107505761010080835404028352916020019161077b565b820191906000526020600020905b81548152906001019060200180831161075e57829003601f168201915b5050505050905090565b61078d61176e565b80600c90805190602001906107a39291906125d9565b5050565b60006107b2826117ec565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107f8826111a0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086090612fa6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610888611837565b73ffffffffffffffffffffffffffffffffffffffff1614806108b757506108b6816108b1611837565b6114fa565b5b6108f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ed90613038565b60405180910390fd5b610900838361183f565b505050565b6060610a18826040518060400160405280600781526020017f7375726661636500000000000000000000000000000000000000000000000000815250600a805480602002602001604051908101604052809291908181526020016000905b82821015610a0f57838290600052602060002001805461098290612f02565b80601f01602080910402602001604051908101604052809291908181526020018280546109ae90612f02565b80156109fb5780601f106109d0576101008083540402835291602001916109fb565b820191906000526020600020905b8154815290600101906020018083116109de57829003601f168201915b505050505081526020019060010190610963565b50505050611703565b9050919050565b60026007541415610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906130a4565b60405180910390fd5b6002600781905550611194600d5410610a7d57600080fd5b600d6000815480929190610a90906130f3565b9190505550610aa133600d546118f8565b6001600781905550565b6060610bbe826040518060400160405280600581526020017f73686170650000000000000000000000000000000000000000000000000000008152506008805480602002602001604051908101604052809291908181526020016000905b82821015610bb5578382906000526020600020018054610b2890612f02565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5490612f02565b8015610ba15780601f10610b7657610100808354040283529160200191610ba1565b820191906000526020600020905b815481529060010190602001808311610b8457829003601f168201915b505050505081526020019060010190610b09565b50505050611703565b9050919050565b610bd6610bd0611837565b82611916565b610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c906131ae565b60405180910390fd5b610c208383836119ab565b505050565b600c8054610c3290612f02565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5e90612f02565b8015610cab5780601f10610c8057610100808354040283529160200191610cab565b820191906000526020600020905b815481529060010190602001808311610c8e57829003601f168201915b505050505081565b610cce838383604051806020016040528060008152506113f0565b505050565b610cdb61265f565b610ce361265f565b610df4836040518060400160405280600781526020017f636f6c6f72203000000000000000000000000000000000000000000000000000815250600b805480602002602001604051908101604052809291908181526020016000905b82821015610deb578382906000526020600020018054610d5e90612f02565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8a90612f02565b8015610dd75780601f10610dac57610100808354040283529160200191610dd7565b820191906000526020600020905b815481529060010190602001808311610dba57829003601f168201915b505050505081526020019060010190610d3f565b50505050611703565b81600060048110610e0857610e076131ce565b5b6020020181905250610f21836040518060400160405280600781526020017f636f6c6f72203100000000000000000000000000000000000000000000000000815250600b805480602002602001604051908101604052809291908181526020016000905b82821015610f18578382906000526020600020018054610e8b90612f02565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb790612f02565b8015610f045780601f10610ed957610100808354040283529160200191610f04565b820191906000526020600020905b815481529060010190602001808311610ee757829003601f168201915b505050505081526020019060010190610e6c565b50505050611703565b81600160048110610f3557610f346131ce565b5b602002018190525061104e836040518060400160405280600781526020017f636f6c6f72203200000000000000000000000000000000000000000000000000815250600b805480602002602001604051908101604052809291908181526020016000905b82821015611045578382906000526020600020018054610fb890612f02565b80601f0160208091040260200160405190810160405280929190818152602001828054610fe490612f02565b80156110315780601f1061100657610100808354040283529160200191611031565b820191906000526020600020905b81548152906001019060200180831161101457829003601f168201915b505050505081526020019060010190610f99565b50505050611703565b81600260048110611062576110616131ce565b5b602002018190525061117b836040518060400160405280600781526020017f636f6c6f72203300000000000000000000000000000000000000000000000000815250600b805480602002602001604051908101604052809291908181526020016000905b828210156111725783829060005260206000200180546110e590612f02565b80601f016020809104026020016040519081016040528092919081815260200182805461111190612f02565b801561115e5780601f106111335761010080835404028352916020019161115e565b820191906000526020600020905b81548152906001019060200180831161114157829003601f168201915b5050505050815260200190600101906110c6565b50505050611703565b8160036004811061118f5761118e6131ce565b5b602002018190525080915050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124090613249565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba906132db565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61131261176e565b61131c6000611c12565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461135790612f02565b80601f016020809104026020016040519081016040528092919081815260200182805461138390612f02565b80156113d05780601f106113a5576101008083540402835291602001916113d0565b820191906000526020600020905b8154815290600101906020018083116113b357829003601f168201915b5050505050905090565b6113ec6113e5611837565b8383611cd8565b5050565b6114016113fb611837565b83611916565b611440576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611437906131ae565b60405180910390fd5b61144c84848484611e45565b50505050565b61145a61265f565b606080606061146885610cd3565b61147186610aab565b61147a876105d9565b61148388610905565b93509350935093509193509193565b606061149d826117ec565b60006114a7611ea1565b905060008151116114c757604051806020016040528060008152506114f2565b806114d184611ec1565b6040516020016114e2929190613337565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600260075414156115d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cb906130a4565b60405180910390fd5b60026007819055506115e461176e565b611194811180156115f757506113888111155b61160057600080fd5b61160a33826118f8565b600160078190555050565b61161d61176e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561168d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611684906133cd565b60405180910390fd5b61169681611c12565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606060008361171186612022565b604051602001611722929190613337565b6040516020818303038152906040528051906020012060001c90508283518261174b919061341c565b8151811061175c5761175b6131ce565b5b60200260200101519150509392505050565b611776611837565b73ffffffffffffffffffffffffffffffffffffffff1661179461131e565b73ffffffffffffffffffffffffffffffffffffffff16146117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e190613499565b60405180910390fd5b565b6117f581612183565b611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613249565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118b2836111a0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6119128282604051806020016040528060008152506121ef565b5050565b600080611922836111a0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611964575061196381856114fa565b5b806119a257508373ffffffffffffffffffffffffffffffffffffffff1661198a846107a7565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119cb826111a0565b73ffffffffffffffffffffffffffffffffffffffff1614611a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a189061352b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a88906135bd565b60405180910390fd5b611a9c83838361224a565b611aa760008261183f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611af791906135dd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b4e9190613611565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c0d83838361224f565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3e906136b3565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e389190612757565b60405180910390a3505050565b611e508484846119ab565b611e5c84848484612254565b611e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9290613745565b60405180910390fd5b50505050565b606060405180606001604052806035815260200161395260359139905090565b60606000821415611f09576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061201d565b600082905060005b60008214611f3b578080611f24906130f3565b915050600a82611f349190613765565b9150611f11565b60008167ffffffffffffffff811115611f5757611f5661289a565b5b6040519080825280601f01601f191660200182016040528015611f895781602001600182028036833780820191505090505b5090505b6000851461201657600182611fa291906135dd565b9150600a85611fb1919061341c565b6030611fbd9190613611565b60f81b818381518110611fd357611fd26131ce565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561200f9190613765565b9450611f8d565b8093505050505b919050565b6060600082141561206a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061217e565b600082905060005b6000821461209c578080612085906130f3565b915050600a826120959190613765565b9150612072565b60008167ffffffffffffffff8111156120b8576120b761289a565b5b6040519080825280601f01601f1916602001820160405280156120ea5781602001600182028036833780820191505090505b5090505b600085146121775760018261210391906135dd565b9150600a85612112919061341c565b603061211e9190613611565b60f81b818381518110612134576121336131ce565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121709190613765565b94506120ee565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6121f983836123dc565b6122066000848484612254565b612245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223c90613745565b60405180910390fd5b505050565b505050565b505050565b60006122758473ffffffffffffffffffffffffffffffffffffffff166125b6565b156123cf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261229e611837565b8786866040518563ffffffff1660e01b81526004016122c094939291906137eb565b6020604051808303816000875af19250505080156122fc57506040513d601f19601f820116820180604052508101906122f9919061384c565b60015b61237f573d806000811461232c576040519150601f19603f3d011682016040523d82523d6000602084013e612331565b606091505b50600081511415612377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236e90613745565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506123d4565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561244c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612443906138c5565b60405180910390fd5b61245581612183565b15612495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248c90613931565b60405180910390fd5b6124a16000838361224a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f19190613611565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125b26000838361224f565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546125e590612f02565b90600052602060002090601f016020900481019282612607576000855561264e565b82601f1061262057805160ff191683800117855561264e565b8280016001018555821561264e579182015b8281111561264d578251825591602001919060010190612632565b5b50905061265b9190612686565b5090565b60405180608001604052806004905b606081526020019060019003908161266e5790505090565b5b8082111561269f576000816000905550600101612687565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6126ec816126b7565b81146126f757600080fd5b50565b600081359050612709816126e3565b92915050565b600060208284031215612725576127246126ad565b5b6000612733848285016126fa565b91505092915050565b60008115159050919050565b6127518161273c565b82525050565b600060208201905061276c6000830184612748565b92915050565b6000819050919050565b61278581612772565b811461279057600080fd5b50565b6000813590506127a28161277c565b92915050565b6000602082840312156127be576127bd6126ad565b5b60006127cc84828501612793565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561280f5780820151818401526020810190506127f4565b8381111561281e576000848401525b50505050565b6000601f19601f8301169050919050565b6000612840826127d5565b61284a81856127e0565b935061285a8185602086016127f1565b61286381612824565b840191505092915050565b600060208201905081810360008301526128888184612835565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6128d282612824565b810181811067ffffffffffffffff821117156128f1576128f061289a565b5b80604052505050565b60006129046126a3565b905061291082826128c9565b919050565b600067ffffffffffffffff8211156129305761292f61289a565b5b61293982612824565b9050602081019050919050565b82818337600083830152505050565b600061296861296384612915565b6128fa565b90508281526020810184848401111561298457612983612895565b5b61298f848285612946565b509392505050565b600082601f8301126129ac576129ab612890565b5b81356129bc848260208601612955565b91505092915050565b6000602082840312156129db576129da6126ad565b5b600082013567ffffffffffffffff8111156129f9576129f86126b2565b5b612a0584828501612997565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a3982612a0e565b9050919050565b612a4981612a2e565b82525050565b6000602082019050612a646000830184612a40565b92915050565b612a7381612a2e565b8114612a7e57600080fd5b50565b600081359050612a9081612a6a565b92915050565b60008060408385031215612aad57612aac6126ad565b5b6000612abb85828601612a81565b9250506020612acc85828601612793565b9150509250929050565b600080600060608486031215612aef57612aee6126ad565b5b6000612afd86828701612a81565b9350506020612b0e86828701612a81565b9250506040612b1f86828701612793565b9150509250925092565b600060049050919050565b600081905092915050565b6000819050919050565b600082825260208201905092915050565b6000612b65826127d5565b612b6f8185612b49565b9350612b7f8185602086016127f1565b612b8881612824565b840191505092915050565b6000612b9f8383612b5a565b905092915050565b6000602082019050919050565b6000612bbf82612b29565b612bc98185612b34565b935083602082028501612bdb85612b3f565b8060005b85811015612c175784840389528151612bf88582612b93565b9450612c0383612ba7565b925060208a01995050600181019050612bdf565b50829750879550505050505092915050565b60006020820190508181036000830152612c438184612bb4565b905092915050565b600060208284031215612c6157612c606126ad565b5b6000612c6f84828501612a81565b91505092915050565b612c8181612772565b82525050565b6000602082019050612c9c6000830184612c78565b92915050565b612cab8161273c565b8114612cb657600080fd5b50565b600081359050612cc881612ca2565b92915050565b60008060408385031215612ce557612ce46126ad565b5b6000612cf385828601612a81565b9250506020612d0485828601612cb9565b9150509250929050565b600067ffffffffffffffff821115612d2957612d2861289a565b5b612d3282612824565b9050602081019050919050565b6000612d52612d4d84612d0e565b6128fa565b905082815260208101848484011115612d6e57612d6d612895565b5b612d79848285612946565b509392505050565b600082601f830112612d9657612d95612890565b5b8135612da6848260208601612d3f565b91505092915050565b60008060008060808587031215612dc957612dc86126ad565b5b6000612dd787828801612a81565b9450506020612de887828801612a81565b9350506040612df987828801612793565b925050606085013567ffffffffffffffff811115612e1a57612e196126b2565b5b612e2687828801612d81565b91505092959194509250565b60006080820190508181036000830152612e4c8187612bb4565b90508181036020830152612e608186612835565b90508181036040830152612e748185612835565b90508181036060830152612e888184612835565b905095945050505050565b60008060408385031215612eaa57612ea96126ad565b5b6000612eb885828601612a81565b9250506020612ec985828601612a81565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f1a57607f821691505b60208210811415612f2e57612f2d612ed3565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f906021836127e0565b9150612f9b82612f34565b604082019050919050565b60006020820190508181036000830152612fbf81612f83565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613022603e836127e0565b915061302d82612fc6565b604082019050919050565b6000602082019050818103600083015261305181613015565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061308e601f836127e0565b915061309982613058565b602082019050919050565b600060208201905081810360008301526130bd81613081565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130fe82612772565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613131576131306130c4565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613198602e836127e0565b91506131a38261313c565b604082019050919050565b600060208201905081810360008301526131c78161318b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006132336018836127e0565b915061323e826131fd565b602082019050919050565b6000602082019050818103600083015261326281613226565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006132c56029836127e0565b91506132d082613269565b604082019050919050565b600060208201905081810360008301526132f4816132b8565b9050919050565b600081905092915050565b6000613311826127d5565b61331b81856132fb565b935061332b8185602086016127f1565b80840191505092915050565b60006133438285613306565b915061334f8284613306565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006133b76026836127e0565b91506133c28261335b565b604082019050919050565b600060208201905081810360008301526133e6816133aa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061342782612772565b915061343283612772565b925082613442576134416133ed565b5b828206905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006134836020836127e0565b915061348e8261344d565b602082019050919050565b600060208201905081810360008301526134b281613476565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006135156025836127e0565b9150613520826134b9565b604082019050919050565b6000602082019050818103600083015261354481613508565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006135a76024836127e0565b91506135b28261354b565b604082019050919050565b600060208201905081810360008301526135d68161359a565b9050919050565b60006135e882612772565b91506135f383612772565b925082821015613606576136056130c4565b5b828203905092915050565b600061361c82612772565b915061362783612772565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561365c5761365b6130c4565b5b828201905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061369d6019836127e0565b91506136a882613667565b602082019050919050565b600060208201905081810360008301526136cc81613690565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061372f6032836127e0565b915061373a826136d3565b604082019050919050565b6000602082019050818103600083015261375e81613722565b9050919050565b600061377082612772565b915061377b83612772565b92508261378b5761378a6133ed565b5b828204905092915050565b600081519050919050565b600082825260208201905092915050565b60006137bd82613796565b6137c781856137a1565b93506137d78185602086016127f1565b6137e081612824565b840191505092915050565b60006080820190506138006000830187612a40565b61380d6020830186612a40565b61381a6040830185612c78565b818103606083015261382c81846137b2565b905095945050505050565b600081519050613846816126e3565b92915050565b600060208284031215613862576138616126ad565b5b600061387084828501613837565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006138af6020836127e0565b91506138ba82613879565b602082019050919050565b600060208201905081810360008301526138de816138a2565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061391b601c836127e0565b9150613926826138e5565b602082019050919050565b6000602082019050818103600083015261394a8161390e565b905091905056fe68747470733a2f2f72656e646572696e672e726f76652e746f2f76312f72656e64657265642d6e66742f312f6d657461646174612fa2646970667358221220e8f3a60bbab93bd4bbf4805c3ea32d0a479ea04eda24f250d58b55142aba0db064736f6c634300080c0033

Deployed Bytecode Sourcemap

40746:3088:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27496:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42179:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28423:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41834:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29936:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29453:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42301:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41549:121;;;:::i;:::-;;42432:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30636:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41431:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31043:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42814:343;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28134:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27865:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8032:103;;;:::i;:::-;;7384:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28592:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30179:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31299:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42557:249;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;28767:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30405:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41678:148;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8290:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27496:305;27598:4;27650:25;27635:40;;;:11;:40;;;;:105;;;;27707:33;27692:48;;;:11;:48;;;;27635:105;:158;;;;27757:36;27781:11;27757:23;:36::i;:::-;27635:158;27615:178;;27496:305;;;:::o;42179:114::-;42229:13;42262:23;42267:2;42262:23;;;;;;;;;;;;;;;;;42279:5;42262:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:23::i;:::-;42255:30;;42179:114;;;:::o;28423:100::-;28477:13;28510:5;28503:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28423:100;:::o;41834:89::-;7270:13;:11;:13::i;:::-;41911:4:::1;41899:9;:16;;;;;;;;;;;;:::i;:::-;;41834:89:::0;:::o;29936:171::-;30012:7;30032:23;30047:7;30032:14;:23::i;:::-;30075:15;:24;30091:7;30075:24;;;;;;;;;;;;;;;;;;;;;30068:31;;29936:171;;;:::o;29453:417::-;29534:13;29550:23;29565:7;29550:14;:23::i;:::-;29534:39;;29598:5;29592:11;;:2;:11;;;;29584:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29692:5;29676:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29701:37;29718:5;29725:12;:10;:12::i;:::-;29701:16;:37::i;:::-;29676:62;29654:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;29841:21;29850:2;29854:7;29841:8;:21::i;:::-;29523:347;29453:417;;:::o;42301:123::-;42354:13;42387:29;42392:2;42387:29;;;;;;;;;;;;;;;;;42407:8;42387:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:29::i;:::-;42380:36;;42301:123;;;:::o;41549:121::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;41608:4:::1;41604:1;;:8;41596:17;;;::::0;::::1;;41624:1;;:3;;;;;;;;;:::i;:::-;;;;;;41638:24;41648:10;41660:1;;41638:9;:24::i;:::-;1768:1:::0;2722:7;:22;;;;41549:121::o;42432:117::-;42483:13;42516:25;42521:2;42516:25;;;;;;;;;;;;;;;;;42534:6;42516:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:25::i;:::-;42509:32;;42432:117;;;:::o;30636:336::-;30831:41;30850:12;:10;:12::i;:::-;30864:7;30831:18;:41::i;:::-;30823:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;30936:28;30946:4;30952:2;30956:7;30936:9;:28::i;:::-;30636:336;;;:::o;41431:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31043:185::-;31181:39;31198:4;31204:2;31208:7;31181:39;;;;;;;;;;;;:16;:39::i;:::-;31043:185;;;:::o;42814:343::-;42867:16;;:::i;:::-;42896:24;;:::i;:::-;42944:27;42949:2;42944:27;;;;;;;;;;;;;;;;;42964:6;42944:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:27::i;:::-;42931:7;42939:1;42931:10;;;;;;;:::i;:::-;;;;;:40;;;;42995:27;43000:2;42995:27;;;;;;;;;;;;;;;;;43015:6;42995:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:27::i;:::-;42982:7;42990:1;42982:10;;;;;;;:::i;:::-;;;;;:40;;;;43046:27;43051:2;43046:27;;;;;;;;;;;;;;;;;43066:6;43046:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:27::i;:::-;43033:7;43041:1;43033:10;;;;;;;:::i;:::-;;;;;:40;;;;43097:27;43102:2;43097:27;;;;;;;;;;;;;;;;;43117:6;43097:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:27::i;:::-;43084:7;43092:1;43084:10;;;;;;;:::i;:::-;;;;;:40;;;;43142:7;43135:14;;;42814:343;;;:::o;28134:222::-;28206:7;28226:13;28242:7;:16;28250:7;28242:16;;;;;;;;;;;;;;;;;;;;;28226:32;;28294:1;28277:19;;:5;:19;;;;28269:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;28343:5;28336:12;;;28134:222;;;:::o;27865:207::-;27937:7;27982:1;27965:19;;:5;:19;;;;27957:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28048:9;:16;28058:5;28048:16;;;;;;;;;;;;;;;;28041:23;;27865:207;;;:::o;8032:103::-;7270:13;:11;:13::i;:::-;8097:30:::1;8124:1;8097:18;:30::i;:::-;8032:103::o:0;7384:87::-;7430:7;7457:6;;;;;;;;;;;7450:13;;7384:87;:::o;28592:104::-;28648:13;28681:7;28674:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28592:104;:::o;30179:155::-;30274:52;30293:12;:10;:12::i;:::-;30307:8;30317;30274:18;:52::i;:::-;30179:155;;:::o;31299:323::-;31473:41;31492:12;:10;:12::i;:::-;31506:7;31473:18;:41::i;:::-;31465:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;31576:38;31590:4;31596:2;31600:7;31609:4;31576:13;:38::i;:::-;31299:323;;;;:::o;42557:249::-;42619:16;;:::i;:::-;42637:19;42658:18;42678:21;42720:19;42731:7;42720:10;:19::i;:::-;42741:17;42750:7;42741:8;:17::i;:::-;42760:16;42768:7;42760;:16::i;:::-;42778:19;42789:7;42778:10;:19::i;:::-;42712:86;;;;;;;;42557:249;;;;;:::o;28767:281::-;28840:13;28866:23;28881:7;28866:14;:23::i;:::-;28902:21;28926:10;:8;:10::i;:::-;28902:34;;28978:1;28960:7;28954:21;:25;:86;;;;;;;;;;;;;;;;;29006:7;29015:18;:7;:16;:18::i;:::-;28989:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28954:86;28947:93;;;28767:281;;;:::o;30405:164::-;30502:4;30526:18;:25;30545:5;30526:25;;;;;;;;;;;;;;;:35;30552:8;30526:35;;;;;;;;;;;;;;;;;;;;;;;;;30519:42;;30405:164;;;;:::o;41678:148::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;7270:13:::1;:11;:13::i;:::-;41763:4:::2;41758:2;:9;:23;;;;;41777:4;41771:2;:10;;41758:23;41750:32;;;::::0;::::2;;41793:25;41803:10;41815:2;41793:9;:25::i;:::-;1768:1:::0;2722:7;:22;;;;41678:148;:::o;8290:201::-;7270:13;:11;:13::i;:::-;8399:1:::1;8379:22;;:8;:22;;;;8371:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8455:28;8474:8;8455:18;:28::i;:::-;8290:201:::0;:::o;20238:157::-;20323:4;20362:25;20347:40;;;:11;:40;;;;20340:47;;20238:157;;;:::o;41931:240::-;42025:13;42051:9;42098:5;42105:12;42114:2;42105:8;:12::i;:::-;42081:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42071:48;;;;;;42063:57;;42051:69;;42138:6;42149;:13;42145:1;:17;;;;:::i;:::-;42138:25;;;;;;;;:::i;:::-;;;;;;;;42131:32;;;41931:240;;;;;:::o;7549:132::-;7624:12;:10;:12::i;:::-;7613:23;;:7;:5;:7::i;:::-;:23;;;7605:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7549:132::o;37911:135::-;37993:16;38001:7;37993;:16::i;:::-;37985:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;37911:135;:::o;5935:98::-;5988:7;6015:10;6008:17;;5935:98;:::o;37190:174::-;37292:2;37265:15;:24;37281:7;37265:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37348:7;37344:2;37310:46;;37319:23;37334:7;37319:14;:23::i;:::-;37310:46;;;;;;;;;;;;37190:174;;:::o;34029:110::-;34105:26;34115:2;34119:7;34105:26;;;;;;;;;;;;:9;:26::i;:::-;34029:110;;:::o;33423:264::-;33516:4;33533:13;33549:23;33564:7;33549:14;:23::i;:::-;33533:39;;33602:5;33591:16;;:7;:16;;;:52;;;;33611:32;33628:5;33635:7;33611:16;:32::i;:::-;33591:52;:87;;;;33671:7;33647:31;;:20;33659:7;33647:11;:20::i;:::-;:31;;;33591:87;33583:96;;;33423:264;;;;:::o;36446:625::-;36605:4;36578:31;;:23;36593:7;36578:14;:23::i;:::-;:31;;;36570:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;36684:1;36670:16;;:2;:16;;;;36662:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36740:39;36761:4;36767:2;36771:7;36740:20;:39::i;:::-;36844:29;36861:1;36865:7;36844:8;:29::i;:::-;36905:1;36886:9;:15;36896:4;36886:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36934:1;36917:9;:13;36927:2;36917:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36965:2;36946:7;:16;36954:7;36946:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37004:7;37000:2;36985:27;;36994:4;36985:27;;;;;;;;;;;;37025:38;37045:4;37051:2;37055:7;37025:19;:38::i;:::-;36446:625;;;:::o;8651:191::-;8725:16;8744:6;;;;;;;;;;;8725:25;;8770:8;8761:6;;:17;;;;;;;;;;;;;;;;;;8825:8;8794:40;;8815:8;8794:40;;;;;;;;;;;;8714:128;8651:191;:::o;37507:315::-;37662:8;37653:17;;:5;:17;;;;37645:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37749:8;37711:18;:25;37730:5;37711:25;;;;;;;;;;;;;;;:35;37737:8;37711:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;37795:8;37773:41;;37788:5;37773:41;;;37805:8;37773:41;;;;;;:::i;:::-;;;;;;;;37507:315;;;:::o;32503:313::-;32659:28;32669:4;32675:2;32679:7;32659:9;:28::i;:::-;32706:47;32729:4;32735:2;32739:7;32748:4;32706:22;:47::i;:::-;32698:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;32503:313;;;;:::o;43683:148::-;43735:13;43761:62;;;;;;;;;;;;;;;;;;;43683:148;:::o;3189:723::-;3245:13;3475:1;3466:5;:10;3462:53;;;3493:10;;;;;;;;;;;;;;;;;;;;;3462:53;3525:12;3540:5;3525:20;;3556:14;3581:78;3596:1;3588:4;:9;3581:78;;3614:8;;;;;:::i;:::-;;;;3645:2;3637:10;;;;;:::i;:::-;;;3581:78;;;3669:19;3701:6;3691:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3669:39;;3719:154;3735:1;3726:5;:10;3719:154;;3763:1;3753:11;;;;;:::i;:::-;;;3830:2;3822:5;:10;;;;:::i;:::-;3809:2;:24;;;;:::i;:::-;3796:39;;3779:6;3786;3779:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3859:2;3850:11;;;;;:::i;:::-;;;3719:154;;;3897:6;3883:21;;;;;3189:723;;;;:::o;43165:510::-;43221:13;43260:1;43251:5;:10;43247:29;;;43264:10;;;;;;;;;;;;;;;;;;;;;43247:29;43286:12;43301:5;43286:20;;43317:14;43342:78;43357:1;43349:4;:9;43342:78;;43375:8;;;;;:::i;:::-;;;;43406:2;43398:10;;;;;:::i;:::-;;;43342:78;;;43430:19;43462:6;43452:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43430:39;;43480:156;43496:1;43487:5;:10;43480:156;;43524:1;43514:11;;;;;:::i;:::-;;;43591:2;43583:5;:10;;;;:::i;:::-;43570:2;:24;;;;:::i;:::-;43557:39;;43540:6;43547;43540:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;43620:2;43611:11;;;;;:::i;:::-;;;43480:156;;;43660:6;43646:21;;;;;43165:510;;;;:::o;33129:127::-;33194:4;33246:1;33218:30;;:7;:16;33226:7;33218:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33211:37;;33129:127;;;:::o;34366:319::-;34495:18;34501:2;34505:7;34495:5;:18::i;:::-;34546:53;34577:1;34581:2;34585:7;34594:4;34546:22;:53::i;:::-;34524:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;34366:319;;;:::o;40035:126::-;;;;:::o;40546:125::-;;;;:::o;38610:853::-;38764:4;38785:15;:2;:13;;;:15::i;:::-;38781:675;;;38837:2;38821:36;;;38858:12;:10;:12::i;:::-;38872:4;38878:7;38887:4;38821:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38817:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39079:1;39062:6;:13;:18;39058:328;;;39105:60;;;;;;;;;;:::i;:::-;;;;;;;;39058:328;39336:6;39330:13;39321:6;39317:2;39313:15;39306:38;38817:584;38953:41;;;38943:51;;;:6;:51;;;;38936:58;;;;;38781:675;39440:4;39433:11;;38610:853;;;;;;;:::o;35021:439::-;35115:1;35101:16;;:2;:16;;;;35093:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35174:16;35182:7;35174;:16::i;:::-;35173:17;35165:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35236:45;35265:1;35269:2;35273:7;35236:20;:45::i;:::-;35311:1;35294:9;:13;35304:2;35294:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35342:2;35323:7;:16;35331:7;35323:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35387:7;35383:2;35362:33;;35379:1;35362:33;;;;;;;;;;;;35408:44;35436:1;35440:2;35444:7;35408:19;:44::i;:::-;35021:439;;:::o;10082:326::-;10142:4;10399:1;10377:7;:19;;;:23;10370:30;;10082:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:99::-;2261:6;2295:5;2289:12;2279:22;;2209:99;;;:::o;2314:169::-;2398:11;2432:6;2427:3;2420:19;2472:4;2467:3;2463:14;2448:29;;2314:169;;;;:::o;2489:307::-;2557:1;2567:113;2581:6;2578:1;2575:13;2567:113;;;2666:1;2661:3;2657:11;2651:18;2647:1;2642:3;2638:11;2631:39;2603:2;2600:1;2596:10;2591:15;;2567:113;;;2698:6;2695:1;2692:13;2689:101;;;2778:1;2769:6;2764:3;2760:16;2753:27;2689:101;2538:258;2489:307;;;:::o;2802:102::-;2843:6;2894:2;2890:7;2885:2;2878:5;2874:14;2870:28;2860:38;;2802:102;;;:::o;2910:364::-;2998:3;3026:39;3059:5;3026:39;:::i;:::-;3081:71;3145:6;3140:3;3081:71;:::i;:::-;3074:78;;3161:52;3206:6;3201:3;3194:4;3187:5;3183:16;3161:52;:::i;:::-;3238:29;3260:6;3238:29;:::i;:::-;3233:3;3229:39;3222:46;;3002:272;2910:364;;;;:::o;3280:313::-;3393:4;3431:2;3420:9;3416:18;3408:26;;3480:9;3474:4;3470:20;3466:1;3455:9;3451:17;3444:47;3508:78;3581:4;3572:6;3508:78;:::i;:::-;3500:86;;3280:313;;;;:::o;3599:117::-;3708:1;3705;3698:12;3722:117;3831:1;3828;3821:12;3845:180;3893:77;3890:1;3883:88;3990:4;3987:1;3980:15;4014:4;4011:1;4004:15;4031:281;4114:27;4136:4;4114:27;:::i;:::-;4106:6;4102:40;4244:6;4232:10;4229:22;4208:18;4196:10;4193:34;4190:62;4187:88;;;4255:18;;:::i;:::-;4187:88;4295:10;4291:2;4284:22;4074:238;4031:281;;:::o;4318:129::-;4352:6;4379:20;;:::i;:::-;4369:30;;4408:33;4436:4;4428:6;4408:33;:::i;:::-;4318:129;;;:::o;4453:308::-;4515:4;4605:18;4597:6;4594:30;4591:56;;;4627:18;;:::i;:::-;4591:56;4665:29;4687:6;4665:29;:::i;:::-;4657:37;;4749:4;4743;4739:15;4731:23;;4453:308;;;:::o;4767:154::-;4851:6;4846:3;4841;4828:30;4913:1;4904:6;4899:3;4895:16;4888:27;4767:154;;;:::o;4927:412::-;5005:5;5030:66;5046:49;5088:6;5046:49;:::i;:::-;5030:66;:::i;:::-;5021:75;;5119:6;5112:5;5105:21;5157:4;5150:5;5146:16;5195:3;5186:6;5181:3;5177:16;5174:25;5171:112;;;5202:79;;:::i;:::-;5171:112;5292:41;5326:6;5321:3;5316;5292:41;:::i;:::-;5011:328;4927:412;;;;;:::o;5359:340::-;5415:5;5464:3;5457:4;5449:6;5445:17;5441:27;5431:122;;5472:79;;:::i;:::-;5431:122;5589:6;5576:20;5614:79;5689:3;5681:6;5674:4;5666:6;5662:17;5614:79;:::i;:::-;5605:88;;5421:278;5359:340;;;;:::o;5705:509::-;5774:6;5823:2;5811:9;5802:7;5798:23;5794:32;5791:119;;;5829:79;;:::i;:::-;5791:119;5977:1;5966:9;5962:17;5949:31;6007:18;5999:6;5996:30;5993:117;;;6029:79;;:::i;:::-;5993:117;6134:63;6189:7;6180:6;6169:9;6165:22;6134:63;:::i;:::-;6124:73;;5920:287;5705:509;;;;:::o;6220:126::-;6257:7;6297:42;6290:5;6286:54;6275:65;;6220:126;;;:::o;6352:96::-;6389:7;6418:24;6436:5;6418:24;:::i;:::-;6407:35;;6352:96;;;:::o;6454:118::-;6541:24;6559:5;6541:24;:::i;:::-;6536:3;6529:37;6454:118;;:::o;6578:222::-;6671:4;6709:2;6698:9;6694:18;6686:26;;6722:71;6790:1;6779:9;6775:17;6766:6;6722:71;:::i;:::-;6578:222;;;;:::o;6806:122::-;6879:24;6897:5;6879:24;:::i;:::-;6872:5;6869:35;6859:63;;6918:1;6915;6908:12;6859:63;6806:122;:::o;6934:139::-;6980:5;7018:6;7005:20;6996:29;;7034:33;7061:5;7034:33;:::i;:::-;6934:139;;;;:::o;7079:474::-;7147:6;7155;7204:2;7192:9;7183:7;7179:23;7175:32;7172:119;;;7210:79;;:::i;:::-;7172:119;7330:1;7355:53;7400:7;7391:6;7380:9;7376:22;7355:53;:::i;:::-;7345:63;;7301:117;7457:2;7483:53;7528:7;7519:6;7508:9;7504:22;7483:53;:::i;:::-;7473:63;;7428:118;7079:474;;;;;:::o;7559:619::-;7636:6;7644;7652;7701:2;7689:9;7680:7;7676:23;7672:32;7669:119;;;7707:79;;:::i;:::-;7669:119;7827:1;7852:53;7897:7;7888:6;7877:9;7873:22;7852:53;:::i;:::-;7842:63;;7798:117;7954:2;7980:53;8025:7;8016:6;8005:9;8001:22;7980:53;:::i;:::-;7970:63;;7925:118;8082:2;8108:53;8153:7;8144:6;8133:9;8129:22;8108:53;:::i;:::-;8098:63;;8053:118;7559:619;;;;;:::o;8184:114::-;8259:6;8287:4;8277:14;;8184:114;;;:::o;8304:153::-;8411:11;8448:3;8433:18;;8304:153;;;;:::o;8463:108::-;8538:4;8561:3;8553:11;;8463:108;;;:::o;8577:159::-;8651:11;8685:6;8680:3;8673:19;8725:4;8720:3;8716:14;8701:29;;8577:159;;;;:::o;8742:344::-;8820:3;8848:39;8881:5;8848:39;:::i;:::-;8903:61;8957:6;8952:3;8903:61;:::i;:::-;8896:68;;8973:52;9018:6;9013:3;9006:4;8999:5;8995:16;8973:52;:::i;:::-;9050:29;9072:6;9050:29;:::i;:::-;9045:3;9041:39;9034:46;;8824:262;8742:344;;;;:::o;9092:196::-;9181:10;9216:66;9278:3;9270:6;9216:66;:::i;:::-;9202:80;;9092:196;;;;:::o;9294:121::-;9372:4;9404;9399:3;9395:14;9387:22;;9294:121;;;:::o;9451:979::-;9586:3;9615:62;9671:5;9615:62;:::i;:::-;9693:94;9780:6;9775:3;9693:94;:::i;:::-;9686:101;;9813:3;9858:4;9850:6;9846:17;9841:3;9837:27;9888:64;9946:5;9888:64;:::i;:::-;9975:7;10006:1;9991:394;10016:6;10013:1;10010:13;9991:394;;;10087:9;10081:4;10077:20;10072:3;10065:33;10138:6;10132:13;10166:84;10245:4;10230:13;10166:84;:::i;:::-;10158:92;;10273:68;10334:6;10273:68;:::i;:::-;10263:78;;10370:4;10365:3;10361:14;10354:21;;10051:334;10038:1;10035;10031:9;10026:14;;9991:394;;;9995:14;10401:4;10394:11;;10421:3;10414:10;;9591:839;;;;;9451:979;;;;:::o;10436:405::-;10595:4;10633:2;10622:9;10618:18;10610:26;;10682:9;10676:4;10672:20;10668:1;10657:9;10653:17;10646:47;10710:124;10829:4;10820:6;10710:124;:::i;:::-;10702:132;;10436:405;;;;:::o;10847:329::-;10906:6;10955:2;10943:9;10934:7;10930:23;10926:32;10923:119;;;10961:79;;:::i;:::-;10923:119;11081:1;11106:53;11151:7;11142:6;11131:9;11127:22;11106:53;:::i;:::-;11096:63;;11052:117;10847:329;;;;:::o;11182:118::-;11269:24;11287:5;11269:24;:::i;:::-;11264:3;11257:37;11182:118;;:::o;11306:222::-;11399:4;11437:2;11426:9;11422:18;11414:26;;11450:71;11518:1;11507:9;11503:17;11494:6;11450:71;:::i;:::-;11306:222;;;;:::o;11534:116::-;11604:21;11619:5;11604:21;:::i;:::-;11597:5;11594:32;11584:60;;11640:1;11637;11630:12;11584:60;11534:116;:::o;11656:133::-;11699:5;11737:6;11724:20;11715:29;;11753:30;11777:5;11753:30;:::i;:::-;11656:133;;;;:::o;11795:468::-;11860:6;11868;11917:2;11905:9;11896:7;11892:23;11888:32;11885:119;;;11923:79;;:::i;:::-;11885:119;12043:1;12068:53;12113:7;12104:6;12093:9;12089:22;12068:53;:::i;:::-;12058:63;;12014:117;12170:2;12196:50;12238:7;12229:6;12218:9;12214:22;12196:50;:::i;:::-;12186:60;;12141:115;11795:468;;;;;:::o;12269:307::-;12330:4;12420:18;12412:6;12409:30;12406:56;;;12442:18;;:::i;:::-;12406:56;12480:29;12502:6;12480:29;:::i;:::-;12472:37;;12564:4;12558;12554:15;12546:23;;12269:307;;;:::o;12582:410::-;12659:5;12684:65;12700:48;12741:6;12700:48;:::i;:::-;12684:65;:::i;:::-;12675:74;;12772:6;12765:5;12758:21;12810:4;12803:5;12799:16;12848:3;12839:6;12834:3;12830:16;12827:25;12824:112;;;12855:79;;:::i;:::-;12824:112;12945:41;12979:6;12974:3;12969;12945:41;:::i;:::-;12665:327;12582:410;;;;;:::o;13011:338::-;13066:5;13115:3;13108:4;13100:6;13096:17;13092:27;13082:122;;13123:79;;:::i;:::-;13082:122;13240:6;13227:20;13265:78;13339:3;13331:6;13324:4;13316:6;13312:17;13265:78;:::i;:::-;13256:87;;13072:277;13011:338;;;;:::o;13355:943::-;13450:6;13458;13466;13474;13523:3;13511:9;13502:7;13498:23;13494:33;13491:120;;;13530:79;;:::i;:::-;13491:120;13650:1;13675:53;13720:7;13711:6;13700:9;13696:22;13675:53;:::i;:::-;13665:63;;13621:117;13777:2;13803:53;13848:7;13839:6;13828:9;13824:22;13803:53;:::i;:::-;13793:63;;13748:118;13905:2;13931:53;13976:7;13967:6;13956:9;13952:22;13931:53;:::i;:::-;13921:63;;13876:118;14061:2;14050:9;14046:18;14033:32;14092:18;14084:6;14081:30;14078:117;;;14114:79;;:::i;:::-;14078:117;14219:62;14273:7;14264:6;14253:9;14249:22;14219:62;:::i;:::-;14209:72;;14004:287;13355:943;;;;;;;:::o;14304:1009::-;14607:4;14645:3;14634:9;14630:19;14622:27;;14695:9;14689:4;14685:20;14681:1;14670:9;14666:17;14659:47;14723:124;14842:4;14833:6;14723:124;:::i;:::-;14715:132;;14894:9;14888:4;14884:20;14879:2;14868:9;14864:18;14857:48;14922:78;14995:4;14986:6;14922:78;:::i;:::-;14914:86;;15047:9;15041:4;15037:20;15032:2;15021:9;15017:18;15010:48;15075:78;15148:4;15139:6;15075:78;:::i;:::-;15067:86;;15200:9;15194:4;15190:20;15185:2;15174:9;15170:18;15163:48;15228:78;15301:4;15292:6;15228:78;:::i;:::-;15220:86;;14304:1009;;;;;;;:::o;15319:474::-;15387:6;15395;15444:2;15432:9;15423:7;15419:23;15415:32;15412:119;;;15450:79;;:::i;:::-;15412:119;15570:1;15595:53;15640:7;15631:6;15620:9;15616:22;15595:53;:::i;:::-;15585:63;;15541:117;15697:2;15723:53;15768:7;15759:6;15748:9;15744:22;15723:53;:::i;:::-;15713:63;;15668:118;15319:474;;;;;:::o;15799:180::-;15847:77;15844:1;15837:88;15944:4;15941:1;15934:15;15968:4;15965:1;15958:15;15985:320;16029:6;16066:1;16060:4;16056:12;16046:22;;16113:1;16107:4;16103:12;16134:18;16124:81;;16190:4;16182:6;16178:17;16168:27;;16124:81;16252:2;16244:6;16241:14;16221:18;16218:38;16215:84;;;16271:18;;:::i;:::-;16215:84;16036:269;15985:320;;;:::o;16311:220::-;16451:34;16447:1;16439:6;16435:14;16428:58;16520:3;16515:2;16507:6;16503:15;16496:28;16311:220;:::o;16537:366::-;16679:3;16700:67;16764:2;16759:3;16700:67;:::i;:::-;16693:74;;16776:93;16865:3;16776:93;:::i;:::-;16894:2;16889:3;16885:12;16878:19;;16537:366;;;:::o;16909:419::-;17075:4;17113:2;17102:9;17098:18;17090:26;;17162:9;17156:4;17152:20;17148:1;17137:9;17133:17;17126:47;17190:131;17316:4;17190:131;:::i;:::-;17182:139;;16909:419;;;:::o;17334:249::-;17474:34;17470:1;17462:6;17458:14;17451:58;17543:32;17538:2;17530:6;17526:15;17519:57;17334:249;:::o;17589:366::-;17731:3;17752:67;17816:2;17811:3;17752:67;:::i;:::-;17745:74;;17828:93;17917:3;17828:93;:::i;:::-;17946:2;17941:3;17937:12;17930:19;;17589:366;;;:::o;17961:419::-;18127:4;18165:2;18154:9;18150:18;18142:26;;18214:9;18208:4;18204:20;18200:1;18189:9;18185:17;18178:47;18242:131;18368:4;18242:131;:::i;:::-;18234:139;;17961:419;;;:::o;18386:181::-;18526:33;18522:1;18514:6;18510:14;18503:57;18386:181;:::o;18573:366::-;18715:3;18736:67;18800:2;18795:3;18736:67;:::i;:::-;18729:74;;18812:93;18901:3;18812:93;:::i;:::-;18930:2;18925:3;18921:12;18914:19;;18573:366;;;:::o;18945:419::-;19111:4;19149:2;19138:9;19134:18;19126:26;;19198:9;19192:4;19188:20;19184:1;19173:9;19169:17;19162:47;19226:131;19352:4;19226:131;:::i;:::-;19218:139;;18945:419;;;:::o;19370:180::-;19418:77;19415:1;19408:88;19515:4;19512:1;19505:15;19539:4;19536:1;19529:15;19556:233;19595:3;19618:24;19636:5;19618:24;:::i;:::-;19609:33;;19664:66;19657:5;19654:77;19651:103;;;19734:18;;:::i;:::-;19651:103;19781:1;19774:5;19770:13;19763:20;;19556:233;;;:::o;19795:::-;19935:34;19931:1;19923:6;19919:14;19912:58;20004:16;19999:2;19991:6;19987:15;19980:41;19795:233;:::o;20034:366::-;20176:3;20197:67;20261:2;20256:3;20197:67;:::i;:::-;20190:74;;20273:93;20362:3;20273:93;:::i;:::-;20391:2;20386:3;20382:12;20375:19;;20034:366;;;:::o;20406:419::-;20572:4;20610:2;20599:9;20595:18;20587:26;;20659:9;20653:4;20649:20;20645:1;20634:9;20630:17;20623:47;20687:131;20813:4;20687:131;:::i;:::-;20679:139;;20406:419;;;:::o;20831:180::-;20879:77;20876:1;20869:88;20976:4;20973:1;20966:15;21000:4;20997:1;20990:15;21017:174;21157:26;21153:1;21145:6;21141:14;21134:50;21017:174;:::o;21197:366::-;21339:3;21360:67;21424:2;21419:3;21360:67;:::i;:::-;21353:74;;21436:93;21525:3;21436:93;:::i;:::-;21554:2;21549:3;21545:12;21538:19;;21197:366;;;:::o;21569:419::-;21735:4;21773:2;21762:9;21758:18;21750:26;;21822:9;21816:4;21812:20;21808:1;21797:9;21793:17;21786:47;21850:131;21976:4;21850:131;:::i;:::-;21842:139;;21569:419;;;:::o;21994:228::-;22134:34;22130:1;22122:6;22118:14;22111:58;22203:11;22198:2;22190:6;22186:15;22179:36;21994:228;:::o;22228:366::-;22370:3;22391:67;22455:2;22450:3;22391:67;:::i;:::-;22384:74;;22467:93;22556:3;22467:93;:::i;:::-;22585:2;22580:3;22576:12;22569:19;;22228:366;;;:::o;22600:419::-;22766:4;22804:2;22793:9;22789:18;22781:26;;22853:9;22847:4;22843:20;22839:1;22828:9;22824:17;22817:47;22881:131;23007:4;22881:131;:::i;:::-;22873:139;;22600:419;;;:::o;23025:148::-;23127:11;23164:3;23149:18;;23025:148;;;;:::o;23179:377::-;23285:3;23313:39;23346:5;23313:39;:::i;:::-;23368:89;23450:6;23445:3;23368:89;:::i;:::-;23361:96;;23466:52;23511:6;23506:3;23499:4;23492:5;23488:16;23466:52;:::i;:::-;23543:6;23538:3;23534:16;23527:23;;23289:267;23179:377;;;;:::o;23562:435::-;23742:3;23764:95;23855:3;23846:6;23764:95;:::i;:::-;23757:102;;23876:95;23967:3;23958:6;23876:95;:::i;:::-;23869:102;;23988:3;23981:10;;23562:435;;;;;:::o;24003:225::-;24143:34;24139:1;24131:6;24127:14;24120:58;24212:8;24207:2;24199:6;24195:15;24188:33;24003:225;:::o;24234:366::-;24376:3;24397:67;24461:2;24456:3;24397:67;:::i;:::-;24390:74;;24473:93;24562:3;24473:93;:::i;:::-;24591:2;24586:3;24582:12;24575:19;;24234:366;;;:::o;24606:419::-;24772:4;24810:2;24799:9;24795:18;24787:26;;24859:9;24853:4;24849:20;24845:1;24834:9;24830:17;24823:47;24887:131;25013:4;24887:131;:::i;:::-;24879:139;;24606:419;;;:::o;25031:180::-;25079:77;25076:1;25069:88;25176:4;25173:1;25166:15;25200:4;25197:1;25190:15;25217:176;25249:1;25266:20;25284:1;25266:20;:::i;:::-;25261:25;;25300:20;25318:1;25300:20;:::i;:::-;25295:25;;25339:1;25329:35;;25344:18;;:::i;:::-;25329:35;25385:1;25382;25378:9;25373:14;;25217:176;;;;:::o;25399:182::-;25539:34;25535:1;25527:6;25523:14;25516:58;25399:182;:::o;25587:366::-;25729:3;25750:67;25814:2;25809:3;25750:67;:::i;:::-;25743:74;;25826:93;25915:3;25826:93;:::i;:::-;25944:2;25939:3;25935:12;25928:19;;25587:366;;;:::o;25959:419::-;26125:4;26163:2;26152:9;26148:18;26140:26;;26212:9;26206:4;26202:20;26198:1;26187:9;26183:17;26176:47;26240:131;26366:4;26240:131;:::i;:::-;26232:139;;25959:419;;;:::o;26384:224::-;26524:34;26520:1;26512:6;26508:14;26501:58;26593:7;26588:2;26580:6;26576:15;26569:32;26384:224;:::o;26614:366::-;26756:3;26777:67;26841:2;26836:3;26777:67;:::i;:::-;26770:74;;26853:93;26942:3;26853:93;:::i;:::-;26971:2;26966:3;26962:12;26955:19;;26614:366;;;:::o;26986:419::-;27152:4;27190:2;27179:9;27175:18;27167:26;;27239:9;27233:4;27229:20;27225:1;27214:9;27210:17;27203:47;27267:131;27393:4;27267:131;:::i;:::-;27259:139;;26986:419;;;:::o;27411:223::-;27551:34;27547:1;27539:6;27535:14;27528:58;27620:6;27615:2;27607:6;27603:15;27596:31;27411:223;:::o;27640:366::-;27782:3;27803:67;27867:2;27862:3;27803:67;:::i;:::-;27796:74;;27879:93;27968:3;27879:93;:::i;:::-;27997:2;27992:3;27988:12;27981:19;;27640:366;;;:::o;28012:419::-;28178:4;28216:2;28205:9;28201:18;28193:26;;28265:9;28259:4;28255:20;28251:1;28240:9;28236:17;28229:47;28293:131;28419:4;28293:131;:::i;:::-;28285:139;;28012:419;;;:::o;28437:191::-;28477:4;28497:20;28515:1;28497:20;:::i;:::-;28492:25;;28531:20;28549:1;28531:20;:::i;:::-;28526:25;;28570:1;28567;28564:8;28561:34;;;28575:18;;:::i;:::-;28561:34;28620:1;28617;28613:9;28605:17;;28437:191;;;;:::o;28634:305::-;28674:3;28693:20;28711:1;28693:20;:::i;:::-;28688:25;;28727:20;28745:1;28727:20;:::i;:::-;28722:25;;28881:1;28813:66;28809:74;28806:1;28803:81;28800:107;;;28887:18;;:::i;:::-;28800:107;28931:1;28928;28924:9;28917:16;;28634:305;;;;:::o;28945:175::-;29085:27;29081:1;29073:6;29069:14;29062:51;28945:175;:::o;29126:366::-;29268:3;29289:67;29353:2;29348:3;29289:67;:::i;:::-;29282:74;;29365:93;29454:3;29365:93;:::i;:::-;29483:2;29478:3;29474:12;29467:19;;29126:366;;;:::o;29498:419::-;29664:4;29702:2;29691:9;29687:18;29679:26;;29751:9;29745:4;29741:20;29737:1;29726:9;29722:17;29715:47;29779:131;29905:4;29779:131;:::i;:::-;29771:139;;29498:419;;;:::o;29923:237::-;30063:34;30059:1;30051:6;30047:14;30040:58;30132:20;30127:2;30119:6;30115:15;30108:45;29923:237;:::o;30166:366::-;30308:3;30329:67;30393:2;30388:3;30329:67;:::i;:::-;30322:74;;30405:93;30494:3;30405:93;:::i;:::-;30523:2;30518:3;30514:12;30507:19;;30166:366;;;:::o;30538:419::-;30704:4;30742:2;30731:9;30727:18;30719:26;;30791:9;30785:4;30781:20;30777:1;30766:9;30762:17;30755:47;30819:131;30945:4;30819:131;:::i;:::-;30811:139;;30538:419;;;:::o;30963:185::-;31003:1;31020:20;31038:1;31020:20;:::i;:::-;31015:25;;31054:20;31072:1;31054:20;:::i;:::-;31049:25;;31093:1;31083:35;;31098:18;;:::i;:::-;31083:35;31140:1;31137;31133:9;31128:14;;30963:185;;;;:::o;31154:98::-;31205:6;31239:5;31233:12;31223:22;;31154:98;;;:::o;31258:168::-;31341:11;31375:6;31370:3;31363:19;31415:4;31410:3;31406:14;31391:29;;31258:168;;;;:::o;31432:360::-;31518:3;31546:38;31578:5;31546:38;:::i;:::-;31600:70;31663:6;31658:3;31600:70;:::i;:::-;31593:77;;31679:52;31724:6;31719:3;31712:4;31705:5;31701:16;31679:52;:::i;:::-;31756:29;31778:6;31756:29;:::i;:::-;31751:3;31747:39;31740:46;;31522:270;31432:360;;;;:::o;31798:640::-;31993:4;32031:3;32020:9;32016:19;32008:27;;32045:71;32113:1;32102:9;32098:17;32089:6;32045:71;:::i;:::-;32126:72;32194:2;32183:9;32179:18;32170:6;32126:72;:::i;:::-;32208;32276:2;32265:9;32261:18;32252:6;32208:72;:::i;:::-;32327:9;32321:4;32317:20;32312:2;32301:9;32297:18;32290:48;32355:76;32426:4;32417:6;32355:76;:::i;:::-;32347:84;;31798:640;;;;;;;:::o;32444:141::-;32500:5;32531:6;32525:13;32516:22;;32547:32;32573:5;32547:32;:::i;:::-;32444:141;;;;:::o;32591:349::-;32660:6;32709:2;32697:9;32688:7;32684:23;32680:32;32677:119;;;32715:79;;:::i;:::-;32677:119;32835:1;32860:63;32915:7;32906:6;32895:9;32891:22;32860:63;:::i;:::-;32850:73;;32806:127;32591:349;;;;:::o;32946:182::-;33086:34;33082:1;33074:6;33070:14;33063:58;32946:182;:::o;33134:366::-;33276:3;33297:67;33361:2;33356:3;33297:67;:::i;:::-;33290:74;;33373:93;33462:3;33373:93;:::i;:::-;33491:2;33486:3;33482:12;33475:19;;33134:366;;;:::o;33506:419::-;33672:4;33710:2;33699:9;33695:18;33687:26;;33759:9;33753:4;33749:20;33745:1;33734:9;33730:17;33723:47;33787:131;33913:4;33787:131;:::i;:::-;33779:139;;33506:419;;;:::o;33931:178::-;34071:30;34067:1;34059:6;34055:14;34048:54;33931:178;:::o;34115:366::-;34257:3;34278:67;34342:2;34337:3;34278:67;:::i;:::-;34271:74;;34354:93;34443:3;34354:93;:::i;:::-;34472:2;34467:3;34463:12;34456:19;;34115:366;;;:::o;34487:419::-;34653:4;34691:2;34680:9;34676:18;34668:26;;34740:9;34734:4;34730:20;34726:1;34715:9;34711:17;34704:47;34768:131;34894:4;34768:131;:::i;:::-;34760:139;;34487:419;;;:::o

Swarm Source

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

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