ETH Price: $2,311.27 (+0.18%)
Gas: 6.38 Gwei

Token

Non-Fungible Penis (NFP)
 

Overview

Max Total Supply

318 NFP

Holders

136

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 NFP
0x3ae292d56827881a3f9fcb7504e1f6b28fc93639
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:
Penis

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.11;

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

/**
 * @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() {
        _setOwner(_msgSender());
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin\contracts\utils\math\Math.sol

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a / b + (a % b == 0 ? 0 : 1);
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

///
/// @dev Interface for the NFT Royalty Standard
///
interface IERC2981 is IERC165 {
    /// ERC165 bytes to add to interface array - set in parent contract
    /// implementing this standard
    ///
    /// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
    /// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
    /// _registerInterface(_INTERFACE_ID_ERC2981);

    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _salePrice - the sale price of the NFT asset specified by _tokenId
    /// @return receiver - address of who should be sent the royalty payment
    /// @return royaltyAmount - the royalty payment amount for _salePrice
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

///
/// @dev Interface for the NFT Royalty Standard
///
abstract contract ERC2981 is IERC2981 {
    constructor() {}

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

contract Penis is ERC2981, ERC721Enumerable, Ownable {
    using Strings for uint256;
    using Math for uint256;

    string public _provenanceHash = "";

    uint256 public _tokenMaxSimultaneousPurchaseAmount = 69;
    uint256 public _maxTokenSupply = 69000; // Can be extended at any time
    uint256 public _tokenPriceWei = 0.05 ether;
    uint256 public _royaltyPercentage = 5;
    bool public _saleIsActive = false;
    string public _tokenBaseURI = "https://nfpenis.com/token/";
    string public _extension = ".json";

    constructor() ERC721("Non-Fungible Penis", "NFP") {}

    /*
     * Set provenance once it's calculated
     */
    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        _provenanceHash = provenanceHash;
    }

    function setTokenMaxSimultaneousPurchaseAmount(
        uint256 tokenMaxSimultaneousPurchaseAmount
    ) public onlyOwner {
        _tokenMaxSimultaneousPurchaseAmount = tokenMaxSimultaneousPurchaseAmount;
    }

    function setBaseURI(string memory newTokenBaseURI, string memory extension)
        public
        onlyOwner
    {
        _tokenBaseURI = newTokenBaseURI;
        _extension = extension;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        return
            bytes(_tokenBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        _tokenBaseURI,
                        tokenId.toString(),
                        _extension
                    )
                )
                : "";
    }

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

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function changeTokenPrice(uint256 newTokenPriceWei) public onlyOwner {
        require(newTokenPriceWei >= 0);
        _tokenPriceWei = newTokenPriceWei;
    }

    function changeRoyaltyPercentage(uint256 newRoyaltyPercentage)
        public
        onlyOwner
    {
        require(newRoyaltyPercentage >= 0);
        _royaltyPercentage = newRoyaltyPercentage;
    }

    function listOwnedTokenIds(address owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(owner);

        uint256[] memory tokenIds = new uint256[](ownerTokenCount);

        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }

        return tokenIds;
    }

    function flipSaleState() public onlyOwner {
        _saleIsActive = !_saleIsActive;
    }

    function mint(uint256 numberOfTokens, address destinationAddress)
        public
        payable
    {
        require(
            numberOfTokens > 0,
            "Cannot mint 0 or a negative amount of tokens"
        );
        require(
            numberOfTokens <= _tokenMaxSimultaneousPurchaseAmount,
            "Cannot mint so many tokens at the same time"
        );
        require(_saleIsActive, "Sale must be active to mint tokens");
        require(
            (totalSupply() + numberOfTokens) < _maxTokenSupply,
            "Purchase would exceed max supply of tokens"
        );

        if (msg.sender != owner()) {
            require(
                (_tokenPriceWei * numberOfTokens) <= msg.value,
                "Ether value sent is not correct"
            );
        }

        // Mint
        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 tokenId = totalSupply();
            _safeMint(destinationAddress, tokenId);
        }
    }

    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        override(IERC2981)
        returns (address Receiver, uint256 RoyaltyAmount)
    {
        Receiver = owner();
        RoyaltyAmount = ((salePrice * _royaltyPercentage) / 100).max(0);
    }
}

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":"_extension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_royaltyPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenMaxSimultaneousPurchaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenPriceWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRoyaltyPercentage","type":"uint256"}],"name":"changeRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTokenPriceWei","type":"uint256"}],"name":"changeTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"listOwnedTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"address","name":"destinationAddress","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"Receiver","type":"address"},{"internalType":"uint256","name":"RoyaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newTokenBaseURI","type":"string"},{"internalType":"string","name":"extension","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenMaxSimultaneousPurchaseAmount","type":"uint256"}],"name":"setTokenMaxSimultaneousPurchaseAmount","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600b90805190602001906200002b929190620002a1565b506045600c5562010d88600d5566b1a2bc2ec50000600e556005600f556000601060006101000a81548160ff0219169083151502179055506040518060400160405280601a81526020017f68747470733a2f2f6e6670656e69732e636f6d2f746f6b656e2f00000000000081525060119080519060200190620000b0929190620002a1565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060129080519060200190620000fe929190620002a1565b503480156200010c57600080fd5b506040518060400160405280601281526020017f4e6f6e2d46756e6769626c652050656e697300000000000000000000000000008152506040518060400160405280600381526020017f4e46500000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000191929190620002a1565b508060019080519060200190620001aa929190620002a1565b505050620001cd620001c1620001d360201b60201c565b620001db60201b60201c565b620003b6565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002af9062000380565b90600052602060002090601f016020900481019282620002d357600085556200031f565b82601f10620002ee57805160ff19168380011785556200031f565b828001600101855582156200031f579182015b828111156200031e57825182559160200191906001019062000301565b5b5090506200032e919062000332565b5090565b5b808211156200034d57600081600090555060010162000333565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200039957607f821691505b60208210811415620003b057620003af62000351565b5b50919050565b6147e780620003c66000396000f3fe60806040526004361061021a5760003560e01c80635b7792a91161012357806395d89b41116100ab578063c87b56dd1161006f578063c87b56dd146107b3578063e985e9c5146107f0578063f2fde38b1461082d578063f64c8af414610856578063fbc94f24146108815761021a565b806395d89b41146106d05780639ea0eb44146106fb578063a22cb46514610724578063b88d4fde1461074d578063bdc267e8146107765761021a565b806370a08231116100f257806370a082311461060a578063715018a6146106475780637cc918201461065e5780638da5cb5b1461068957806394bf804d146106b45761021a565b80635b7792a91461054e5780635d893ba0146105795780636352211e146105a45780636790a9de146105e15761021a565b80632f745c59116101a65780633ccfd60b116101755780633ccfd60b1461047d57806342842e0e146104945780634bd0d89c146104bd5780634f6ccce7146104e6578063534308cc146105235761021a565b80632f745c59146103d357806334918dfd146104105780633ae1dd9d146104275780633ca4fb76146104525761021a565b806310969523116101ed57806310969523146102ed57806318160ddd1461031657806322af68751461034157806323b872dd1461036c5780632a55205a146103955761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612e7f565b6108aa565b6040516102539190612ec7565b60405180910390f35b34801561026857600080fd5b50610271610ab4565b60405161027e9190612f7b565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612fd3565b610b46565b6040516102bb9190613041565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190613088565b610bcb565b005b3480156102f957600080fd5b50610314600480360381019061030f91906131fd565b610ce3565b005b34801561032257600080fd5b5061032b610d79565b6040516103389190613255565b60405180910390f35b34801561034d57600080fd5b50610356610d86565b6040516103639190613255565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190613270565b610d8c565b005b3480156103a157600080fd5b506103bc60048036038101906103b791906132c3565b610dec565b6040516103ca929190613303565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f59190613088565b610e2f565b6040516104079190613255565b60405180910390f35b34801561041c57600080fd5b50610425610ed4565b005b34801561043357600080fd5b5061043c610f7c565b6040516104499190612f7b565b60405180910390f35b34801561045e57600080fd5b5061046761100a565b6040516104749190612f7b565b60405180910390f35b34801561048957600080fd5b50610492611098565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190613270565b611163565b005b3480156104c957600080fd5b506104e460048036038101906104df9190612fd3565b611183565b005b3480156104f257600080fd5b5061050d60048036038101906105089190612fd3565b611217565b60405161051a9190613255565b60405180910390f35b34801561052f57600080fd5b50610538611288565b6040516105459190612f7b565b60405180910390f35b34801561055a57600080fd5b50610563611316565b6040516105709190613255565b60405180910390f35b34801561058557600080fd5b5061058e61131c565b60405161059b9190612ec7565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c69190612fd3565b61132f565b6040516105d89190613041565b60405180910390f35b3480156105ed57600080fd5b506106086004803603810190610603919061332c565b6113e1565b005b34801561061657600080fd5b50610631600480360381019061062c91906133a4565b61148f565b60405161063e9190613255565b60405180910390f35b34801561065357600080fd5b5061065c611547565b005b34801561066a57600080fd5b506106736115cf565b6040516106809190613255565b60405180910390f35b34801561069557600080fd5b5061069e6115d5565b6040516106ab9190613041565b60405180910390f35b6106ce60048036038101906106c991906133d1565b6115ff565b005b3480156106dc57600080fd5b506106e56117f1565b6040516106f29190612f7b565b60405180910390f35b34801561070757600080fd5b50610722600480360381019061071d9190612fd3565b611883565b005b34801561073057600080fd5b5061074b6004803603810190610746919061343d565b611909565b005b34801561075957600080fd5b50610774600480360381019061076f919061351e565b611a8a565b005b34801561078257600080fd5b5061079d600480360381019061079891906133a4565b611aec565b6040516107aa919061365f565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190612fd3565b611b9a565b6040516107e79190612f7b565b60405180910390f35b3480156107fc57600080fd5b5061081760048036038101906108129190613681565b611c45565b6040516108249190612ec7565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f91906133a4565b611cd9565b005b34801561086257600080fd5b5061086b611dd1565b6040516108789190613255565b60405180910390f35b34801561088d57600080fd5b506108a860048036038101906108a39190612fd3565b611dd7565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061097557507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109dd57507f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aad57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060008054610ac3906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610aef906136f0565b8015610b3c5780601f10610b1157610100808354040283529160200191610b3c565b820191906000526020600020905b815481529060010190602001808311610b1f57829003601f168201915b5050505050905090565b6000610b5182611e6b565b610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8790613794565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bd68261132f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90613826565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c66611ed7565b73ffffffffffffffffffffffffffffffffffffffff161480610c955750610c9481610c8f611ed7565b611c45565b5b610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb906138b8565b60405180910390fd5b610cde8383611edf565b505050565b610ceb611ed7565b73ffffffffffffffffffffffffffffffffffffffff16610d096115d5565b73ffffffffffffffffffffffffffffffffffffffff1614610d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5690613924565b60405180910390fd5b80600b9080519060200190610d75929190612d70565b5050565b6000600880549050905090565b600e5481565b610d9d610d97611ed7565b82611f98565b610ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd3906139b6565b60405180910390fd5b610de7838383612076565b505050565b600080610df76115d5565b9150610e2660006064600f5486610e0e9190613a05565b610e189190613a8e565b6122d290919063ffffffff16565b90509250929050565b6000610e3a8361148f565b8210610e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7290613b31565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610edc611ed7565b73ffffffffffffffffffffffffffffffffffffffff16610efa6115d5565b73ffffffffffffffffffffffffffffffffffffffff1614610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4790613924565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b60128054610f89906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb5906136f0565b80156110025780601f10610fd757610100808354040283529160200191611002565b820191906000526020600020905b815481529060010190602001808311610fe557829003601f168201915b505050505081565b60118054611017906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054611043906136f0565b80156110905780601f1061106557610100808354040283529160200191611090565b820191906000526020600020905b81548152906001019060200180831161107357829003601f168201915b505050505081565b6110a0611ed7565b73ffffffffffffffffffffffffffffffffffffffff166110be6115d5565b73ffffffffffffffffffffffffffffffffffffffff1614611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b90613924565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561115f573d6000803e3d6000fd5b5050565b61117e83838360405180602001604052806000815250611a8a565b505050565b61118b611ed7565b73ffffffffffffffffffffffffffffffffffffffff166111a96115d5565b73ffffffffffffffffffffffffffffffffffffffff16146111ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f690613924565b60405180910390fd5b600081101561120d57600080fd5b80600f8190555050565b6000611221610d79565b8210611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990613bc3565b60405180910390fd5b6008828154811061127657611275613be3565b5b90600052602060002001549050919050565b600b8054611295906136f0565b80601f01602080910402602001604051908101604052809291908181526020018280546112c1906136f0565b801561130e5780601f106112e35761010080835404028352916020019161130e565b820191906000526020600020905b8154815290600101906020018083116112f157829003601f168201915b505050505081565b600c5481565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf90613c84565b60405180910390fd5b80915050919050565b6113e9611ed7565b73ffffffffffffffffffffffffffffffffffffffff166114076115d5565b73ffffffffffffffffffffffffffffffffffffffff161461145d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145490613924565b60405180910390fd5b8160119080519060200190611473929190612d70565b50806012908051906020019061148a929190612d70565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f790613d16565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61154f611ed7565b73ffffffffffffffffffffffffffffffffffffffff1661156d6115d5565b73ffffffffffffffffffffffffffffffffffffffff16146115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba90613924565b60405180910390fd5b6115cd60006122ec565b565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008211611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163990613da8565b60405180910390fd5b600c54821115611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e90613e3a565b60405180910390fd5b601060009054906101000a900460ff166116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90613ecc565b60405180910390fd5b600d54826116e2610d79565b6116ec9190613eec565b1061172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390613fb4565b60405180910390fd5b6117346115d5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117b7573482600e546117759190613a05565b11156117b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ad90614020565b60405180910390fd5b5b60005b828110156117ec5760006117cc610d79565b90506117d883826123b2565b5080806117e490614040565b9150506117ba565b505050565b606060018054611800906136f0565b80601f016020809104026020016040519081016040528092919081815260200182805461182c906136f0565b80156118795780601f1061184e57610100808354040283529160200191611879565b820191906000526020600020905b81548152906001019060200180831161185c57829003601f168201915b5050505050905090565b61188b611ed7565b73ffffffffffffffffffffffffffffffffffffffff166118a96115d5565b73ffffffffffffffffffffffffffffffffffffffff16146118ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f690613924565b60405180910390fd5b80600c8190555050565b611911611ed7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561197f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611976906140d5565b60405180910390fd5b806005600061198c611ed7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a39611ed7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a7e9190612ec7565b60405180910390a35050565b611a9b611a95611ed7565b83611f98565b611ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad1906139b6565b60405180910390fd5b611ae6848484846123d0565b50505050565b60606000611af98361148f565b905060008167ffffffffffffffff811115611b1757611b166130d2565b5b604051908082528060200260200182016040528015611b455781602001602082028036833780820191505090505b50905060005b82811015611b8f57611b5d8582610e2f565b828281518110611b7057611b6f613be3565b5b6020026020010181815250508080611b8790614040565b915050611b4b565b508092505050919050565b6060611ba582611e6b565b611be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdb90614167565b60405180910390fd5b600060118054611bf3906136f0565b905011611c0f5760405180602001604052806000815250611c3e565b6011611c1a8361242c565b6012604051602001611c2e93929190614257565b6040516020818303038152906040525b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ce1611ed7565b73ffffffffffffffffffffffffffffffffffffffff16611cff6115d5565b73ffffffffffffffffffffffffffffffffffffffff1614611d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4c90613924565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbc906142fa565b60405180910390fd5b611dce816122ec565b50565b600f5481565b611ddf611ed7565b73ffffffffffffffffffffffffffffffffffffffff16611dfd6115d5565b73ffffffffffffffffffffffffffffffffffffffff1614611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a90613924565b60405180910390fd5b6000811015611e6157600080fd5b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f528361132f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611fa382611e6b565b611fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd99061438c565b60405180910390fd5b6000611fed8361132f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061205c57508373ffffffffffffffffffffffffffffffffffffffff1661204484610b46565b73ffffffffffffffffffffffffffffffffffffffff16145b8061206d575061206c8185611c45565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120968261132f565b73ffffffffffffffffffffffffffffffffffffffff16146120ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e39061441e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561215c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612153906144b0565b60405180910390fd5b61216783838361258d565b612172600082611edf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121c291906144d0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122199190613eec565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818310156122e257816122e4565b825b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123cc8282604051806020016040528060008152506126a1565b5050565b6123db848484612076565b6123e7848484846126fc565b612426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241d90614576565b60405180910390fd5b50505050565b60606000821415612474576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612588565b600082905060005b600082146124a657808061248f90614040565b915050600a8261249f9190613a8e565b915061247c565b60008167ffffffffffffffff8111156124c2576124c16130d2565b5b6040519080825280601f01601f1916602001820160405280156124f45781602001600182028036833780820191505090505b5090505b600085146125815760018261250d91906144d0565b9150600a8561251c9190614596565b60306125289190613eec565b60f81b81838151811061253e5761253d613be3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561257a9190613a8e565b94506124f8565b8093505050505b919050565b612598838383612884565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125db576125d681612889565b61261a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126195761261883826128d2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561265d5761265881612a3f565b61269c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461269b5761269a8282612b10565b5b5b505050565b6126ab8383612b8f565b6126b860008484846126fc565b6126f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ee90614576565b60405180910390fd5b505050565b600061271d8473ffffffffffffffffffffffffffffffffffffffff16612d5d565b15612877578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612746611ed7565b8786866040518563ffffffff1660e01b8152600401612768949392919061461c565b6020604051808303816000875af19250505080156127a457506040513d601f19601f820116820180604052508101906127a1919061467d565b60015b612827573d80600081146127d4576040519150601f19603f3d011682016040523d82523d6000602084013e6127d9565b606091505b5060008151141561281f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281690614576565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061287c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016128df8461148f565b6128e991906144d0565b90506000600760008481526020019081526020016000205490508181146129ce576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a5391906144d0565b9050600060096000848152602001908152602001600020549050600060088381548110612a8357612a82613be3565b5b906000526020600020015490508060088381548110612aa557612aa4613be3565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612af457612af36146aa565b5b6001900381819060005260206000200160009055905550505050565b6000612b1b8361148f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf690614725565b60405180910390fd5b612c0881611e6b565b15612c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3f90614791565b60405180910390fd5b612c546000838361258d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ca49190613eec565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612d7c906136f0565b90600052602060002090601f016020900481019282612d9e5760008555612de5565b82601f10612db757805160ff1916838001178555612de5565b82800160010185558215612de5579182015b82811115612de4578251825591602001919060010190612dc9565b5b509050612df29190612df6565b5090565b5b80821115612e0f576000816000905550600101612df7565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e5c81612e27565b8114612e6757600080fd5b50565b600081359050612e7981612e53565b92915050565b600060208284031215612e9557612e94612e1d565b5b6000612ea384828501612e6a565b91505092915050565b60008115159050919050565b612ec181612eac565b82525050565b6000602082019050612edc6000830184612eb8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f1c578082015181840152602081019050612f01565b83811115612f2b576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f4d82612ee2565b612f578185612eed565b9350612f67818560208601612efe565b612f7081612f31565b840191505092915050565b60006020820190508181036000830152612f958184612f42565b905092915050565b6000819050919050565b612fb081612f9d565b8114612fbb57600080fd5b50565b600081359050612fcd81612fa7565b92915050565b600060208284031215612fe957612fe8612e1d565b5b6000612ff784828501612fbe565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061302b82613000565b9050919050565b61303b81613020565b82525050565b60006020820190506130566000830184613032565b92915050565b61306581613020565b811461307057600080fd5b50565b6000813590506130828161305c565b92915050565b6000806040838503121561309f5761309e612e1d565b5b60006130ad85828601613073565b92505060206130be85828601612fbe565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61310a82612f31565b810181811067ffffffffffffffff82111715613129576131286130d2565b5b80604052505050565b600061313c612e13565b90506131488282613101565b919050565b600067ffffffffffffffff821115613168576131676130d2565b5b61317182612f31565b9050602081019050919050565b82818337600083830152505050565b60006131a061319b8461314d565b613132565b9050828152602081018484840111156131bc576131bb6130cd565b5b6131c784828561317e565b509392505050565b600082601f8301126131e4576131e36130c8565b5b81356131f484826020860161318d565b91505092915050565b60006020828403121561321357613212612e1d565b5b600082013567ffffffffffffffff81111561323157613230612e22565b5b61323d848285016131cf565b91505092915050565b61324f81612f9d565b82525050565b600060208201905061326a6000830184613246565b92915050565b60008060006060848603121561328957613288612e1d565b5b600061329786828701613073565b93505060206132a886828701613073565b92505060406132b986828701612fbe565b9150509250925092565b600080604083850312156132da576132d9612e1d565b5b60006132e885828601612fbe565b92505060206132f985828601612fbe565b9150509250929050565b60006040820190506133186000830185613032565b6133256020830184613246565b9392505050565b6000806040838503121561334357613342612e1d565b5b600083013567ffffffffffffffff81111561336157613360612e22565b5b61336d858286016131cf565b925050602083013567ffffffffffffffff81111561338e5761338d612e22565b5b61339a858286016131cf565b9150509250929050565b6000602082840312156133ba576133b9612e1d565b5b60006133c884828501613073565b91505092915050565b600080604083850312156133e8576133e7612e1d565b5b60006133f685828601612fbe565b925050602061340785828601613073565b9150509250929050565b61341a81612eac565b811461342557600080fd5b50565b60008135905061343781613411565b92915050565b6000806040838503121561345457613453612e1d565b5b600061346285828601613073565b925050602061347385828601613428565b9150509250929050565b600067ffffffffffffffff821115613498576134976130d2565b5b6134a182612f31565b9050602081019050919050565b60006134c16134bc8461347d565b613132565b9050828152602081018484840111156134dd576134dc6130cd565b5b6134e884828561317e565b509392505050565b600082601f830112613505576135046130c8565b5b81356135158482602086016134ae565b91505092915050565b6000806000806080858703121561353857613537612e1d565b5b600061354687828801613073565b945050602061355787828801613073565b935050604061356887828801612fbe565b925050606085013567ffffffffffffffff81111561358957613588612e22565b5b613595878288016134f0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6135d681612f9d565b82525050565b60006135e883836135cd565b60208301905092915050565b6000602082019050919050565b600061360c826135a1565b61361681856135ac565b9350613621836135bd565b8060005b8381101561365257815161363988826135dc565b9750613644836135f4565b925050600181019050613625565b5085935050505092915050565b600060208201905081810360008301526136798184613601565b905092915050565b6000806040838503121561369857613697612e1d565b5b60006136a685828601613073565b92505060206136b785828601613073565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061370857607f821691505b6020821081141561371c5761371b6136c1565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061377e602c83612eed565b915061378982613722565b604082019050919050565b600060208201905081810360008301526137ad81613771565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613810602183612eed565b915061381b826137b4565b604082019050919050565b6000602082019050818103600083015261383f81613803565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006138a2603883612eed565b91506138ad82613846565b604082019050919050565b600060208201905081810360008301526138d181613895565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061390e602083612eed565b9150613919826138d8565b602082019050919050565b6000602082019050818103600083015261393d81613901565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006139a0603183612eed565b91506139ab82613944565b604082019050919050565b600060208201905081810360008301526139cf81613993565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a1082612f9d565b9150613a1b83612f9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a5457613a536139d6565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a9982612f9d565b9150613aa483612f9d565b925082613ab457613ab3613a5f565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613b1b602b83612eed565b9150613b2682613abf565b604082019050919050565b60006020820190508181036000830152613b4a81613b0e565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613bad602c83612eed565b9150613bb882613b51565b604082019050919050565b60006020820190508181036000830152613bdc81613ba0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613c6e602983612eed565b9150613c7982613c12565b604082019050919050565b60006020820190508181036000830152613c9d81613c61565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613d00602a83612eed565b9150613d0b82613ca4565b604082019050919050565b60006020820190508181036000830152613d2f81613cf3565b9050919050565b7f43616e6e6f74206d696e742030206f722061206e6567617469766520616d6f7560008201527f6e74206f6620746f6b656e730000000000000000000000000000000000000000602082015250565b6000613d92602c83612eed565b9150613d9d82613d36565b604082019050919050565b60006020820190508181036000830152613dc181613d85565b9050919050565b7f43616e6e6f74206d696e7420736f206d616e7920746f6b656e7320617420746860008201527f652073616d652074696d65000000000000000000000000000000000000000000602082015250565b6000613e24602b83612eed565b9150613e2f82613dc8565b604082019050919050565b60006020820190508181036000830152613e5381613e17565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b6000613eb6602283612eed565b9150613ec182613e5a565b604082019050919050565b60006020820190508181036000830152613ee581613ea9565b9050919050565b6000613ef782612f9d565b9150613f0283612f9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f3757613f366139d6565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b6000613f9e602a83612eed565b9150613fa982613f42565b604082019050919050565b60006020820190508181036000830152613fcd81613f91565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b600061400a601f83612eed565b915061401582613fd4565b602082019050919050565b6000602082019050818103600083015261403981613ffd565b9050919050565b600061404b82612f9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561407e5761407d6139d6565b5b600182019050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006140bf601983612eed565b91506140ca82614089565b602082019050919050565b600060208201905081810360008301526140ee816140b2565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614151602f83612eed565b915061415c826140f5565b604082019050919050565b6000602082019050818103600083015261418081614144565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546141b4816136f0565b6141be8186614187565b945060018216600081146141d957600181146141ea5761421d565b60ff1983168652818601935061421d565b6141f385614192565b60005b83811015614215578154818901526001820191506020810190506141f6565b838801955050505b50505092915050565b600061423182612ee2565b61423b8185614187565b935061424b818560208601612efe565b80840191505092915050565b600061426382866141a7565b915061426f8285614226565b915061427b82846141a7565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142e4602683612eed565b91506142ef82614288565b604082019050919050565b60006020820190508181036000830152614313816142d7565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614376602c83612eed565b91506143818261431a565b604082019050919050565b600060208201905081810360008301526143a581614369565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614408602983612eed565b9150614413826143ac565b604082019050919050565b60006020820190508181036000830152614437816143fb565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061449a602483612eed565b91506144a58261443e565b604082019050919050565b600060208201905081810360008301526144c98161448d565b9050919050565b60006144db82612f9d565b91506144e683612f9d565b9250828210156144f9576144f86139d6565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614560603283612eed565b915061456b82614504565b604082019050919050565b6000602082019050818103600083015261458f81614553565b9050919050565b60006145a182612f9d565b91506145ac83612f9d565b9250826145bc576145bb613a5f565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006145ee826145c7565b6145f881856145d2565b9350614608818560208601612efe565b61461181612f31565b840191505092915050565b60006080820190506146316000830187613032565b61463e6020830186613032565b61464b6040830185613246565b818103606083015261465d81846145e3565b905095945050505050565b60008151905061467781612e53565b92915050565b60006020828403121561469357614692612e1d565b5b60006146a184828501614668565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061470f602083612eed565b915061471a826146d9565b602082019050919050565b6000602082019050818103600083015261473e81614702565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061477b601c83612eed565b915061478682614745565b602082019050919050565b600060208201905081810360008301526147aa8161476e565b905091905056fea2646970667358221220240e0981b6cae37b8cba36be538c6b5319f6a56cea5b756b7adf3da91635255864736f6c634300080b0033

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80635b7792a91161012357806395d89b41116100ab578063c87b56dd1161006f578063c87b56dd146107b3578063e985e9c5146107f0578063f2fde38b1461082d578063f64c8af414610856578063fbc94f24146108815761021a565b806395d89b41146106d05780639ea0eb44146106fb578063a22cb46514610724578063b88d4fde1461074d578063bdc267e8146107765761021a565b806370a08231116100f257806370a082311461060a578063715018a6146106475780637cc918201461065e5780638da5cb5b1461068957806394bf804d146106b45761021a565b80635b7792a91461054e5780635d893ba0146105795780636352211e146105a45780636790a9de146105e15761021a565b80632f745c59116101a65780633ccfd60b116101755780633ccfd60b1461047d57806342842e0e146104945780634bd0d89c146104bd5780634f6ccce7146104e6578063534308cc146105235761021a565b80632f745c59146103d357806334918dfd146104105780633ae1dd9d146104275780633ca4fb76146104525761021a565b806310969523116101ed57806310969523146102ed57806318160ddd1461031657806322af68751461034157806323b872dd1461036c5780632a55205a146103955761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612e7f565b6108aa565b6040516102539190612ec7565b60405180910390f35b34801561026857600080fd5b50610271610ab4565b60405161027e9190612f7b565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612fd3565b610b46565b6040516102bb9190613041565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190613088565b610bcb565b005b3480156102f957600080fd5b50610314600480360381019061030f91906131fd565b610ce3565b005b34801561032257600080fd5b5061032b610d79565b6040516103389190613255565b60405180910390f35b34801561034d57600080fd5b50610356610d86565b6040516103639190613255565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190613270565b610d8c565b005b3480156103a157600080fd5b506103bc60048036038101906103b791906132c3565b610dec565b6040516103ca929190613303565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f59190613088565b610e2f565b6040516104079190613255565b60405180910390f35b34801561041c57600080fd5b50610425610ed4565b005b34801561043357600080fd5b5061043c610f7c565b6040516104499190612f7b565b60405180910390f35b34801561045e57600080fd5b5061046761100a565b6040516104749190612f7b565b60405180910390f35b34801561048957600080fd5b50610492611098565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190613270565b611163565b005b3480156104c957600080fd5b506104e460048036038101906104df9190612fd3565b611183565b005b3480156104f257600080fd5b5061050d60048036038101906105089190612fd3565b611217565b60405161051a9190613255565b60405180910390f35b34801561052f57600080fd5b50610538611288565b6040516105459190612f7b565b60405180910390f35b34801561055a57600080fd5b50610563611316565b6040516105709190613255565b60405180910390f35b34801561058557600080fd5b5061058e61131c565b60405161059b9190612ec7565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c69190612fd3565b61132f565b6040516105d89190613041565b60405180910390f35b3480156105ed57600080fd5b506106086004803603810190610603919061332c565b6113e1565b005b34801561061657600080fd5b50610631600480360381019061062c91906133a4565b61148f565b60405161063e9190613255565b60405180910390f35b34801561065357600080fd5b5061065c611547565b005b34801561066a57600080fd5b506106736115cf565b6040516106809190613255565b60405180910390f35b34801561069557600080fd5b5061069e6115d5565b6040516106ab9190613041565b60405180910390f35b6106ce60048036038101906106c991906133d1565b6115ff565b005b3480156106dc57600080fd5b506106e56117f1565b6040516106f29190612f7b565b60405180910390f35b34801561070757600080fd5b50610722600480360381019061071d9190612fd3565b611883565b005b34801561073057600080fd5b5061074b6004803603810190610746919061343d565b611909565b005b34801561075957600080fd5b50610774600480360381019061076f919061351e565b611a8a565b005b34801561078257600080fd5b5061079d600480360381019061079891906133a4565b611aec565b6040516107aa919061365f565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190612fd3565b611b9a565b6040516107e79190612f7b565b60405180910390f35b3480156107fc57600080fd5b5061081760048036038101906108129190613681565b611c45565b6040516108249190612ec7565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f91906133a4565b611cd9565b005b34801561086257600080fd5b5061086b611dd1565b6040516108789190613255565b60405180910390f35b34801561088d57600080fd5b506108a860048036038101906108a39190612fd3565b611dd7565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061097557507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109dd57507f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aad57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060008054610ac3906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610aef906136f0565b8015610b3c5780601f10610b1157610100808354040283529160200191610b3c565b820191906000526020600020905b815481529060010190602001808311610b1f57829003601f168201915b5050505050905090565b6000610b5182611e6b565b610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8790613794565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bd68261132f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90613826565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c66611ed7565b73ffffffffffffffffffffffffffffffffffffffff161480610c955750610c9481610c8f611ed7565b611c45565b5b610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb906138b8565b60405180910390fd5b610cde8383611edf565b505050565b610ceb611ed7565b73ffffffffffffffffffffffffffffffffffffffff16610d096115d5565b73ffffffffffffffffffffffffffffffffffffffff1614610d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5690613924565b60405180910390fd5b80600b9080519060200190610d75929190612d70565b5050565b6000600880549050905090565b600e5481565b610d9d610d97611ed7565b82611f98565b610ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd3906139b6565b60405180910390fd5b610de7838383612076565b505050565b600080610df76115d5565b9150610e2660006064600f5486610e0e9190613a05565b610e189190613a8e565b6122d290919063ffffffff16565b90509250929050565b6000610e3a8361148f565b8210610e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7290613b31565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610edc611ed7565b73ffffffffffffffffffffffffffffffffffffffff16610efa6115d5565b73ffffffffffffffffffffffffffffffffffffffff1614610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4790613924565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b60128054610f89906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb5906136f0565b80156110025780601f10610fd757610100808354040283529160200191611002565b820191906000526020600020905b815481529060010190602001808311610fe557829003601f168201915b505050505081565b60118054611017906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054611043906136f0565b80156110905780601f1061106557610100808354040283529160200191611090565b820191906000526020600020905b81548152906001019060200180831161107357829003601f168201915b505050505081565b6110a0611ed7565b73ffffffffffffffffffffffffffffffffffffffff166110be6115d5565b73ffffffffffffffffffffffffffffffffffffffff1614611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b90613924565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561115f573d6000803e3d6000fd5b5050565b61117e83838360405180602001604052806000815250611a8a565b505050565b61118b611ed7565b73ffffffffffffffffffffffffffffffffffffffff166111a96115d5565b73ffffffffffffffffffffffffffffffffffffffff16146111ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f690613924565b60405180910390fd5b600081101561120d57600080fd5b80600f8190555050565b6000611221610d79565b8210611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990613bc3565b60405180910390fd5b6008828154811061127657611275613be3565b5b90600052602060002001549050919050565b600b8054611295906136f0565b80601f01602080910402602001604051908101604052809291908181526020018280546112c1906136f0565b801561130e5780601f106112e35761010080835404028352916020019161130e565b820191906000526020600020905b8154815290600101906020018083116112f157829003601f168201915b505050505081565b600c5481565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf90613c84565b60405180910390fd5b80915050919050565b6113e9611ed7565b73ffffffffffffffffffffffffffffffffffffffff166114076115d5565b73ffffffffffffffffffffffffffffffffffffffff161461145d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145490613924565b60405180910390fd5b8160119080519060200190611473929190612d70565b50806012908051906020019061148a929190612d70565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f790613d16565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61154f611ed7565b73ffffffffffffffffffffffffffffffffffffffff1661156d6115d5565b73ffffffffffffffffffffffffffffffffffffffff16146115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba90613924565b60405180910390fd5b6115cd60006122ec565b565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008211611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163990613da8565b60405180910390fd5b600c54821115611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e90613e3a565b60405180910390fd5b601060009054906101000a900460ff166116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90613ecc565b60405180910390fd5b600d54826116e2610d79565b6116ec9190613eec565b1061172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390613fb4565b60405180910390fd5b6117346115d5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117b7573482600e546117759190613a05565b11156117b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ad90614020565b60405180910390fd5b5b60005b828110156117ec5760006117cc610d79565b90506117d883826123b2565b5080806117e490614040565b9150506117ba565b505050565b606060018054611800906136f0565b80601f016020809104026020016040519081016040528092919081815260200182805461182c906136f0565b80156118795780601f1061184e57610100808354040283529160200191611879565b820191906000526020600020905b81548152906001019060200180831161185c57829003601f168201915b5050505050905090565b61188b611ed7565b73ffffffffffffffffffffffffffffffffffffffff166118a96115d5565b73ffffffffffffffffffffffffffffffffffffffff16146118ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f690613924565b60405180910390fd5b80600c8190555050565b611911611ed7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561197f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611976906140d5565b60405180910390fd5b806005600061198c611ed7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a39611ed7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a7e9190612ec7565b60405180910390a35050565b611a9b611a95611ed7565b83611f98565b611ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad1906139b6565b60405180910390fd5b611ae6848484846123d0565b50505050565b60606000611af98361148f565b905060008167ffffffffffffffff811115611b1757611b166130d2565b5b604051908082528060200260200182016040528015611b455781602001602082028036833780820191505090505b50905060005b82811015611b8f57611b5d8582610e2f565b828281518110611b7057611b6f613be3565b5b6020026020010181815250508080611b8790614040565b915050611b4b565b508092505050919050565b6060611ba582611e6b565b611be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdb90614167565b60405180910390fd5b600060118054611bf3906136f0565b905011611c0f5760405180602001604052806000815250611c3e565b6011611c1a8361242c565b6012604051602001611c2e93929190614257565b6040516020818303038152906040525b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ce1611ed7565b73ffffffffffffffffffffffffffffffffffffffff16611cff6115d5565b73ffffffffffffffffffffffffffffffffffffffff1614611d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4c90613924565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbc906142fa565b60405180910390fd5b611dce816122ec565b50565b600f5481565b611ddf611ed7565b73ffffffffffffffffffffffffffffffffffffffff16611dfd6115d5565b73ffffffffffffffffffffffffffffffffffffffff1614611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a90613924565b60405180910390fd5b6000811015611e6157600080fd5b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f528361132f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611fa382611e6b565b611fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd99061438c565b60405180910390fd5b6000611fed8361132f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061205c57508373ffffffffffffffffffffffffffffffffffffffff1661204484610b46565b73ffffffffffffffffffffffffffffffffffffffff16145b8061206d575061206c8185611c45565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120968261132f565b73ffffffffffffffffffffffffffffffffffffffff16146120ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e39061441e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561215c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612153906144b0565b60405180910390fd5b61216783838361258d565b612172600082611edf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121c291906144d0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122199190613eec565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818310156122e257816122e4565b825b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123cc8282604051806020016040528060008152506126a1565b5050565b6123db848484612076565b6123e7848484846126fc565b612426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241d90614576565b60405180910390fd5b50505050565b60606000821415612474576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612588565b600082905060005b600082146124a657808061248f90614040565b915050600a8261249f9190613a8e565b915061247c565b60008167ffffffffffffffff8111156124c2576124c16130d2565b5b6040519080825280601f01601f1916602001820160405280156124f45781602001600182028036833780820191505090505b5090505b600085146125815760018261250d91906144d0565b9150600a8561251c9190614596565b60306125289190613eec565b60f81b81838151811061253e5761253d613be3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561257a9190613a8e565b94506124f8565b8093505050505b919050565b612598838383612884565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125db576125d681612889565b61261a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126195761261883826128d2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561265d5761265881612a3f565b61269c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461269b5761269a8282612b10565b5b5b505050565b6126ab8383612b8f565b6126b860008484846126fc565b6126f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ee90614576565b60405180910390fd5b505050565b600061271d8473ffffffffffffffffffffffffffffffffffffffff16612d5d565b15612877578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612746611ed7565b8786866040518563ffffffff1660e01b8152600401612768949392919061461c565b6020604051808303816000875af19250505080156127a457506040513d601f19601f820116820180604052508101906127a1919061467d565b60015b612827573d80600081146127d4576040519150601f19603f3d011682016040523d82523d6000602084013e6127d9565b606091505b5060008151141561281f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281690614576565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061287c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016128df8461148f565b6128e991906144d0565b90506000600760008481526020019081526020016000205490508181146129ce576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a5391906144d0565b9050600060096000848152602001908152602001600020549050600060088381548110612a8357612a82613be3565b5b906000526020600020015490508060088381548110612aa557612aa4613be3565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612af457612af36146aa565b5b6001900381819060005260206000200160009055905550505050565b6000612b1b8361148f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf690614725565b60405180910390fd5b612c0881611e6b565b15612c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3f90614791565b60405180910390fd5b612c546000838361258d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ca49190613eec565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612d7c906136f0565b90600052602060002090601f016020900481019282612d9e5760008555612de5565b82601f10612db757805160ff1916838001178555612de5565b82800160010185558215612de5579182015b82811115612de4578251825591602001919060010190612dc9565b5b509050612df29190612df6565b5090565b5b80821115612e0f576000816000905550600101612df7565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e5c81612e27565b8114612e6757600080fd5b50565b600081359050612e7981612e53565b92915050565b600060208284031215612e9557612e94612e1d565b5b6000612ea384828501612e6a565b91505092915050565b60008115159050919050565b612ec181612eac565b82525050565b6000602082019050612edc6000830184612eb8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f1c578082015181840152602081019050612f01565b83811115612f2b576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f4d82612ee2565b612f578185612eed565b9350612f67818560208601612efe565b612f7081612f31565b840191505092915050565b60006020820190508181036000830152612f958184612f42565b905092915050565b6000819050919050565b612fb081612f9d565b8114612fbb57600080fd5b50565b600081359050612fcd81612fa7565b92915050565b600060208284031215612fe957612fe8612e1d565b5b6000612ff784828501612fbe565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061302b82613000565b9050919050565b61303b81613020565b82525050565b60006020820190506130566000830184613032565b92915050565b61306581613020565b811461307057600080fd5b50565b6000813590506130828161305c565b92915050565b6000806040838503121561309f5761309e612e1d565b5b60006130ad85828601613073565b92505060206130be85828601612fbe565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61310a82612f31565b810181811067ffffffffffffffff82111715613129576131286130d2565b5b80604052505050565b600061313c612e13565b90506131488282613101565b919050565b600067ffffffffffffffff821115613168576131676130d2565b5b61317182612f31565b9050602081019050919050565b82818337600083830152505050565b60006131a061319b8461314d565b613132565b9050828152602081018484840111156131bc576131bb6130cd565b5b6131c784828561317e565b509392505050565b600082601f8301126131e4576131e36130c8565b5b81356131f484826020860161318d565b91505092915050565b60006020828403121561321357613212612e1d565b5b600082013567ffffffffffffffff81111561323157613230612e22565b5b61323d848285016131cf565b91505092915050565b61324f81612f9d565b82525050565b600060208201905061326a6000830184613246565b92915050565b60008060006060848603121561328957613288612e1d565b5b600061329786828701613073565b93505060206132a886828701613073565b92505060406132b986828701612fbe565b9150509250925092565b600080604083850312156132da576132d9612e1d565b5b60006132e885828601612fbe565b92505060206132f985828601612fbe565b9150509250929050565b60006040820190506133186000830185613032565b6133256020830184613246565b9392505050565b6000806040838503121561334357613342612e1d565b5b600083013567ffffffffffffffff81111561336157613360612e22565b5b61336d858286016131cf565b925050602083013567ffffffffffffffff81111561338e5761338d612e22565b5b61339a858286016131cf565b9150509250929050565b6000602082840312156133ba576133b9612e1d565b5b60006133c884828501613073565b91505092915050565b600080604083850312156133e8576133e7612e1d565b5b60006133f685828601612fbe565b925050602061340785828601613073565b9150509250929050565b61341a81612eac565b811461342557600080fd5b50565b60008135905061343781613411565b92915050565b6000806040838503121561345457613453612e1d565b5b600061346285828601613073565b925050602061347385828601613428565b9150509250929050565b600067ffffffffffffffff821115613498576134976130d2565b5b6134a182612f31565b9050602081019050919050565b60006134c16134bc8461347d565b613132565b9050828152602081018484840111156134dd576134dc6130cd565b5b6134e884828561317e565b509392505050565b600082601f830112613505576135046130c8565b5b81356135158482602086016134ae565b91505092915050565b6000806000806080858703121561353857613537612e1d565b5b600061354687828801613073565b945050602061355787828801613073565b935050604061356887828801612fbe565b925050606085013567ffffffffffffffff81111561358957613588612e22565b5b613595878288016134f0565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6135d681612f9d565b82525050565b60006135e883836135cd565b60208301905092915050565b6000602082019050919050565b600061360c826135a1565b61361681856135ac565b9350613621836135bd565b8060005b8381101561365257815161363988826135dc565b9750613644836135f4565b925050600181019050613625565b5085935050505092915050565b600060208201905081810360008301526136798184613601565b905092915050565b6000806040838503121561369857613697612e1d565b5b60006136a685828601613073565b92505060206136b785828601613073565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061370857607f821691505b6020821081141561371c5761371b6136c1565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061377e602c83612eed565b915061378982613722565b604082019050919050565b600060208201905081810360008301526137ad81613771565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613810602183612eed565b915061381b826137b4565b604082019050919050565b6000602082019050818103600083015261383f81613803565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006138a2603883612eed565b91506138ad82613846565b604082019050919050565b600060208201905081810360008301526138d181613895565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061390e602083612eed565b9150613919826138d8565b602082019050919050565b6000602082019050818103600083015261393d81613901565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006139a0603183612eed565b91506139ab82613944565b604082019050919050565b600060208201905081810360008301526139cf81613993565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a1082612f9d565b9150613a1b83612f9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a5457613a536139d6565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a9982612f9d565b9150613aa483612f9d565b925082613ab457613ab3613a5f565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613b1b602b83612eed565b9150613b2682613abf565b604082019050919050565b60006020820190508181036000830152613b4a81613b0e565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613bad602c83612eed565b9150613bb882613b51565b604082019050919050565b60006020820190508181036000830152613bdc81613ba0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613c6e602983612eed565b9150613c7982613c12565b604082019050919050565b60006020820190508181036000830152613c9d81613c61565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613d00602a83612eed565b9150613d0b82613ca4565b604082019050919050565b60006020820190508181036000830152613d2f81613cf3565b9050919050565b7f43616e6e6f74206d696e742030206f722061206e6567617469766520616d6f7560008201527f6e74206f6620746f6b656e730000000000000000000000000000000000000000602082015250565b6000613d92602c83612eed565b9150613d9d82613d36565b604082019050919050565b60006020820190508181036000830152613dc181613d85565b9050919050565b7f43616e6e6f74206d696e7420736f206d616e7920746f6b656e7320617420746860008201527f652073616d652074696d65000000000000000000000000000000000000000000602082015250565b6000613e24602b83612eed565b9150613e2f82613dc8565b604082019050919050565b60006020820190508181036000830152613e5381613e17565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420746f6b6560008201527f6e73000000000000000000000000000000000000000000000000000000000000602082015250565b6000613eb6602283612eed565b9150613ec182613e5a565b604082019050919050565b60006020820190508181036000830152613ee581613ea9565b9050919050565b6000613ef782612f9d565b9150613f0283612f9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f3757613f366139d6565b5b828201905092915050565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b6000613f9e602a83612eed565b9150613fa982613f42565b604082019050919050565b60006020820190508181036000830152613fcd81613f91565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b600061400a601f83612eed565b915061401582613fd4565b602082019050919050565b6000602082019050818103600083015261403981613ffd565b9050919050565b600061404b82612f9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561407e5761407d6139d6565b5b600182019050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006140bf601983612eed565b91506140ca82614089565b602082019050919050565b600060208201905081810360008301526140ee816140b2565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614151602f83612eed565b915061415c826140f5565b604082019050919050565b6000602082019050818103600083015261418081614144565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546141b4816136f0565b6141be8186614187565b945060018216600081146141d957600181146141ea5761421d565b60ff1983168652818601935061421d565b6141f385614192565b60005b83811015614215578154818901526001820191506020810190506141f6565b838801955050505b50505092915050565b600061423182612ee2565b61423b8185614187565b935061424b818560208601612efe565b80840191505092915050565b600061426382866141a7565b915061426f8285614226565b915061427b82846141a7565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142e4602683612eed565b91506142ef82614288565b604082019050919050565b60006020820190508181036000830152614313816142d7565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614376602c83612eed565b91506143818261431a565b604082019050919050565b600060208201905081810360008301526143a581614369565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614408602983612eed565b9150614413826143ac565b604082019050919050565b60006020820190508181036000830152614437816143fb565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061449a602483612eed565b91506144a58261443e565b604082019050919050565b600060208201905081810360008301526144c98161448d565b9050919050565b60006144db82612f9d565b91506144e683612f9d565b9250828210156144f9576144f86139d6565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614560603283612eed565b915061456b82614504565b604082019050919050565b6000602082019050818103600083015261458f81614553565b9050919050565b60006145a182612f9d565b91506145ac83612f9d565b9250826145bc576145bb613a5f565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006145ee826145c7565b6145f881856145d2565b9350614608818560208601612efe565b61461181612f31565b840191505092915050565b60006080820190506146316000830187613032565b61463e6020830186613032565b61464b6040830185613246565b818103606083015261465d81846145e3565b905095945050505050565b60008151905061467781612e53565b92915050565b60006020828403121561469357614692612e1d565b5b60006146a184828501614668565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061470f602083612eed565b915061471a826146d9565b602082019050919050565b6000602082019050818103600083015261473e81614702565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061477b601c83612eed565b915061478682614745565b602082019050919050565b600060208201905081810360008301526147aa8161476e565b905091905056fea2646970667358221220240e0981b6cae37b8cba36be538c6b5319f6a56cea5b756b7adf3da91635255864736f6c634300080b0033

Deployed Bytecode Sourcemap

46802:4738:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48688:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25285:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26978:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26501:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47468:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39719:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47106:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28037:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51245:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;39300:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50132:91;;;;;;;;;;;;;:::i;:::-;;47304:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47239:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49190:143;;;;;;;;;;;;;:::i;:::-;;28484:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49511:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39909:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46925:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46968:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47199:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24892:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47824:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24535:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2525:94;;;;;;;;;;;;;:::i;:::-;;47030:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1874:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50231:1006;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25454:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47601:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27358:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28740:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49727:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48031:585;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27756:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2774:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47155:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49341:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48688:494;48845:4;48902:26;48887:41;;;:11;:41;;;;:98;;;;48960:25;48945:40;;;:11;:40;;;;48887:98;:155;;;;49017:25;49002:40;;;:11;:40;;;;48887:155;:222;;;;49074:35;49059:50;;;:11;:50;;;;48887:222;:287;;;;49141:33;49126:48;;;:11;:48;;;;48887:287;48867:307;;48688:494;;;:::o;25285:100::-;25339:13;25372:5;25365:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25285:100;:::o;26978:308::-;27099:7;27146:16;27154:7;27146;:16::i;:::-;27124:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;27254:15;:24;27270:7;27254:24;;;;;;;;;;;;;;;;;;;;;27247:31;;26978:308;;;:::o;26501:411::-;26582:13;26598:23;26613:7;26598:14;:23::i;:::-;26582:39;;26646:5;26640:11;;:2;:11;;;;26632:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26740:5;26724:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26749:37;26766:5;26773:12;:10;:12::i;:::-;26749:16;:37::i;:::-;26724:62;26702:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26883:21;26892:2;26896:7;26883:8;:21::i;:::-;26571:341;26501:411;;:::o;47468:125::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47571:14:::1;47553:15;:32;;;;;;;;;;;;:::i;:::-;;47468:125:::0;:::o;39719:113::-;39780:7;39807:10;:17;;;;39800:24;;39719:113;:::o;47106:42::-;;;;:::o;28037:376::-;28246:41;28265:12;:10;:12::i;:::-;28279:7;28246:18;:41::i;:::-;28224:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;28377:28;28387:4;28393:2;28397:7;28377:9;:28::i;:::-;28037:376;;;:::o;51245:292::-;51380:16;51398:21;51448:7;:5;:7::i;:::-;51437:18;;51482:47;51527:1;51518:3;51496:18;;51484:9;:30;;;;:::i;:::-;51483:38;;;;:::i;:::-;51482:44;;:47;;;;:::i;:::-;51466:63;;51245:292;;;;;:::o;39300:343::-;39442:7;39497:23;39514:5;39497:16;:23::i;:::-;39489:5;:31;39467:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;39609:12;:19;39622:5;39609:19;;;;;;;;;;;;;;;:26;39629:5;39609:26;;;;;;;;;;;;39602:33;;39300:343;;;;:::o;50132:91::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50202:13:::1;;;;;;;;;;;50201:14;50185:13;;:30;;;;;;;;;;;;;;;;;;50132:91::o:0;47304:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47239:58::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49190:143::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49238:15:::1;49256:21;49238:39;;49296:10;49288:28;;:37;49317:7;49288:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;49227:106;49190:143::o:0;28484:185::-;28622:39;28639:4;28645:2;28649:7;28622:39;;;;;;;;;;;;:16;:39::i;:::-;28484:185;;;:::o;49511:208::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49657:1:::1;49633:20;:25;;49625:34;;;::::0;::::1;;49691:20;49670:18;:41;;;;49511:208:::0;:::o;39909:320::-;40029:7;40084:30;:28;:30::i;:::-;40076:5;:38;40054:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;40204:10;40215:5;40204:17;;;;;;;;:::i;:::-;;;;;;;;;;40197:24;;39909:320;;;:::o;46925:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46968:55::-;;;;:::o;47199:33::-;;;;;;;;;;;;;:::o;24892:326::-;25009:7;25034:13;25050:7;:16;25058:7;25050:16;;;;;;;;;;;;;;;;;;;;;25034:32;;25116:1;25099:19;;:5;:19;;;;25077:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;25205:5;25198:12;;;24892:326;;;:::o;47824:199::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47967:15:::1;47951:13;:31;;;;;;;;;;;;:::i;:::-;;48006:9;47993:10;:22;;;;;;;;;;;;:::i;:::-;;47824:199:::0;;:::o;24535:295::-;24652:7;24716:1;24699:19;;:5;:19;;;;24677:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24806:9;:16;24816:5;24806:16;;;;;;;;;;;;;;;;24799:23;;24535:295;;;:::o;2525:94::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2590:21:::1;2608:1;2590:9;:21::i;:::-;2525:94::o:0;47030:38::-;;;;:::o;1874:87::-;1920:7;1947:6;;;;;;;;;;;1940:13;;1874:87;:::o;50231:1006::-;50385:1;50368:14;:18;50346:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;50509:35;;50491:14;:53;;50469:146;;;;;;;;;;;;:::i;:::-;;;;;;;;;50634:13;;;;;;;;;;;50626:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;50754:15;;50736:14;50720:13;:11;:13::i;:::-;:30;;;;:::i;:::-;50719:50;50697:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;50870:7;:5;:7::i;:::-;50856:21;;:10;:21;;;50852:193;;50957:9;50938:14;50921;;:31;;;;:::i;:::-;50920:46;;50894:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;50852:193;51079:9;51074:156;51098:14;51094:1;:18;51074:156;;;51134:15;51152:13;:11;:13::i;:::-;51134:31;;51180:38;51190:18;51210:7;51180:9;:38::i;:::-;51119:111;51114:3;;;;;:::i;:::-;;;;51074:156;;;;50231:1006;;:::o;25454:104::-;25510:13;25543:7;25536:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25454:104;:::o;47601:215::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47774:34:::1;47736:35;:72;;;;47601:215:::0;:::o;27358:327::-;27505:12;:10;:12::i;:::-;27493:24;;:8;:24;;;;27485:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27605:8;27560:18;:32;27579:12;:10;:12::i;:::-;27560:32;;;;;;;;;;;;;;;:42;27593:8;27560:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27658:8;27629:48;;27644:12;:10;:12::i;:::-;27629:48;;;27668:8;27629:48;;;;;;:::i;:::-;;;;;;;;27358:327;;:::o;28740:365::-;28929:41;28948:12;:10;:12::i;:::-;28962:7;28929:18;:41::i;:::-;28907:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;29058:39;29072:4;29078:2;29082:7;29091:5;29058:13;:39::i;:::-;28740:365;;;;:::o;49727:397::-;49817:16;49851:23;49877:16;49887:5;49877:9;:16::i;:::-;49851:42;;49906:25;49948:15;49934:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49906:58;;49982:9;49977:112;49997:15;49993:1;:19;49977:112;;;50048:29;50068:5;50075:1;50048:19;:29::i;:::-;50034:8;50043:1;50034:11;;;;;;;;:::i;:::-;;;;;;;:43;;;;;50014:3;;;;;:::i;:::-;;;;49977:112;;;;50108:8;50101:15;;;;49727:397;;;:::o;48031:585::-;48149:13;48202:16;48210:7;48202;:16::i;:::-;48180:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;48356:1;48332:13;48326:27;;;;;:::i;:::-;;;:31;:282;;;;;;;;;;;;;;;;;48449:13;48489:18;:7;:16;:18::i;:::-;48534:10;48406:161;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48326:282;48306:302;;48031:585;;;:::o;27756:214::-;27898:4;27927:18;:25;27946:5;27927:25;;;;;;;;;;;;;;;:35;27953:8;27927:35;;;;;;;;;;;;;;;;;;;;;;;;;27920:42;;27756:214;;;;:::o;2774:229::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2897:1:::1;2877:22;;:8;:22;;;;2855:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;2976:19;2986:8;2976:9;:19::i;:::-;2774:229:::0;:::o;47155:37::-;;;;:::o;49341:162::-;2105:12;:10;:12::i;:::-;2094:23;;:7;:5;:7::i;:::-;:23;;;2086:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49449:1:::1;49429:16;:21;;49421:30;;;::::0;::::1;;49479:16;49462:14;:33;;;;49341:162:::0;:::o;30652:127::-;30717:4;30769:1;30741:30;;:7;:16;30749:7;30741:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30734:37;;30652:127;;;:::o;670:98::-;723:7;750:10;743:17;;670:98;:::o;34775:174::-;34877:2;34850:15;:24;34866:7;34850:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34933:7;34929:2;34895:46;;34904:23;34919:7;34904:14;:23::i;:::-;34895:46;;;;;;;;;;;;34775:174;;:::o;30946:452::-;31075:4;31119:16;31127:7;31119;:16::i;:::-;31097:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31218:13;31234:23;31249:7;31234:14;:23::i;:::-;31218:39;;31287:5;31276:16;;:7;:16;;;:64;;;;31333:7;31309:31;;:20;31321:7;31309:11;:20::i;:::-;:31;;;31276:64;:113;;;;31357:32;31374:5;31381:7;31357:16;:32::i;:::-;31276:113;31268:122;;;30946:452;;;;:::o;34042:615::-;34215:4;34188:31;;:23;34203:7;34188:14;:23::i;:::-;:31;;;34166:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;34321:1;34307:16;;:2;:16;;;;34299:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34377:39;34398:4;34404:2;34408:7;34377:20;:39::i;:::-;34481:29;34498:1;34502:7;34481:8;:29::i;:::-;34542:1;34523:9;:15;34533:4;34523:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34571:1;34554:9;:13;34564:2;34554:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34602:2;34583:7;:16;34591:7;34583:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34641:7;34637:2;34622:27;;34631:4;34622:27;;;;;;;;;;;;34042:615;;;:::o;3411:107::-;3469:7;3501:1;3496;:6;;:14;;3509:1;3496:14;;;3505:1;3496:14;3489:21;;3411:107;;;;:::o;3011:173::-;3067:16;3086:6;;;;;;;;;;;3067:25;;3112:8;3103:6;;:17;;;;;;;;;;;;;;;;;;3167:8;3136:40;;3157:8;3136:40;;;;;;;;;;;;3056:128;3011:173;:::o;31740:110::-;31816:26;31826:2;31830:7;31816:26;;;;;;;;;;;;:9;:26::i;:::-;31740:110;;:::o;29987:352::-;30144:28;30154:4;30160:2;30164:7;30144:9;:28::i;:::-;30205:48;30228:4;30234:2;30238:7;30247:5;30205:22;:48::i;:::-;30183:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;29987:352;;;;:::o;4612:723::-;4668:13;4898:1;4889:5;:10;4885:53;;;4916:10;;;;;;;;;;;;;;;;;;;;;4885:53;4948:12;4963:5;4948:20;;4979:14;5004:78;5019:1;5011:4;:9;5004:78;;5037:8;;;;;:::i;:::-;;;;5068:2;5060:10;;;;;:::i;:::-;;;5004:78;;;5092:19;5124:6;5114:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5092:39;;5142:154;5158:1;5149:5;:10;5142:154;;5186:1;5176:11;;;;;:::i;:::-;;;5253:2;5245:5;:10;;;;:::i;:::-;5232:2;:24;;;;:::i;:::-;5219:39;;5202:6;5209;5202:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5282:2;5273:11;;;;;:::i;:::-;;;5142:154;;;5320:6;5306:21;;;;;4612:723;;;;:::o;40842:589::-;40986:45;41013:4;41019:2;41023:7;40986:26;:45::i;:::-;41064:1;41048:18;;:4;:18;;;41044:187;;;41083:40;41115:7;41083:31;:40::i;:::-;41044:187;;;41153:2;41145:10;;:4;:10;;;41141:90;;41172:47;41205:4;41211:7;41172:32;:47::i;:::-;41141:90;41044:187;41259:1;41245:16;;:2;:16;;;41241:183;;;41278:45;41315:7;41278:36;:45::i;:::-;41241:183;;;41351:4;41345:10;;:2;:10;;;41341:83;;41372:40;41400:2;41404:7;41372:27;:40::i;:::-;41341:83;41241:183;40842:589;;;:::o;32077:321::-;32207:18;32213:2;32217:7;32207:5;:18::i;:::-;32258:54;32289:1;32293:2;32297:7;32306:5;32258:22;:54::i;:::-;32236:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32077:321;;;:::o;35514:980::-;35669:4;35690:15;:2;:13;;;:15::i;:::-;35686:801;;;35759:2;35743:36;;;35802:12;:10;:12::i;:::-;35837:4;35864:7;35894:5;35743:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35722:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36118:1;36101:6;:13;:18;36097:320;;;36144:108;;;;;;;;;;:::i;:::-;;;;;;;;36097:320;36367:6;36361:13;36352:6;36348:2;36344:15;36337:38;35722:710;35992:41;;;35982:51;;;:6;:51;;;;35975:58;;;;;35686:801;36471:4;36464:11;;35514:980;;;;;;;:::o;37066:126::-;;;;:::o;42154:164::-;42258:10;:17;;;;42231:15;:24;42247:7;42231:24;;;;;;;;;;;:44;;;;42286:10;42302:7;42286:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42154:164;:::o;42945:1002::-;43225:22;43275:1;43250:22;43267:4;43250:16;:22::i;:::-;:26;;;;:::i;:::-;43225:51;;43287:18;43308:17;:26;43326:7;43308:26;;;;;;;;;;;;43287:47;;43455:14;43441:10;:28;43437:328;;43486:19;43508:12;:18;43521:4;43508:18;;;;;;;;;;;;;;;:34;43527:14;43508:34;;;;;;;;;;;;43486:56;;43592:11;43559:12;:18;43572:4;43559:18;;;;;;;;;;;;;;;:30;43578:10;43559:30;;;;;;;;;;;:44;;;;43709:10;43676:17;:30;43694:11;43676:30;;;;;;;;;;;:43;;;;43471:294;43437:328;43861:17;:26;43879:7;43861:26;;;;;;;;;;;43854:33;;;43905:12;:18;43918:4;43905:18;;;;;;;;;;;;;;;:34;43924:14;43905:34;;;;;;;;;;;43898:41;;;43040:907;;42945:1002;;:::o;44242:1079::-;44495:22;44540:1;44520:10;:17;;;;:21;;;;:::i;:::-;44495:46;;44552:18;44573:15;:24;44589:7;44573:24;;;;;;;;;;;;44552:45;;44924:19;44946:10;44957:14;44946:26;;;;;;;;:::i;:::-;;;;;;;;;;44924:48;;45010:11;44985:10;44996;44985:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45121:10;45090:15;:28;45106:11;45090:28;;;;;;;;;;;:41;;;;45262:15;:24;45278:7;45262:24;;;;;;;;;;;45255:31;;;45297:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44313:1008;;;44242:1079;:::o;41732:221::-;41817:14;41834:20;41851:2;41834:16;:20::i;:::-;41817:37;;41892:7;41865:12;:16;41878:2;41865:16;;;;;;;;;;;;;;;:24;41882:6;41865:24;;;;;;;;;;;:34;;;;41939:6;41910:17;:26;41928:7;41910:26;;;;;;;;;;;:35;;;;41806:147;41732:221;;:::o;32734:382::-;32828:1;32814:16;;:2;:16;;;;32806:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32887:16;32895:7;32887;:16::i;:::-;32886:17;32878:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32949:45;32978:1;32982:2;32986:7;32949:20;:45::i;:::-;33024:1;33007:9;:13;33017:2;33007:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33055:2;33036:7;:16;33044:7;33036:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33100:7;33096:2;33075:33;;33092:1;33075:33;;;;;;;;;;;;32734:382;;:::o;14179:387::-;14239:4;14447:12;14514:7;14502:20;14494:28;;14557:1;14550:4;:8;14543:15;;;14179:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:180;5232:77;5229:1;5222:88;5329:4;5326:1;5319:15;5353:4;5350:1;5343:15;5370:281;5453:27;5475:4;5453:27;:::i;:::-;5445:6;5441:40;5583:6;5571:10;5568:22;5547:18;5535:10;5532:34;5529:62;5526:88;;;5594:18;;:::i;:::-;5526:88;5634:10;5630:2;5623:22;5413:238;5370:281;;:::o;5657:129::-;5691:6;5718:20;;:::i;:::-;5708:30;;5747:33;5775:4;5767:6;5747:33;:::i;:::-;5657:129;;;:::o;5792:308::-;5854:4;5944:18;5936:6;5933:30;5930:56;;;5966:18;;:::i;:::-;5930:56;6004:29;6026:6;6004:29;:::i;:::-;5996:37;;6088:4;6082;6078:15;6070:23;;5792:308;;;:::o;6106:154::-;6190:6;6185:3;6180;6167:30;6252:1;6243:6;6238:3;6234:16;6227:27;6106:154;;;:::o;6266:412::-;6344:5;6369:66;6385:49;6427:6;6385:49;:::i;:::-;6369:66;:::i;:::-;6360:75;;6458:6;6451:5;6444:21;6496:4;6489:5;6485:16;6534:3;6525:6;6520:3;6516:16;6513:25;6510:112;;;6541:79;;:::i;:::-;6510:112;6631:41;6665:6;6660:3;6655;6631:41;:::i;:::-;6350:328;6266:412;;;;;:::o;6698:340::-;6754:5;6803:3;6796:4;6788:6;6784:17;6780:27;6770:122;;6811:79;;:::i;:::-;6770:122;6928:6;6915:20;6953:79;7028:3;7020:6;7013:4;7005:6;7001:17;6953:79;:::i;:::-;6944:88;;6760:278;6698:340;;;;:::o;7044:509::-;7113:6;7162:2;7150:9;7141:7;7137:23;7133:32;7130:119;;;7168:79;;:::i;:::-;7130:119;7316:1;7305:9;7301:17;7288:31;7346:18;7338:6;7335:30;7332:117;;;7368:79;;:::i;:::-;7332:117;7473:63;7528:7;7519:6;7508:9;7504:22;7473:63;:::i;:::-;7463:73;;7259:287;7044:509;;;;:::o;7559:118::-;7646:24;7664:5;7646:24;:::i;:::-;7641:3;7634:37;7559:118;;:::o;7683:222::-;7776:4;7814:2;7803:9;7799:18;7791:26;;7827:71;7895:1;7884:9;7880:17;7871:6;7827:71;:::i;:::-;7683:222;;;;:::o;7911:619::-;7988:6;7996;8004;8053:2;8041:9;8032:7;8028:23;8024:32;8021:119;;;8059:79;;:::i;:::-;8021:119;8179:1;8204:53;8249:7;8240:6;8229:9;8225:22;8204:53;:::i;:::-;8194:63;;8150:117;8306:2;8332:53;8377:7;8368:6;8357:9;8353:22;8332:53;:::i;:::-;8322:63;;8277:118;8434:2;8460:53;8505:7;8496:6;8485:9;8481:22;8460:53;:::i;:::-;8450:63;;8405:118;7911:619;;;;;:::o;8536:474::-;8604:6;8612;8661:2;8649:9;8640:7;8636:23;8632:32;8629:119;;;8667:79;;:::i;:::-;8629:119;8787:1;8812:53;8857:7;8848:6;8837:9;8833:22;8812:53;:::i;:::-;8802:63;;8758:117;8914:2;8940:53;8985:7;8976:6;8965:9;8961:22;8940:53;:::i;:::-;8930:63;;8885:118;8536:474;;;;;:::o;9016:332::-;9137:4;9175:2;9164:9;9160:18;9152:26;;9188:71;9256:1;9245:9;9241:17;9232:6;9188:71;:::i;:::-;9269:72;9337:2;9326:9;9322:18;9313:6;9269:72;:::i;:::-;9016:332;;;;;:::o;9354:834::-;9442:6;9450;9499:2;9487:9;9478:7;9474:23;9470:32;9467:119;;;9505:79;;:::i;:::-;9467:119;9653:1;9642:9;9638:17;9625:31;9683:18;9675:6;9672:30;9669:117;;;9705:79;;:::i;:::-;9669:117;9810:63;9865:7;9856:6;9845:9;9841:22;9810:63;:::i;:::-;9800:73;;9596:287;9950:2;9939:9;9935:18;9922:32;9981:18;9973:6;9970:30;9967:117;;;10003:79;;:::i;:::-;9967:117;10108:63;10163:7;10154:6;10143:9;10139:22;10108:63;:::i;:::-;10098:73;;9893:288;9354:834;;;;;:::o;10194:329::-;10253:6;10302:2;10290:9;10281:7;10277:23;10273:32;10270:119;;;10308:79;;:::i;:::-;10270:119;10428:1;10453:53;10498:7;10489:6;10478:9;10474:22;10453:53;:::i;:::-;10443:63;;10399:117;10194:329;;;;:::o;10529:474::-;10597:6;10605;10654:2;10642:9;10633:7;10629:23;10625:32;10622:119;;;10660:79;;:::i;:::-;10622:119;10780:1;10805:53;10850:7;10841:6;10830:9;10826:22;10805:53;:::i;:::-;10795:63;;10751:117;10907:2;10933:53;10978:7;10969:6;10958:9;10954:22;10933:53;:::i;:::-;10923:63;;10878:118;10529:474;;;;;:::o;11009:116::-;11079:21;11094:5;11079:21;:::i;:::-;11072:5;11069:32;11059:60;;11115:1;11112;11105:12;11059:60;11009:116;:::o;11131:133::-;11174:5;11212:6;11199:20;11190:29;;11228:30;11252:5;11228:30;:::i;:::-;11131:133;;;;:::o;11270:468::-;11335:6;11343;11392:2;11380:9;11371:7;11367:23;11363:32;11360:119;;;11398:79;;:::i;:::-;11360:119;11518:1;11543:53;11588:7;11579:6;11568:9;11564:22;11543:53;:::i;:::-;11533:63;;11489:117;11645:2;11671:50;11713:7;11704:6;11693:9;11689:22;11671:50;:::i;:::-;11661:60;;11616:115;11270:468;;;;;:::o;11744:307::-;11805:4;11895:18;11887:6;11884:30;11881:56;;;11917:18;;:::i;:::-;11881:56;11955:29;11977:6;11955:29;:::i;:::-;11947:37;;12039:4;12033;12029:15;12021:23;;11744:307;;;:::o;12057:410::-;12134:5;12159:65;12175:48;12216:6;12175:48;:::i;:::-;12159:65;:::i;:::-;12150:74;;12247:6;12240:5;12233:21;12285:4;12278:5;12274:16;12323:3;12314:6;12309:3;12305:16;12302:25;12299:112;;;12330:79;;:::i;:::-;12299:112;12420:41;12454:6;12449:3;12444;12420:41;:::i;:::-;12140:327;12057:410;;;;;:::o;12486:338::-;12541:5;12590:3;12583:4;12575:6;12571:17;12567:27;12557:122;;12598:79;;:::i;:::-;12557:122;12715:6;12702:20;12740:78;12814:3;12806:6;12799:4;12791:6;12787:17;12740:78;:::i;:::-;12731:87;;12547:277;12486:338;;;;:::o;12830:943::-;12925:6;12933;12941;12949;12998:3;12986:9;12977:7;12973:23;12969:33;12966:120;;;13005:79;;:::i;:::-;12966:120;13125:1;13150:53;13195:7;13186:6;13175:9;13171:22;13150:53;:::i;:::-;13140:63;;13096:117;13252:2;13278:53;13323:7;13314:6;13303:9;13299:22;13278:53;:::i;:::-;13268:63;;13223:118;13380:2;13406:53;13451:7;13442:6;13431:9;13427:22;13406:53;:::i;:::-;13396:63;;13351:118;13536:2;13525:9;13521:18;13508:32;13567:18;13559:6;13556:30;13553:117;;;13589:79;;:::i;:::-;13553:117;13694:62;13748:7;13739:6;13728:9;13724:22;13694:62;:::i;:::-;13684:72;;13479:287;12830:943;;;;;;;:::o;13779:114::-;13846:6;13880:5;13874:12;13864:22;;13779:114;;;:::o;13899:184::-;13998:11;14032:6;14027:3;14020:19;14072:4;14067:3;14063:14;14048:29;;13899:184;;;;:::o;14089:132::-;14156:4;14179:3;14171:11;;14209:4;14204:3;14200:14;14192:22;;14089:132;;;:::o;14227:108::-;14304:24;14322:5;14304:24;:::i;:::-;14299:3;14292:37;14227:108;;:::o;14341:179::-;14410:10;14431:46;14473:3;14465:6;14431:46;:::i;:::-;14509:4;14504:3;14500:14;14486:28;;14341:179;;;;:::o;14526:113::-;14596:4;14628;14623:3;14619:14;14611:22;;14526:113;;;:::o;14675:732::-;14794:3;14823:54;14871:5;14823:54;:::i;:::-;14893:86;14972:6;14967:3;14893:86;:::i;:::-;14886:93;;15003:56;15053:5;15003:56;:::i;:::-;15082:7;15113:1;15098:284;15123:6;15120:1;15117:13;15098:284;;;15199:6;15193:13;15226:63;15285:3;15270:13;15226:63;:::i;:::-;15219:70;;15312:60;15365:6;15312:60;:::i;:::-;15302:70;;15158:224;15145:1;15142;15138:9;15133:14;;15098:284;;;15102:14;15398:3;15391:10;;14799:608;;;14675:732;;;;:::o;15413:373::-;15556:4;15594:2;15583:9;15579:18;15571:26;;15643:9;15637:4;15633:20;15629:1;15618:9;15614:17;15607:47;15671:108;15774:4;15765:6;15671:108;:::i;:::-;15663:116;;15413:373;;;;:::o;15792:474::-;15860:6;15868;15917:2;15905:9;15896:7;15892:23;15888:32;15885:119;;;15923:79;;:::i;:::-;15885:119;16043:1;16068:53;16113:7;16104:6;16093:9;16089:22;16068:53;:::i;:::-;16058:63;;16014:117;16170:2;16196:53;16241:7;16232:6;16221:9;16217:22;16196:53;:::i;:::-;16186:63;;16141:118;15792:474;;;;;:::o;16272:180::-;16320:77;16317:1;16310:88;16417:4;16414:1;16407:15;16441:4;16438:1;16431:15;16458:320;16502:6;16539:1;16533:4;16529:12;16519:22;;16586:1;16580:4;16576:12;16607:18;16597:81;;16663:4;16655:6;16651:17;16641:27;;16597:81;16725:2;16717:6;16714:14;16694:18;16691:38;16688:84;;;16744:18;;:::i;:::-;16688:84;16509:269;16458:320;;;:::o;16784:231::-;16924:34;16920:1;16912:6;16908:14;16901:58;16993:14;16988:2;16980:6;16976:15;16969:39;16784:231;:::o;17021:366::-;17163:3;17184:67;17248:2;17243:3;17184:67;:::i;:::-;17177:74;;17260:93;17349:3;17260:93;:::i;:::-;17378:2;17373:3;17369:12;17362:19;;17021:366;;;:::o;17393:419::-;17559:4;17597:2;17586:9;17582:18;17574:26;;17646:9;17640:4;17636:20;17632:1;17621:9;17617:17;17610:47;17674:131;17800:4;17674:131;:::i;:::-;17666:139;;17393:419;;;:::o;17818:220::-;17958:34;17954:1;17946:6;17942:14;17935:58;18027:3;18022:2;18014:6;18010:15;18003:28;17818:220;:::o;18044:366::-;18186:3;18207:67;18271:2;18266:3;18207:67;:::i;:::-;18200:74;;18283:93;18372:3;18283:93;:::i;:::-;18401:2;18396:3;18392:12;18385:19;;18044:366;;;:::o;18416:419::-;18582:4;18620:2;18609:9;18605:18;18597:26;;18669:9;18663:4;18659:20;18655:1;18644:9;18640:17;18633:47;18697:131;18823:4;18697:131;:::i;:::-;18689:139;;18416:419;;;:::o;18841:243::-;18981:34;18977:1;18969:6;18965:14;18958:58;19050:26;19045:2;19037:6;19033:15;19026:51;18841:243;:::o;19090:366::-;19232:3;19253:67;19317:2;19312:3;19253:67;:::i;:::-;19246:74;;19329:93;19418:3;19329:93;:::i;:::-;19447:2;19442:3;19438:12;19431:19;;19090:366;;;:::o;19462:419::-;19628:4;19666:2;19655:9;19651:18;19643:26;;19715:9;19709:4;19705:20;19701:1;19690:9;19686:17;19679:47;19743:131;19869:4;19743:131;:::i;:::-;19735:139;;19462:419;;;:::o;19887:182::-;20027:34;20023:1;20015:6;20011:14;20004:58;19887:182;:::o;20075:366::-;20217:3;20238:67;20302:2;20297:3;20238:67;:::i;:::-;20231:74;;20314:93;20403:3;20314:93;:::i;:::-;20432:2;20427:3;20423:12;20416:19;;20075:366;;;:::o;20447:419::-;20613:4;20651:2;20640:9;20636:18;20628:26;;20700:9;20694:4;20690:20;20686:1;20675:9;20671:17;20664:47;20728:131;20854:4;20728:131;:::i;:::-;20720:139;;20447:419;;;:::o;20872:236::-;21012:34;21008:1;21000:6;20996:14;20989:58;21081:19;21076:2;21068:6;21064:15;21057:44;20872:236;:::o;21114:366::-;21256:3;21277:67;21341:2;21336:3;21277:67;:::i;:::-;21270:74;;21353:93;21442:3;21353:93;:::i;:::-;21471:2;21466:3;21462:12;21455:19;;21114:366;;;:::o;21486:419::-;21652:4;21690:2;21679:9;21675:18;21667:26;;21739:9;21733:4;21729:20;21725:1;21714:9;21710:17;21703:47;21767:131;21893:4;21767:131;:::i;:::-;21759:139;;21486:419;;;:::o;21911:180::-;21959:77;21956:1;21949:88;22056:4;22053:1;22046:15;22080:4;22077:1;22070:15;22097:348;22137:7;22160:20;22178:1;22160:20;:::i;:::-;22155:25;;22194:20;22212:1;22194:20;:::i;:::-;22189:25;;22382:1;22314:66;22310:74;22307:1;22304:81;22299:1;22292:9;22285:17;22281:105;22278:131;;;22389:18;;:::i;:::-;22278:131;22437:1;22434;22430:9;22419:20;;22097:348;;;;:::o;22451:180::-;22499:77;22496:1;22489:88;22596:4;22593:1;22586:15;22620:4;22617:1;22610:15;22637:185;22677:1;22694:20;22712:1;22694:20;:::i;:::-;22689:25;;22728:20;22746:1;22728:20;:::i;:::-;22723:25;;22767:1;22757:35;;22772:18;;:::i;:::-;22757:35;22814:1;22811;22807:9;22802:14;;22637:185;;;;:::o;22828:230::-;22968:34;22964:1;22956:6;22952:14;22945:58;23037:13;23032:2;23024:6;23020:15;23013:38;22828:230;:::o;23064:366::-;23206:3;23227:67;23291:2;23286:3;23227:67;:::i;:::-;23220:74;;23303:93;23392:3;23303:93;:::i;:::-;23421:2;23416:3;23412:12;23405:19;;23064:366;;;:::o;23436:419::-;23602:4;23640:2;23629:9;23625:18;23617:26;;23689:9;23683:4;23679:20;23675:1;23664:9;23660:17;23653:47;23717:131;23843:4;23717:131;:::i;:::-;23709:139;;23436:419;;;:::o;23861:231::-;24001:34;23997:1;23989:6;23985:14;23978:58;24070:14;24065:2;24057:6;24053:15;24046:39;23861:231;:::o;24098:366::-;24240:3;24261:67;24325:2;24320:3;24261:67;:::i;:::-;24254:74;;24337:93;24426:3;24337:93;:::i;:::-;24455:2;24450:3;24446:12;24439:19;;24098:366;;;:::o;24470:419::-;24636:4;24674:2;24663:9;24659:18;24651:26;;24723:9;24717:4;24713:20;24709:1;24698:9;24694:17;24687:47;24751:131;24877:4;24751:131;:::i;:::-;24743:139;;24470:419;;;:::o;24895:180::-;24943:77;24940:1;24933:88;25040:4;25037:1;25030:15;25064:4;25061:1;25054:15;25081:228;25221:34;25217:1;25209:6;25205:14;25198:58;25290:11;25285:2;25277:6;25273:15;25266:36;25081:228;:::o;25315:366::-;25457:3;25478:67;25542:2;25537:3;25478:67;:::i;:::-;25471:74;;25554:93;25643:3;25554:93;:::i;:::-;25672:2;25667:3;25663:12;25656:19;;25315:366;;;:::o;25687:419::-;25853:4;25891:2;25880:9;25876:18;25868:26;;25940:9;25934:4;25930:20;25926:1;25915:9;25911:17;25904:47;25968:131;26094:4;25968:131;:::i;:::-;25960:139;;25687:419;;;:::o;26112:229::-;26252:34;26248:1;26240:6;26236:14;26229:58;26321:12;26316:2;26308:6;26304:15;26297:37;26112:229;:::o;26347:366::-;26489:3;26510:67;26574:2;26569:3;26510:67;:::i;:::-;26503:74;;26586:93;26675:3;26586:93;:::i;:::-;26704:2;26699:3;26695:12;26688:19;;26347:366;;;:::o;26719:419::-;26885:4;26923:2;26912:9;26908:18;26900:26;;26972:9;26966:4;26962:20;26958:1;26947:9;26943:17;26936:47;27000:131;27126:4;27000:131;:::i;:::-;26992:139;;26719:419;;;:::o;27144:231::-;27284:34;27280:1;27272:6;27268:14;27261:58;27353:14;27348:2;27340:6;27336:15;27329:39;27144:231;:::o;27381:366::-;27523:3;27544:67;27608:2;27603:3;27544:67;:::i;:::-;27537:74;;27620:93;27709:3;27620:93;:::i;:::-;27738:2;27733:3;27729:12;27722:19;;27381:366;;;:::o;27753:419::-;27919:4;27957:2;27946:9;27942:18;27934:26;;28006:9;28000:4;27996:20;27992:1;27981:9;27977:17;27970:47;28034:131;28160:4;28034:131;:::i;:::-;28026:139;;27753:419;;;:::o;28178:230::-;28318:34;28314:1;28306:6;28302:14;28295:58;28387:13;28382:2;28374:6;28370:15;28363:38;28178:230;:::o;28414:366::-;28556:3;28577:67;28641:2;28636:3;28577:67;:::i;:::-;28570:74;;28653:93;28742:3;28653:93;:::i;:::-;28771:2;28766:3;28762:12;28755:19;;28414:366;;;:::o;28786:419::-;28952:4;28990:2;28979:9;28975:18;28967:26;;29039:9;29033:4;29029:20;29025:1;29014:9;29010:17;29003:47;29067:131;29193:4;29067:131;:::i;:::-;29059:139;;28786:419;;;:::o;29211:221::-;29351:34;29347:1;29339:6;29335:14;29328:58;29420:4;29415:2;29407:6;29403:15;29396:29;29211:221;:::o;29438:366::-;29580:3;29601:67;29665:2;29660:3;29601:67;:::i;:::-;29594:74;;29677:93;29766:3;29677:93;:::i;:::-;29795:2;29790:3;29786:12;29779:19;;29438:366;;;:::o;29810:419::-;29976:4;30014:2;30003:9;29999:18;29991:26;;30063:9;30057:4;30053:20;30049:1;30038:9;30034:17;30027:47;30091:131;30217:4;30091:131;:::i;:::-;30083:139;;29810:419;;;:::o;30235:305::-;30275:3;30294:20;30312:1;30294:20;:::i;:::-;30289:25;;30328:20;30346:1;30328:20;:::i;:::-;30323:25;;30482:1;30414:66;30410:74;30407:1;30404:81;30401:107;;;30488:18;;:::i;:::-;30401:107;30532:1;30529;30525:9;30518:16;;30235:305;;;;:::o;30546:229::-;30686:34;30682:1;30674:6;30670:14;30663:58;30755:12;30750:2;30742:6;30738:15;30731:37;30546:229;:::o;30781:366::-;30923:3;30944:67;31008:2;31003:3;30944:67;:::i;:::-;30937:74;;31020:93;31109:3;31020:93;:::i;:::-;31138:2;31133:3;31129:12;31122:19;;30781:366;;;:::o;31153:419::-;31319:4;31357:2;31346:9;31342:18;31334:26;;31406:9;31400:4;31396:20;31392:1;31381:9;31377:17;31370:47;31434:131;31560:4;31434:131;:::i;:::-;31426:139;;31153:419;;;:::o;31578:181::-;31718:33;31714:1;31706:6;31702:14;31695:57;31578:181;:::o;31765:366::-;31907:3;31928:67;31992:2;31987:3;31928:67;:::i;:::-;31921:74;;32004:93;32093:3;32004:93;:::i;:::-;32122:2;32117:3;32113:12;32106:19;;31765:366;;;:::o;32137:419::-;32303:4;32341:2;32330:9;32326:18;32318:26;;32390:9;32384:4;32380:20;32376:1;32365:9;32361:17;32354:47;32418:131;32544:4;32418:131;:::i;:::-;32410:139;;32137:419;;;:::o;32562:233::-;32601:3;32624:24;32642:5;32624:24;:::i;:::-;32615:33;;32670:66;32663:5;32660:77;32657:103;;;32740:18;;:::i;:::-;32657:103;32787:1;32780:5;32776:13;32769:20;;32562:233;;;:::o;32801:175::-;32941:27;32937:1;32929:6;32925:14;32918:51;32801:175;:::o;32982:366::-;33124:3;33145:67;33209:2;33204:3;33145:67;:::i;:::-;33138:74;;33221:93;33310:3;33221:93;:::i;:::-;33339:2;33334:3;33330:12;33323:19;;32982:366;;;:::o;33354:419::-;33520:4;33558:2;33547:9;33543:18;33535:26;;33607:9;33601:4;33597:20;33593:1;33582:9;33578:17;33571:47;33635:131;33761:4;33635:131;:::i;:::-;33627:139;;33354:419;;;:::o;33779:234::-;33919:34;33915:1;33907:6;33903:14;33896:58;33988:17;33983:2;33975:6;33971:15;33964:42;33779:234;:::o;34019:366::-;34161:3;34182:67;34246:2;34241:3;34182:67;:::i;:::-;34175:74;;34258:93;34347:3;34258:93;:::i;:::-;34376:2;34371:3;34367:12;34360:19;;34019:366;;;:::o;34391:419::-;34557:4;34595:2;34584:9;34580:18;34572:26;;34644:9;34638:4;34634:20;34630:1;34619:9;34615:17;34608:47;34672:131;34798:4;34672:131;:::i;:::-;34664:139;;34391:419;;;:::o;34816:148::-;34918:11;34955:3;34940:18;;34816:148;;;;:::o;34970:141::-;35019:4;35042:3;35034:11;;35065:3;35062:1;35055:14;35099:4;35096:1;35086:18;35078:26;;34970:141;;;:::o;35141:845::-;35244:3;35281:5;35275:12;35310:36;35336:9;35310:36;:::i;:::-;35362:89;35444:6;35439:3;35362:89;:::i;:::-;35355:96;;35482:1;35471:9;35467:17;35498:1;35493:137;;;;35644:1;35639:341;;;;35460:520;;35493:137;35577:4;35573:9;35562;35558:25;35553:3;35546:38;35613:6;35608:3;35604:16;35597:23;;35493:137;;35639:341;35706:38;35738:5;35706:38;:::i;:::-;35766:1;35780:154;35794:6;35791:1;35788:13;35780:154;;;35868:7;35862:14;35858:1;35853:3;35849:11;35842:35;35918:1;35909:7;35905:15;35894:26;;35816:4;35813:1;35809:12;35804:17;;35780:154;;;35963:6;35958:3;35954:16;35947:23;;35646:334;;35460:520;;35248:738;;35141:845;;;;:::o;35992:377::-;36098:3;36126:39;36159:5;36126:39;:::i;:::-;36181:89;36263:6;36258:3;36181:89;:::i;:::-;36174:96;;36279:52;36324:6;36319:3;36312:4;36305:5;36301:16;36279:52;:::i;:::-;36356:6;36351:3;36347:16;36340:23;;36102:267;35992:377;;;;:::o;36375:583::-;36597:3;36619:92;36707:3;36698:6;36619:92;:::i;:::-;36612:99;;36728:95;36819:3;36810:6;36728:95;:::i;:::-;36721:102;;36840:92;36928:3;36919:6;36840:92;:::i;:::-;36833:99;;36949:3;36942:10;;36375:583;;;;;;:::o;36964:225::-;37104:34;37100:1;37092:6;37088:14;37081:58;37173:8;37168:2;37160:6;37156:15;37149:33;36964:225;:::o;37195:366::-;37337:3;37358:67;37422:2;37417:3;37358:67;:::i;:::-;37351:74;;37434:93;37523:3;37434:93;:::i;:::-;37552:2;37547:3;37543:12;37536:19;;37195:366;;;:::o;37567:419::-;37733:4;37771:2;37760:9;37756:18;37748:26;;37820:9;37814:4;37810:20;37806:1;37795:9;37791:17;37784:47;37848:131;37974:4;37848:131;:::i;:::-;37840:139;;37567:419;;;:::o;37992:231::-;38132:34;38128:1;38120:6;38116:14;38109:58;38201:14;38196:2;38188:6;38184:15;38177:39;37992:231;:::o;38229:366::-;38371:3;38392:67;38456:2;38451:3;38392:67;:::i;:::-;38385:74;;38468:93;38557:3;38468:93;:::i;:::-;38586:2;38581:3;38577:12;38570:19;;38229:366;;;:::o;38601:419::-;38767:4;38805:2;38794:9;38790:18;38782:26;;38854:9;38848:4;38844:20;38840:1;38829:9;38825:17;38818:47;38882:131;39008:4;38882:131;:::i;:::-;38874:139;;38601:419;;;:::o;39026:228::-;39166:34;39162:1;39154:6;39150:14;39143:58;39235:11;39230:2;39222:6;39218:15;39211:36;39026:228;:::o;39260:366::-;39402:3;39423:67;39487:2;39482:3;39423:67;:::i;:::-;39416:74;;39499:93;39588:3;39499:93;:::i;:::-;39617:2;39612:3;39608:12;39601:19;;39260:366;;;:::o;39632:419::-;39798:4;39836:2;39825:9;39821:18;39813:26;;39885:9;39879:4;39875:20;39871:1;39860:9;39856:17;39849:47;39913:131;40039:4;39913:131;:::i;:::-;39905:139;;39632:419;;;:::o;40057:223::-;40197:34;40193:1;40185:6;40181:14;40174:58;40266:6;40261:2;40253:6;40249:15;40242:31;40057:223;:::o;40286:366::-;40428:3;40449:67;40513:2;40508:3;40449:67;:::i;:::-;40442:74;;40525:93;40614:3;40525:93;:::i;:::-;40643:2;40638:3;40634:12;40627:19;;40286:366;;;:::o;40658:419::-;40824:4;40862:2;40851:9;40847:18;40839:26;;40911:9;40905:4;40901:20;40897:1;40886:9;40882:17;40875:47;40939:131;41065:4;40939:131;:::i;:::-;40931:139;;40658:419;;;:::o;41083:191::-;41123:4;41143:20;41161:1;41143:20;:::i;:::-;41138:25;;41177:20;41195:1;41177:20;:::i;:::-;41172:25;;41216:1;41213;41210:8;41207:34;;;41221:18;;:::i;:::-;41207:34;41266:1;41263;41259:9;41251:17;;41083:191;;;;:::o;41280:237::-;41420:34;41416:1;41408:6;41404:14;41397:58;41489:20;41484:2;41476:6;41472:15;41465:45;41280:237;:::o;41523:366::-;41665:3;41686:67;41750:2;41745:3;41686:67;:::i;:::-;41679:74;;41762:93;41851:3;41762:93;:::i;:::-;41880:2;41875:3;41871:12;41864:19;;41523:366;;;:::o;41895:419::-;42061:4;42099:2;42088:9;42084:18;42076:26;;42148:9;42142:4;42138:20;42134:1;42123:9;42119:17;42112:47;42176:131;42302:4;42176:131;:::i;:::-;42168:139;;41895:419;;;:::o;42320:176::-;42352:1;42369:20;42387:1;42369:20;:::i;:::-;42364:25;;42403:20;42421:1;42403:20;:::i;:::-;42398:25;;42442:1;42432:35;;42447:18;;:::i;:::-;42432:35;42488:1;42485;42481:9;42476:14;;42320:176;;;;:::o;42502:98::-;42553:6;42587:5;42581:12;42571:22;;42502:98;;;:::o;42606:168::-;42689:11;42723:6;42718:3;42711:19;42763:4;42758:3;42754:14;42739:29;;42606:168;;;;:::o;42780:360::-;42866:3;42894:38;42926:5;42894:38;:::i;:::-;42948:70;43011:6;43006:3;42948:70;:::i;:::-;42941:77;;43027:52;43072:6;43067:3;43060:4;43053:5;43049:16;43027:52;:::i;:::-;43104:29;43126:6;43104:29;:::i;:::-;43099:3;43095:39;43088:46;;42870:270;42780:360;;;;:::o;43146:640::-;43341:4;43379:3;43368:9;43364:19;43356:27;;43393:71;43461:1;43450:9;43446:17;43437:6;43393:71;:::i;:::-;43474:72;43542:2;43531:9;43527:18;43518:6;43474:72;:::i;:::-;43556;43624:2;43613:9;43609:18;43600:6;43556:72;:::i;:::-;43675:9;43669:4;43665:20;43660:2;43649:9;43645:18;43638:48;43703:76;43774:4;43765:6;43703:76;:::i;:::-;43695:84;;43146:640;;;;;;;:::o;43792:141::-;43848:5;43879:6;43873:13;43864:22;;43895:32;43921:5;43895:32;:::i;:::-;43792:141;;;;:::o;43939:349::-;44008:6;44057:2;44045:9;44036:7;44032:23;44028:32;44025:119;;;44063:79;;:::i;:::-;44025:119;44183:1;44208:63;44263:7;44254:6;44243:9;44239:22;44208:63;:::i;:::-;44198:73;;44154:127;43939:349;;;;:::o;44294:180::-;44342:77;44339:1;44332:88;44439:4;44436:1;44429:15;44463:4;44460:1;44453:15;44480:182;44620:34;44616:1;44608:6;44604:14;44597:58;44480:182;:::o;44668:366::-;44810:3;44831:67;44895:2;44890:3;44831:67;:::i;:::-;44824:74;;44907:93;44996:3;44907:93;:::i;:::-;45025:2;45020:3;45016:12;45009:19;;44668:366;;;:::o;45040:419::-;45206:4;45244:2;45233:9;45229:18;45221:26;;45293:9;45287:4;45283:20;45279:1;45268:9;45264:17;45257:47;45321:131;45447:4;45321:131;:::i;:::-;45313:139;;45040:419;;;:::o;45465:178::-;45605:30;45601:1;45593:6;45589:14;45582:54;45465:178;:::o;45649:366::-;45791:3;45812:67;45876:2;45871:3;45812:67;:::i;:::-;45805:74;;45888:93;45977:3;45888:93;:::i;:::-;46006:2;46001:3;45997:12;45990:19;;45649:366;;;:::o;46021:419::-;46187:4;46225:2;46214:9;46210:18;46202:26;;46274:9;46268:4;46264:20;46260:1;46249:9;46245:17;46238:47;46302:131;46428:4;46302:131;:::i;:::-;46294:139;;46021:419;;;:::o

Swarm Source

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