ETH Price: $3,251.80 (+3.51%)
Gas: 6 Gwei

Token

Mango INU (MNGO)
 

Overview

Max Total Supply

200,000,000 MNGO

Holders

58

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
46,224.647729774669002314 MNGO

Value
$0.00
0x24cd6f25a69601cc545470338c3e3bad3457cac4
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:
MangoINU

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-19
*/

// File: @openzeppelin/[email protected]/utils/Counters.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/[email protected]/utils/Strings.sol


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



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

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

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

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

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

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

// File: @openzeppelin/[email protected]/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)




/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: @openzeppelin/[email protected]/utils/cryptography/draft-EIP712.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)




/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)



/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @openzeppelin/[email protected]/utils/Context.sol


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



/**
 * @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/[email protected]/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)



/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)




/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/[email protected]/token/ERC20/ERC20.sol


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






/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens 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 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/draft-ERC20Permit.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)








/**
 * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * _Available since v3.4._
 */
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private constant _PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    /**
     * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.
     * However, to ensure consistency with the upgradeable transpiler, we will continue
     * to reserve a slot.
     * @custom:oz-renamed-from _PERMIT_TYPEHASH
     */
    // solhint-disable-next-line var-name-mixedcase
    bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;

    /**
     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
     *
     * It's a good idea to use the same `name` that is defined as the ERC20 token name.
     */
    constructor(string memory name) EIP712(name, "1") {}

    /**
     * @dev See {IERC20Permit-permit}.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");

        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "ERC20Permit: invalid signature");

        _approve(owner, spender, value);
    }

    /**
     * @dev See {IERC20Permit-nonces}.
     */
    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    /**
     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    /**
     * @dev "Consume a nonce": return the current value and increment.
     *
     * _Available since v4.1._
     */
    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}

// File: contract-7393d43d59.sol






contract MangoINU is ERC20, ERC20Permit {
    constructor() ERC20("Mango INU", "MNGO") ERC20Permit("Mango INU") {
        _mint(msg.sender, 200000000 * 10 ** decimals());
    }
}

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":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

6101406040523480156200001257600080fd5b506040518060400160405280600981526020017f4d616e676f20494e550000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f4d616e676f20494e5500000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d4e474f00000000000000000000000000000000000000000000000000000000815250816003908051906020019062000104929190620003e4565b5080600490805190602001906200011d929190620003e4565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001898184846200021c60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508061012081815250505050505050506200021633620001eb6200025860201b60201c565b600a620001f9919062000653565b630bebc2006200020a919062000790565b6200026160201b60201c565b62000910565b6000838383463060405160200162000239959493929190620004ee565b6040516020818303038152906040528051906020012090509392505050565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620002d4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002cb906200054b565b60405180910390fd5b620002e860008383620003da60201b60201c565b8060026000828254620002fc91906200059b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200035391906200059b565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620003ba91906200056d565b60405180910390a3620003d660008383620003df60201b60201c565b5050565b505050565b505050565b828054620003f29062000846565b90600052602060002090601f01602090048101928262000416576000855562000462565b82601f106200043157805160ff191683800117855562000462565b8280016001018555821562000462579182015b828111156200046157825182559160200191906001019062000444565b5b50905062000471919062000475565b5090565b5b808211156200049057600081600090555060010162000476565b5090565b6200049f81620007f1565b82525050565b620004b08162000805565b82525050565b6000620004c5601f836200058a565b9150620004d282620008e7565b602082019050919050565b620004e8816200082f565b82525050565b600060a082019050620005056000830188620004a5565b620005146020830187620004a5565b620005236040830186620004a5565b620005326060830185620004dd565b62000541608083018462000494565b9695505050505050565b600060208201905081810360008301526200056681620004b6565b9050919050565b6000602082019050620005846000830184620004dd565b92915050565b600082825260208201905092915050565b6000620005a8826200082f565b9150620005b5836200082f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620005ed57620005ec6200087c565b5b828201905092915050565b6000808291508390505b60018511156200064a578086048111156200062257620006216200087c565b5b6001851615620006325780820291505b80810290506200064285620008da565b945062000602565b94509492505050565b600062000660826200082f565b91506200066d8362000839565b92506200069c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620006a4565b905092915050565b600082620006b6576001905062000789565b81620006c6576000905062000789565b8160018114620006df5760028114620006ea5762000720565b600191505062000789565b60ff841115620006ff57620006fe6200087c565b5b8360020a9150848211156200071957620007186200087c565b5b5062000789565b5060208310610133831016604e8410600b84101617156200075a5782820a9050838111156200075457620007536200087c565b5b62000789565b620007698484846001620005f8565b925090508184048111156200078357620007826200087c565b5b81810290505b9392505050565b60006200079d826200082f565b9150620007aa836200082f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007e657620007e56200087c565b5b828202905092915050565b6000620007fe826200080f565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600060028204905060018216806200085f57607f821691505b60208210811415620008765762000875620008ab565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60805160a05160c05160601c60e0516101005161012051611fcc620009636000396000610d7901526000610dbb01526000610d9a01526000610ccf01526000610d2501526000610d4e0152611fcc6000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063a457c2d711610066578063a457c2d714610275578063a9059cbb146102a5578063d505accf146102d5578063dd62ed3e146102f1576100ea565b806370a08231146101f75780637ecebe001461022757806395d89b4114610257576100ea565b806323b872dd116100c857806323b872dd1461015b578063313ce5671461018b5780633644e515146101a957806339509351146101c7576100ea565b806306fdde03146100ef578063095ea7b31461010d57806318160ddd1461013d575b600080fd5b6100f7610321565b60405161010491906117e6565b60405180910390f35b610127600480360381019061012291906113bb565b6103b3565b60405161013491906116b7565b60405180910390f35b6101456103d6565b60405161015291906119a8565b60405180910390f35b610175600480360381019061017091906112c6565b6103e0565b60405161018291906116b7565b60405180910390f35b61019361040f565b6040516101a091906119c3565b60405180910390f35b6101b1610418565b6040516101be91906116d2565b60405180910390f35b6101e160048036038101906101dc91906113bb565b610427565b6040516101ee91906116b7565b60405180910390f35b610211600480360381019061020c9190611259565b61045e565b60405161021e91906119a8565b60405180910390f35b610241600480360381019061023c9190611259565b6104a6565b60405161024e91906119a8565b60405180910390f35b61025f6104f6565b60405161026c91906117e6565b60405180910390f35b61028f600480360381019061028a91906113bb565b610588565b60405161029c91906116b7565b60405180910390f35b6102bf60048036038101906102ba91906113bb565b6105ff565b6040516102cc91906116b7565b60405180910390f35b6102ef60048036038101906102ea9190611319565b610622565b005b61030b60048036038101906103069190611286565b610764565b60405161031891906119a8565b60405180910390f35b60606003805461033090611aed565b80601f016020809104026020016040519081016040528092919081815260200182805461035c90611aed565b80156103a95780601f1061037e576101008083540402835291602001916103a9565b820191906000526020600020905b81548152906001019060200180831161038c57829003601f168201915b5050505050905090565b6000806103be6107eb565b90506103cb8185856107f3565b600191505092915050565b6000600254905090565b6000806103eb6107eb565b90506103f88582856109be565b610403858585610a4a565b60019150509392505050565b60006012905090565b6000610422610ccb565b905090565b6000806104326107eb565b90506104538185856104448589610764565b61044e9190611a05565b6107f3565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006104ef600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610de5565b9050919050565b60606004805461050590611aed565b80601f016020809104026020016040519081016040528092919081815260200182805461053190611aed565b801561057e5780601f106105535761010080835404028352916020019161057e565b820191906000526020600020905b81548152906001019060200180831161056157829003601f168201915b5050505050905090565b6000806105936107eb565b905060006105a18286610764565b9050838110156105e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105dd90611988565b60405180910390fd5b6105f382868684036107f3565b60019250505092915050565b60008061060a6107eb565b9050610617818585610a4a565b600191505092915050565b83421115610665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065c906118a8565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886106948c610df3565b896040516020016106aa969594939291906116ed565b60405160208183030381529060405280519060200120905060006106cd82610e51565b905060006106dd82878787610e6b565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461074d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074490611928565b60405180910390fd5b6107588a8a8a6107f3565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085a90611968565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90611868565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516109b191906119a8565b60405180910390a3505050565b60006109ca8484610764565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610a445781811015610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d90611888565b60405180910390fd5b610a4384848484036107f3565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab190611948565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2190611828565b60405180910390fd5b610b35838383610e96565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb2906118c8565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c4e9190611a05565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cb291906119a8565b60405180910390a3610cc5848484610e9b565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610d4757507f000000000000000000000000000000000000000000000000000000000000000046145b15610d74577f00000000000000000000000000000000000000000000000000000000000000009050610de2565b610ddf7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610ea0565b90505b90565b600081600001549050919050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610e4081610de5565b9150610e4b81610eda565b50919050565b6000610e64610e5e610ccb565b83610ef0565b9050919050565b6000806000610e7c87878787610f23565b91509150610e8981611030565b8192505050949350505050565b505050565b505050565b60008383834630604051602001610ebb95949392919061174e565b6040516020818303038152906040528051906020012090509392505050565b6001816000016000828254019250508190555050565b60008282604051602001610f05929190611680565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610f5e576000600391509150611027565b601b8560ff1614158015610f765750601c8560ff1614155b15610f88576000600491509150611027565b600060018787878760405160008152602001604052604051610fad94939291906117a1565b6020604051602081039080840390855afa158015610fcf573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561101e57600060019250925050611027565b80600092509250505b94509492505050565b6000600481111561104457611043611b58565b5b81600481111561105757611056611b58565b5b141561106257611202565b6001600481111561107657611075611b58565b5b81600481111561108957611088611b58565b5b14156110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c190611808565b60405180910390fd5b600260048111156110de576110dd611b58565b5b8160048111156110f1576110f0611b58565b5b1415611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990611848565b60405180910390fd5b6003600481111561114657611145611b58565b5b81600481111561115957611158611b58565b5b141561119a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611191906118e8565b60405180910390fd5b6004808111156111ad576111ac611b58565b5b8160048111156111c0576111bf611b58565b5b1415611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f890611908565b60405180910390fd5b5b50565b60008135905061121481611f3a565b92915050565b60008135905061122981611f51565b92915050565b60008135905061123e81611f68565b92915050565b60008135905061125381611f7f565b92915050565b60006020828403121561126f5761126e611bb6565b5b600061127d84828501611205565b91505092915050565b6000806040838503121561129d5761129c611bb6565b5b60006112ab85828601611205565b92505060206112bc85828601611205565b9150509250929050565b6000806000606084860312156112df576112de611bb6565b5b60006112ed86828701611205565b93505060206112fe86828701611205565b925050604061130f8682870161122f565b9150509250925092565b600080600080600080600060e0888a03121561133857611337611bb6565b5b60006113468a828b01611205565b97505060206113578a828b01611205565b96505060406113688a828b0161122f565b95505060606113798a828b0161122f565b945050608061138a8a828b01611244565b93505060a061139b8a828b0161121a565b92505060c06113ac8a828b0161121a565b91505092959891949750929550565b600080604083850312156113d2576113d1611bb6565b5b60006113e085828601611205565b92505060206113f18582860161122f565b9150509250929050565b61140481611a5b565b82525050565b61141381611a6d565b82525050565b61142281611a79565b82525050565b61143961143482611a79565b611b1f565b82525050565b600061144a826119de565b61145481856119e9565b9350611464818560208601611aba565b61146d81611bbb565b840191505092915050565b60006114856018836119e9565b915061149082611bcc565b602082019050919050565b60006114a86023836119e9565b91506114b382611bf5565b604082019050919050565b60006114cb601f836119e9565b91506114d682611c44565b602082019050919050565b60006114ee6022836119e9565b91506114f982611c6d565b604082019050919050565b60006115116002836119fa565b915061151c82611cbc565b600282019050919050565b6000611534601d836119e9565b915061153f82611ce5565b602082019050919050565b6000611557601d836119e9565b915061156282611d0e565b602082019050919050565b600061157a6026836119e9565b915061158582611d37565b604082019050919050565b600061159d6022836119e9565b91506115a882611d86565b604082019050919050565b60006115c06022836119e9565b91506115cb82611dd5565b604082019050919050565b60006115e3601e836119e9565b91506115ee82611e24565b602082019050919050565b60006116066025836119e9565b915061161182611e4d565b604082019050919050565b60006116296024836119e9565b915061163482611e9c565b604082019050919050565b600061164c6025836119e9565b915061165782611eeb565b604082019050919050565b61166b81611aa3565b82525050565b61167a81611aad565b82525050565b600061168b82611504565b91506116978285611428565b6020820191506116a78284611428565b6020820191508190509392505050565b60006020820190506116cc600083018461140a565b92915050565b60006020820190506116e76000830184611419565b92915050565b600060c0820190506117026000830189611419565b61170f60208301886113fb565b61171c60408301876113fb565b6117296060830186611662565b6117366080830185611662565b61174360a0830184611662565b979650505050505050565b600060a0820190506117636000830188611419565b6117706020830187611419565b61177d6040830186611419565b61178a6060830185611662565b61179760808301846113fb565b9695505050505050565b60006080820190506117b66000830187611419565b6117c36020830186611671565b6117d06040830185611419565b6117dd6060830184611419565b95945050505050565b60006020820190508181036000830152611800818461143f565b905092915050565b6000602082019050818103600083015261182181611478565b9050919050565b600060208201905081810360008301526118418161149b565b9050919050565b60006020820190508181036000830152611861816114be565b9050919050565b60006020820190508181036000830152611881816114e1565b9050919050565b600060208201905081810360008301526118a181611527565b9050919050565b600060208201905081810360008301526118c18161154a565b9050919050565b600060208201905081810360008301526118e18161156d565b9050919050565b6000602082019050818103600083015261190181611590565b9050919050565b60006020820190508181036000830152611921816115b3565b9050919050565b60006020820190508181036000830152611941816115d6565b9050919050565b60006020820190508181036000830152611961816115f9565b9050919050565b600060208201905081810360008301526119818161161c565b9050919050565b600060208201905081810360008301526119a18161163f565b9050919050565b60006020820190506119bd6000830184611662565b92915050565b60006020820190506119d86000830184611671565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000611a1082611aa3565b9150611a1b83611aa3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611a5057611a4f611b29565b5b828201905092915050565b6000611a6682611a83565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015611ad8578082015181840152602081019050611abd565b83811115611ae7576000848401525b50505050565b60006002820490506001821680611b0557607f821691505b60208210811415611b1957611b18611b87565b5b50919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b611f4381611a5b565b8114611f4e57600080fd5b50565b611f5a81611a79565b8114611f6557600080fd5b50565b611f7181611aa3565b8114611f7c57600080fd5b50565b611f8881611aad565b8114611f9357600080fd5b5056fea26469706673582212206f3781a96fe843626a3f2a2ba2d5a6fa1499293fbaefba71b9e3be99a66718bc64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063a457c2d711610066578063a457c2d714610275578063a9059cbb146102a5578063d505accf146102d5578063dd62ed3e146102f1576100ea565b806370a08231146101f75780637ecebe001461022757806395d89b4114610257576100ea565b806323b872dd116100c857806323b872dd1461015b578063313ce5671461018b5780633644e515146101a957806339509351146101c7576100ea565b806306fdde03146100ef578063095ea7b31461010d57806318160ddd1461013d575b600080fd5b6100f7610321565b60405161010491906117e6565b60405180910390f35b610127600480360381019061012291906113bb565b6103b3565b60405161013491906116b7565b60405180910390f35b6101456103d6565b60405161015291906119a8565b60405180910390f35b610175600480360381019061017091906112c6565b6103e0565b60405161018291906116b7565b60405180910390f35b61019361040f565b6040516101a091906119c3565b60405180910390f35b6101b1610418565b6040516101be91906116d2565b60405180910390f35b6101e160048036038101906101dc91906113bb565b610427565b6040516101ee91906116b7565b60405180910390f35b610211600480360381019061020c9190611259565b61045e565b60405161021e91906119a8565b60405180910390f35b610241600480360381019061023c9190611259565b6104a6565b60405161024e91906119a8565b60405180910390f35b61025f6104f6565b60405161026c91906117e6565b60405180910390f35b61028f600480360381019061028a91906113bb565b610588565b60405161029c91906116b7565b60405180910390f35b6102bf60048036038101906102ba91906113bb565b6105ff565b6040516102cc91906116b7565b60405180910390f35b6102ef60048036038101906102ea9190611319565b610622565b005b61030b60048036038101906103069190611286565b610764565b60405161031891906119a8565b60405180910390f35b60606003805461033090611aed565b80601f016020809104026020016040519081016040528092919081815260200182805461035c90611aed565b80156103a95780601f1061037e576101008083540402835291602001916103a9565b820191906000526020600020905b81548152906001019060200180831161038c57829003601f168201915b5050505050905090565b6000806103be6107eb565b90506103cb8185856107f3565b600191505092915050565b6000600254905090565b6000806103eb6107eb565b90506103f88582856109be565b610403858585610a4a565b60019150509392505050565b60006012905090565b6000610422610ccb565b905090565b6000806104326107eb565b90506104538185856104448589610764565b61044e9190611a05565b6107f3565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006104ef600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020610de5565b9050919050565b60606004805461050590611aed565b80601f016020809104026020016040519081016040528092919081815260200182805461053190611aed565b801561057e5780601f106105535761010080835404028352916020019161057e565b820191906000526020600020905b81548152906001019060200180831161056157829003601f168201915b5050505050905090565b6000806105936107eb565b905060006105a18286610764565b9050838110156105e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105dd90611988565b60405180910390fd5b6105f382868684036107f3565b60019250505092915050565b60008061060a6107eb565b9050610617818585610a4a565b600191505092915050565b83421115610665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065c906118a8565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886106948c610df3565b896040516020016106aa969594939291906116ed565b60405160208183030381529060405280519060200120905060006106cd82610e51565b905060006106dd82878787610e6b565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461074d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074490611928565b60405180910390fd5b6107588a8a8a6107f3565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085a90611968565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156108d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ca90611868565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516109b191906119a8565b60405180910390a3505050565b60006109ca8484610764565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610a445781811015610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d90611888565b60405180910390fd5b610a4384848484036107f3565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab190611948565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2190611828565b60405180910390fd5b610b35838383610e96565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb2906118c8565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c4e9190611a05565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cb291906119a8565b60405180910390a3610cc5848484610e9b565b50505050565b60007f000000000000000000000000335e14d18d8a903b782a39059dc35d61b94e1c1b73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610d4757507f000000000000000000000000000000000000000000000000000000000000000146145b15610d74577f17cd19d0cb6edf4c16e7bcbaf8293063b89b7f7f7b8b063a91f7d8bd1d03e2f79050610de2565b610ddf7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fda1d3232ec162a36de90cb8bb533481c140c477ae3f2967450fc333d33018ac47fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6610ea0565b90505b90565b600081600001549050919050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610e4081610de5565b9150610e4b81610eda565b50919050565b6000610e64610e5e610ccb565b83610ef0565b9050919050565b6000806000610e7c87878787610f23565b91509150610e8981611030565b8192505050949350505050565b505050565b505050565b60008383834630604051602001610ebb95949392919061174e565b6040516020818303038152906040528051906020012090509392505050565b6001816000016000828254019250508190555050565b60008282604051602001610f05929190611680565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115610f5e576000600391509150611027565b601b8560ff1614158015610f765750601c8560ff1614155b15610f88576000600491509150611027565b600060018787878760405160008152602001604052604051610fad94939291906117a1565b6020604051602081039080840390855afa158015610fcf573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561101e57600060019250925050611027565b80600092509250505b94509492505050565b6000600481111561104457611043611b58565b5b81600481111561105757611056611b58565b5b141561106257611202565b6001600481111561107657611075611b58565b5b81600481111561108957611088611b58565b5b14156110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c190611808565b60405180910390fd5b600260048111156110de576110dd611b58565b5b8160048111156110f1576110f0611b58565b5b1415611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990611848565b60405180910390fd5b6003600481111561114657611145611b58565b5b81600481111561115957611158611b58565b5b141561119a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611191906118e8565b60405180910390fd5b6004808111156111ad576111ac611b58565b5b8160048111156111c0576111bf611b58565b5b1415611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f890611908565b60405180910390fd5b5b50565b60008135905061121481611f3a565b92915050565b60008135905061122981611f51565b92915050565b60008135905061123e81611f68565b92915050565b60008135905061125381611f7f565b92915050565b60006020828403121561126f5761126e611bb6565b5b600061127d84828501611205565b91505092915050565b6000806040838503121561129d5761129c611bb6565b5b60006112ab85828601611205565b92505060206112bc85828601611205565b9150509250929050565b6000806000606084860312156112df576112de611bb6565b5b60006112ed86828701611205565b93505060206112fe86828701611205565b925050604061130f8682870161122f565b9150509250925092565b600080600080600080600060e0888a03121561133857611337611bb6565b5b60006113468a828b01611205565b97505060206113578a828b01611205565b96505060406113688a828b0161122f565b95505060606113798a828b0161122f565b945050608061138a8a828b01611244565b93505060a061139b8a828b0161121a565b92505060c06113ac8a828b0161121a565b91505092959891949750929550565b600080604083850312156113d2576113d1611bb6565b5b60006113e085828601611205565b92505060206113f18582860161122f565b9150509250929050565b61140481611a5b565b82525050565b61141381611a6d565b82525050565b61142281611a79565b82525050565b61143961143482611a79565b611b1f565b82525050565b600061144a826119de565b61145481856119e9565b9350611464818560208601611aba565b61146d81611bbb565b840191505092915050565b60006114856018836119e9565b915061149082611bcc565b602082019050919050565b60006114a86023836119e9565b91506114b382611bf5565b604082019050919050565b60006114cb601f836119e9565b91506114d682611c44565b602082019050919050565b60006114ee6022836119e9565b91506114f982611c6d565b604082019050919050565b60006115116002836119fa565b915061151c82611cbc565b600282019050919050565b6000611534601d836119e9565b915061153f82611ce5565b602082019050919050565b6000611557601d836119e9565b915061156282611d0e565b602082019050919050565b600061157a6026836119e9565b915061158582611d37565b604082019050919050565b600061159d6022836119e9565b91506115a882611d86565b604082019050919050565b60006115c06022836119e9565b91506115cb82611dd5565b604082019050919050565b60006115e3601e836119e9565b91506115ee82611e24565b602082019050919050565b60006116066025836119e9565b915061161182611e4d565b604082019050919050565b60006116296024836119e9565b915061163482611e9c565b604082019050919050565b600061164c6025836119e9565b915061165782611eeb565b604082019050919050565b61166b81611aa3565b82525050565b61167a81611aad565b82525050565b600061168b82611504565b91506116978285611428565b6020820191506116a78284611428565b6020820191508190509392505050565b60006020820190506116cc600083018461140a565b92915050565b60006020820190506116e76000830184611419565b92915050565b600060c0820190506117026000830189611419565b61170f60208301886113fb565b61171c60408301876113fb565b6117296060830186611662565b6117366080830185611662565b61174360a0830184611662565b979650505050505050565b600060a0820190506117636000830188611419565b6117706020830187611419565b61177d6040830186611419565b61178a6060830185611662565b61179760808301846113fb565b9695505050505050565b60006080820190506117b66000830187611419565b6117c36020830186611671565b6117d06040830185611419565b6117dd6060830184611419565b95945050505050565b60006020820190508181036000830152611800818461143f565b905092915050565b6000602082019050818103600083015261182181611478565b9050919050565b600060208201905081810360008301526118418161149b565b9050919050565b60006020820190508181036000830152611861816114be565b9050919050565b60006020820190508181036000830152611881816114e1565b9050919050565b600060208201905081810360008301526118a181611527565b9050919050565b600060208201905081810360008301526118c18161154a565b9050919050565b600060208201905081810360008301526118e18161156d565b9050919050565b6000602082019050818103600083015261190181611590565b9050919050565b60006020820190508181036000830152611921816115b3565b9050919050565b60006020820190508181036000830152611941816115d6565b9050919050565b60006020820190508181036000830152611961816115f9565b9050919050565b600060208201905081810360008301526119818161161c565b9050919050565b600060208201905081810360008301526119a18161163f565b9050919050565b60006020820190506119bd6000830184611662565b92915050565b60006020820190506119d86000830184611671565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000611a1082611aa3565b9150611a1b83611aa3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611a5057611a4f611b29565b5b828201905092915050565b6000611a6682611a83565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015611ad8578082015181840152602081019050611abd565b83811115611ae7576000848401525b50505050565b60006002820490506001821680611b0557607f821691505b60208210811415611b1957611b18611b87565b5b50919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b611f4381611a5b565b8114611f4e57600080fd5b50565b611f5a81611a79565b8114611f6557600080fd5b50565b611f7181611aa3565b8114611f7c57600080fd5b50565b611f8881611aad565b8114611f9357600080fd5b5056fea26469706673582212206f3781a96fe843626a3f2a2ba2d5a6fa1499293fbaefba71b9e3be99a66718bc64736f6c63430008070033

Deployed Bytecode Sourcemap

40555:182:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26454:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28805:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27574:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29586:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27416:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40042:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30290:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27745:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39784:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26673:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31031:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28078:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39073:645;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28334:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26454:100;26508:13;26541:5;26534:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26454:100;:::o;28805:201::-;28888:4;28905:13;28921:12;:10;:12::i;:::-;28905:28;;28944:32;28953:5;28960:7;28969:6;28944:8;:32::i;:::-;28994:4;28987:11;;;28805:201;;;;:::o;27574:108::-;27635:7;27662:12;;27655:19;;27574:108;:::o;29586:295::-;29717:4;29734:15;29752:12;:10;:12::i;:::-;29734:30;;29775:38;29791:4;29797:7;29806:6;29775:15;:38::i;:::-;29824:27;29834:4;29840:2;29844:6;29824:9;:27::i;:::-;29869:4;29862:11;;;29586:295;;;;;:::o;27416:93::-;27474:5;27499:2;27492:9;;27416:93;:::o;40042:115::-;40102:7;40129:20;:18;:20::i;:::-;40122:27;;40042:115;:::o;30290:238::-;30378:4;30395:13;30411:12;:10;:12::i;:::-;30395:28;;30434:64;30443:5;30450:7;30487:10;30459:25;30469:5;30476:7;30459:9;:25::i;:::-;:38;;;;:::i;:::-;30434:8;:64::i;:::-;30516:4;30509:11;;;30290:238;;;;:::o;27745:127::-;27819:7;27846:9;:18;27856:7;27846:18;;;;;;;;;;;;;;;;27839:25;;27745:127;;;:::o;39784:128::-;39853:7;39880:24;:7;:14;39888:5;39880:14;;;;;;;;;;;;;;;:22;:24::i;:::-;39873:31;;39784:128;;;:::o;26673:104::-;26729:13;26762:7;26755:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26673:104;:::o;31031:436::-;31124:4;31141:13;31157:12;:10;:12::i;:::-;31141:28;;31180:24;31207:25;31217:5;31224:7;31207:9;:25::i;:::-;31180:52;;31271:15;31251:16;:35;;31243:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31364:60;31373:5;31380:7;31408:15;31389:16;:34;31364:8;:60::i;:::-;31455:4;31448:11;;;;31031:436;;;;:::o;28078:193::-;28157:4;28174:13;28190:12;:10;:12::i;:::-;28174:28;;28213;28223:5;28230:2;28234:6;28213:9;:28::i;:::-;28259:4;28252:11;;;28078:193;;;;:::o;39073:645::-;39317:8;39298:15;:27;;39290:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;39372:18;38248:95;39432:5;39439:7;39448:5;39455:16;39465:5;39455:9;:16::i;:::-;39473:8;39403:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39393:90;;;;;;39372:111;;39496:12;39511:28;39528:10;39511:16;:28::i;:::-;39496:43;;39552:14;39569:28;39583:4;39589:1;39592;39595;39569:13;:28::i;:::-;39552:45;;39626:5;39616:15;;:6;:15;;;39608:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39679:31;39688:5;39695:7;39704:5;39679:8;:31::i;:::-;39279:439;;;39073:645;;;;;;;:::o;28334:151::-;28423:7;28450:11;:18;28462:5;28450:18;;;;;;;;;;;;;;;:27;28469:7;28450:27;;;;;;;;;;;;;;;;28443:34;;28334:151;;;;:::o;20531:98::-;20584:7;20611:10;20604:17;;20531:98;:::o;34656:380::-;34809:1;34792:19;;:5;:19;;;;34784:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34890:1;34871:21;;:7;:21;;;;34863:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34974:6;34944:11;:18;34956:5;34944:18;;;;;;;;;;;;;;;:27;34963:7;34944:27;;;;;;;;;;;;;;;:36;;;;35012:7;34996:32;;35005:5;34996:32;;;35021:6;34996:32;;;;;;:::i;:::-;;;;;;;;34656:380;;;:::o;35327:453::-;35462:24;35489:25;35499:5;35506:7;35489:9;:25::i;:::-;35462:52;;35549:17;35529:16;:37;35525:248;;35611:6;35591:16;:26;;35583:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35695:51;35704:5;35711:7;35739:6;35720:16;:25;35695:8;:51::i;:::-;35525:248;35451:329;35327:453;;;:::o;31937:671::-;32084:1;32068:18;;:4;:18;;;;32060:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32161:1;32147:16;;:2;:16;;;;32139:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;32216:38;32237:4;32243:2;32247:6;32216:20;:38::i;:::-;32267:19;32289:9;:15;32299:4;32289:15;;;;;;;;;;;;;;;;32267:37;;32338:6;32323:11;:21;;32315:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;32455:6;32441:11;:20;32423:9;:15;32433:4;32423:15;;;;;;;;;;;;;;;:38;;;;32500:6;32483:9;:13;32493:2;32483:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;32539:2;32524:26;;32533:4;32524:26;;;32543:6;32524:26;;;;;;:::i;:::-;;;;;;;;32563:37;32583:4;32589:2;32593:6;32563:19;:37::i;:::-;32049:559;31937:671;;;:::o;16120:314::-;16173:7;16214:12;16197:29;;16205:4;16197:29;;;:66;;;;;16247:16;16230:13;:33;16197:66;16193:234;;;16287:24;16280:31;;;;16193:234;16351:64;16373:10;16385:12;16399:15;16351:21;:64::i;:::-;16344:71;;16120:314;;:::o;878:114::-;943:7;970;:14;;;963:21;;878:114;;;:::o;40295:207::-;40355:15;40383:30;40416:7;:14;40424:5;40416:14;;;;;;;;;;;;;;;40383:47;;40451:15;:5;:13;:15::i;:::-;40441:25;;40477:17;:5;:15;:17::i;:::-;40372:130;40295:207;;;:::o;17347:167::-;17424:7;17451:55;17473:20;:18;:20::i;:::-;17495:10;17451:21;:55::i;:::-;17444:62;;17347:167;;;:::o;11013:279::-;11141:7;11162:17;11181:18;11203:25;11214:4;11220:1;11223;11226;11203:10;:25::i;:::-;11161:67;;;;11239:18;11251:5;11239:11;:18::i;:::-;11275:9;11268:16;;;;11013:279;;;;;;:::o;36380:125::-;;;;:::o;37109:124::-;;;;:::o;16442:263::-;16586:7;16634:8;16644;16654:11;16667:13;16690:4;16623:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16613:84;;;;;;16606:91;;16442:263;;;;;:::o;1000:127::-;1107:1;1089:7;:14;;;:19;;;;;;;;;;;1000:127;:::o;12704:196::-;12797:7;12863:15;12880:10;12834:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12824:68;;;;;;12817:75;;12704:196;;;;:::o;9242:1632::-;9373:7;9382:12;10307:66;10302:1;10294:10;;:79;10290:163;;;10406:1;10410:30;10390:51;;;;;;10290:163;10472:2;10467:1;:7;;;;:18;;;;;10483:2;10478:1;:7;;;;10467:18;10463:102;;;10518:1;10522:30;10502:51;;;;;;10463:102;10662:14;10679:24;10689:4;10695:1;10698;10701;10679:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10662:41;;10736:1;10718:20;;:6;:20;;;10714:103;;;10771:1;10775:29;10755:50;;;;;;;10714:103;10837:6;10845:20;10829:37;;;;;9242:1632;;;;;;;;:::o;4512:643::-;4590:20;4581:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;4577:571;;;4627:7;;4577:571;4688:29;4679:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;4675:473;;;4734:34;;;;;;;;;;:::i;:::-;;;;;;;;4675:473;4799:35;4790:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;4786:362;;;4851:41;;;;;;;;;;:::i;:::-;;;;;;;;4786:362;4923:30;4914:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;4910:238;;;4970:44;;;;;;;;;;:::i;:::-;;;;;;;;4910:238;5045:30;5036:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;5032:116;;;5092:44;;;;;;;;;;:::i;:::-;;;;;;;;5032:116;4512:643;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:::-;198:5;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;152:139;;;;:::o;297:::-;343:5;381:6;368:20;359:29;;397:33;424:5;397:33;:::i;:::-;297:139;;;;:::o;442:135::-;486:5;524:6;511:20;502:29;;540:31;565:5;540:31;:::i;:::-;442:135;;;;:::o;583:329::-;642:6;691:2;679:9;670:7;666:23;662:32;659:119;;;697:79;;:::i;:::-;659:119;817:1;842:53;887:7;878:6;867:9;863:22;842:53;:::i;:::-;832:63;;788:117;583:329;;;;:::o;918:474::-;986:6;994;1043:2;1031:9;1022:7;1018:23;1014:32;1011:119;;;1049:79;;:::i;:::-;1011:119;1169:1;1194:53;1239:7;1230:6;1219:9;1215:22;1194:53;:::i;:::-;1184:63;;1140:117;1296:2;1322:53;1367:7;1358:6;1347:9;1343:22;1322:53;:::i;:::-;1312:63;;1267:118;918:474;;;;;:::o;1398:619::-;1475:6;1483;1491;1540:2;1528:9;1519:7;1515:23;1511:32;1508:119;;;1546:79;;:::i;:::-;1508:119;1666:1;1691:53;1736:7;1727:6;1716:9;1712:22;1691:53;:::i;:::-;1681:63;;1637:117;1793:2;1819:53;1864:7;1855:6;1844:9;1840:22;1819:53;:::i;:::-;1809:63;;1764:118;1921:2;1947:53;1992:7;1983:6;1972:9;1968:22;1947:53;:::i;:::-;1937:63;;1892:118;1398:619;;;;;:::o;2023:1199::-;2134:6;2142;2150;2158;2166;2174;2182;2231:3;2219:9;2210:7;2206:23;2202:33;2199:120;;;2238:79;;:::i;:::-;2199:120;2358:1;2383:53;2428:7;2419:6;2408:9;2404:22;2383:53;:::i;:::-;2373:63;;2329:117;2485:2;2511:53;2556:7;2547:6;2536:9;2532:22;2511:53;:::i;:::-;2501:63;;2456:118;2613:2;2639:53;2684:7;2675:6;2664:9;2660:22;2639:53;:::i;:::-;2629:63;;2584:118;2741:2;2767:53;2812:7;2803:6;2792:9;2788:22;2767:53;:::i;:::-;2757:63;;2712:118;2869:3;2896:51;2939:7;2930:6;2919:9;2915:22;2896:51;:::i;:::-;2886:61;;2840:117;2996:3;3023:53;3068:7;3059:6;3048:9;3044:22;3023:53;:::i;:::-;3013:63;;2967:119;3125:3;3152:53;3197:7;3188:6;3177:9;3173:22;3152:53;:::i;:::-;3142:63;;3096:119;2023:1199;;;;;;;;;;:::o;3228:474::-;3296:6;3304;3353:2;3341:9;3332:7;3328:23;3324:32;3321:119;;;3359:79;;:::i;:::-;3321:119;3479:1;3504:53;3549:7;3540:6;3529:9;3525:22;3504:53;:::i;:::-;3494:63;;3450:117;3606:2;3632:53;3677:7;3668:6;3657:9;3653:22;3632:53;:::i;:::-;3622:63;;3577:118;3228:474;;;;;:::o;3708:118::-;3795:24;3813:5;3795:24;:::i;:::-;3790:3;3783:37;3708:118;;:::o;3832:109::-;3913:21;3928:5;3913:21;:::i;:::-;3908:3;3901:34;3832:109;;:::o;3947:118::-;4034:24;4052:5;4034:24;:::i;:::-;4029:3;4022:37;3947:118;;:::o;4071:157::-;4176:45;4196:24;4214:5;4196:24;:::i;:::-;4176:45;:::i;:::-;4171:3;4164:58;4071:157;;:::o;4234:364::-;4322:3;4350:39;4383:5;4350:39;:::i;:::-;4405:71;4469:6;4464:3;4405:71;:::i;:::-;4398:78;;4485:52;4530:6;4525:3;4518:4;4511:5;4507:16;4485:52;:::i;:::-;4562:29;4584:6;4562:29;:::i;:::-;4557:3;4553:39;4546:46;;4326:272;4234:364;;;;:::o;4604:366::-;4746:3;4767:67;4831:2;4826:3;4767:67;:::i;:::-;4760:74;;4843:93;4932:3;4843:93;:::i;:::-;4961:2;4956:3;4952:12;4945:19;;4604:366;;;:::o;4976:::-;5118:3;5139:67;5203:2;5198:3;5139:67;:::i;:::-;5132:74;;5215:93;5304:3;5215:93;:::i;:::-;5333:2;5328:3;5324:12;5317:19;;4976:366;;;:::o;5348:::-;5490:3;5511:67;5575:2;5570:3;5511:67;:::i;:::-;5504:74;;5587:93;5676:3;5587:93;:::i;:::-;5705:2;5700:3;5696:12;5689:19;;5348:366;;;:::o;5720:::-;5862:3;5883:67;5947:2;5942:3;5883:67;:::i;:::-;5876:74;;5959:93;6048:3;5959:93;:::i;:::-;6077:2;6072:3;6068:12;6061:19;;5720:366;;;:::o;6092:400::-;6252:3;6273:84;6355:1;6350:3;6273:84;:::i;:::-;6266:91;;6366:93;6455:3;6366:93;:::i;:::-;6484:1;6479:3;6475:11;6468:18;;6092:400;;;:::o;6498:366::-;6640:3;6661:67;6725:2;6720:3;6661:67;:::i;:::-;6654:74;;6737:93;6826:3;6737:93;:::i;:::-;6855:2;6850:3;6846:12;6839:19;;6498:366;;;:::o;6870:::-;7012:3;7033:67;7097:2;7092:3;7033:67;:::i;:::-;7026:74;;7109:93;7198:3;7109:93;:::i;:::-;7227:2;7222:3;7218:12;7211:19;;6870:366;;;:::o;7242:::-;7384:3;7405:67;7469:2;7464:3;7405:67;:::i;:::-;7398:74;;7481:93;7570:3;7481:93;:::i;:::-;7599:2;7594:3;7590:12;7583:19;;7242:366;;;:::o;7614:::-;7756:3;7777:67;7841:2;7836:3;7777:67;:::i;:::-;7770:74;;7853:93;7942:3;7853:93;:::i;:::-;7971:2;7966:3;7962:12;7955:19;;7614:366;;;:::o;7986:::-;8128:3;8149:67;8213:2;8208:3;8149:67;:::i;:::-;8142:74;;8225:93;8314:3;8225:93;:::i;:::-;8343:2;8338:3;8334:12;8327:19;;7986:366;;;:::o;8358:::-;8500:3;8521:67;8585:2;8580:3;8521:67;:::i;:::-;8514:74;;8597:93;8686:3;8597:93;:::i;:::-;8715:2;8710:3;8706:12;8699:19;;8358:366;;;:::o;8730:::-;8872:3;8893:67;8957:2;8952:3;8893:67;:::i;:::-;8886:74;;8969:93;9058:3;8969:93;:::i;:::-;9087:2;9082:3;9078:12;9071:19;;8730:366;;;:::o;9102:::-;9244:3;9265:67;9329:2;9324:3;9265:67;:::i;:::-;9258:74;;9341:93;9430:3;9341:93;:::i;:::-;9459:2;9454:3;9450:12;9443:19;;9102:366;;;:::o;9474:::-;9616:3;9637:67;9701:2;9696:3;9637:67;:::i;:::-;9630:74;;9713:93;9802:3;9713:93;:::i;:::-;9831:2;9826:3;9822:12;9815:19;;9474:366;;;:::o;9846:118::-;9933:24;9951:5;9933:24;:::i;:::-;9928:3;9921:37;9846:118;;:::o;9970:112::-;10053:22;10069:5;10053:22;:::i;:::-;10048:3;10041:35;9970:112;;:::o;10088:663::-;10329:3;10351:148;10495:3;10351:148;:::i;:::-;10344:155;;10509:75;10580:3;10571:6;10509:75;:::i;:::-;10609:2;10604:3;10600:12;10593:19;;10622:75;10693:3;10684:6;10622:75;:::i;:::-;10722:2;10717:3;10713:12;10706:19;;10742:3;10735:10;;10088:663;;;;;:::o;10757:210::-;10844:4;10882:2;10871:9;10867:18;10859:26;;10895:65;10957:1;10946:9;10942:17;10933:6;10895:65;:::i;:::-;10757:210;;;;:::o;10973:222::-;11066:4;11104:2;11093:9;11089:18;11081:26;;11117:71;11185:1;11174:9;11170:17;11161:6;11117:71;:::i;:::-;10973:222;;;;:::o;11201:775::-;11434:4;11472:3;11461:9;11457:19;11449:27;;11486:71;11554:1;11543:9;11539:17;11530:6;11486:71;:::i;:::-;11567:72;11635:2;11624:9;11620:18;11611:6;11567:72;:::i;:::-;11649;11717:2;11706:9;11702:18;11693:6;11649:72;:::i;:::-;11731;11799:2;11788:9;11784:18;11775:6;11731:72;:::i;:::-;11813:73;11881:3;11870:9;11866:19;11857:6;11813:73;:::i;:::-;11896;11964:3;11953:9;11949:19;11940:6;11896:73;:::i;:::-;11201:775;;;;;;;;;:::o;11982:664::-;12187:4;12225:3;12214:9;12210:19;12202:27;;12239:71;12307:1;12296:9;12292:17;12283:6;12239:71;:::i;:::-;12320:72;12388:2;12377:9;12373:18;12364:6;12320:72;:::i;:::-;12402;12470:2;12459:9;12455:18;12446:6;12402:72;:::i;:::-;12484;12552:2;12541:9;12537:18;12528:6;12484:72;:::i;:::-;12566:73;12634:3;12623:9;12619:19;12610:6;12566:73;:::i;:::-;11982:664;;;;;;;;:::o;12652:545::-;12825:4;12863:3;12852:9;12848:19;12840:27;;12877:71;12945:1;12934:9;12930:17;12921:6;12877:71;:::i;:::-;12958:68;13022:2;13011:9;13007:18;12998:6;12958:68;:::i;:::-;13036:72;13104:2;13093:9;13089:18;13080:6;13036:72;:::i;:::-;13118;13186:2;13175:9;13171:18;13162:6;13118:72;:::i;:::-;12652:545;;;;;;;:::o;13203:313::-;13316:4;13354:2;13343:9;13339:18;13331:26;;13403:9;13397:4;13393:20;13389:1;13378:9;13374:17;13367:47;13431:78;13504:4;13495:6;13431:78;:::i;:::-;13423:86;;13203:313;;;;:::o;13522:419::-;13688:4;13726:2;13715:9;13711:18;13703:26;;13775:9;13769:4;13765:20;13761:1;13750:9;13746:17;13739:47;13803:131;13929:4;13803:131;:::i;:::-;13795:139;;13522:419;;;:::o;13947:::-;14113:4;14151:2;14140:9;14136:18;14128:26;;14200:9;14194:4;14190:20;14186:1;14175:9;14171:17;14164:47;14228:131;14354:4;14228:131;:::i;:::-;14220:139;;13947:419;;;:::o;14372:::-;14538:4;14576:2;14565:9;14561:18;14553:26;;14625:9;14619:4;14615:20;14611:1;14600:9;14596:17;14589:47;14653:131;14779:4;14653:131;:::i;:::-;14645:139;;14372:419;;;:::o;14797:::-;14963:4;15001:2;14990:9;14986:18;14978:26;;15050:9;15044:4;15040:20;15036:1;15025:9;15021:17;15014:47;15078:131;15204:4;15078:131;:::i;:::-;15070:139;;14797:419;;;:::o;15222:::-;15388:4;15426:2;15415:9;15411:18;15403:26;;15475:9;15469:4;15465:20;15461:1;15450:9;15446:17;15439:47;15503:131;15629:4;15503:131;:::i;:::-;15495:139;;15222:419;;;:::o;15647:::-;15813:4;15851:2;15840:9;15836:18;15828:26;;15900:9;15894:4;15890:20;15886:1;15875:9;15871:17;15864:47;15928:131;16054:4;15928:131;:::i;:::-;15920:139;;15647:419;;;:::o;16072:::-;16238:4;16276:2;16265:9;16261:18;16253:26;;16325:9;16319:4;16315:20;16311:1;16300:9;16296:17;16289:47;16353:131;16479:4;16353:131;:::i;:::-;16345:139;;16072:419;;;:::o;16497:::-;16663:4;16701:2;16690:9;16686:18;16678:26;;16750:9;16744:4;16740:20;16736:1;16725:9;16721:17;16714:47;16778:131;16904:4;16778:131;:::i;:::-;16770:139;;16497:419;;;:::o;16922:::-;17088:4;17126:2;17115:9;17111:18;17103:26;;17175:9;17169:4;17165:20;17161:1;17150:9;17146:17;17139:47;17203:131;17329:4;17203:131;:::i;:::-;17195:139;;16922:419;;;:::o;17347:::-;17513:4;17551:2;17540:9;17536:18;17528:26;;17600:9;17594:4;17590:20;17586:1;17575:9;17571:17;17564:47;17628:131;17754:4;17628:131;:::i;:::-;17620:139;;17347:419;;;:::o;17772:::-;17938:4;17976:2;17965:9;17961:18;17953:26;;18025:9;18019:4;18015:20;18011:1;18000:9;17996:17;17989:47;18053:131;18179:4;18053:131;:::i;:::-;18045:139;;17772:419;;;:::o;18197:::-;18363:4;18401:2;18390:9;18386:18;18378:26;;18450:9;18444:4;18440:20;18436:1;18425:9;18421:17;18414:47;18478:131;18604:4;18478:131;:::i;:::-;18470:139;;18197:419;;;:::o;18622:::-;18788:4;18826:2;18815:9;18811:18;18803:26;;18875:9;18869:4;18865:20;18861:1;18850:9;18846:17;18839:47;18903:131;19029:4;18903:131;:::i;:::-;18895:139;;18622:419;;;:::o;19047:222::-;19140:4;19178:2;19167:9;19163:18;19155:26;;19191:71;19259:1;19248:9;19244:17;19235:6;19191:71;:::i;:::-;19047:222;;;;:::o;19275:214::-;19364:4;19402:2;19391:9;19387:18;19379:26;;19415:67;19479:1;19468:9;19464:17;19455:6;19415:67;:::i;:::-;19275:214;;;;:::o;19576:99::-;19628:6;19662:5;19656:12;19646:22;;19576:99;;;:::o;19681:169::-;19765:11;19799:6;19794:3;19787:19;19839:4;19834:3;19830:14;19815:29;;19681:169;;;;:::o;19856:148::-;19958:11;19995:3;19980:18;;19856:148;;;;:::o;20010:305::-;20050:3;20069:20;20087:1;20069:20;:::i;:::-;20064:25;;20103:20;20121:1;20103:20;:::i;:::-;20098:25;;20257:1;20189:66;20185:74;20182:1;20179:81;20176:107;;;20263:18;;:::i;:::-;20176:107;20307:1;20304;20300:9;20293:16;;20010:305;;;;:::o;20321:96::-;20358:7;20387:24;20405:5;20387:24;:::i;:::-;20376:35;;20321:96;;;:::o;20423:90::-;20457:7;20500:5;20493:13;20486:21;20475:32;;20423:90;;;:::o;20519:77::-;20556:7;20585:5;20574:16;;20519:77;;;:::o;20602:126::-;20639:7;20679:42;20672:5;20668:54;20657:65;;20602:126;;;:::o;20734:77::-;20771:7;20800:5;20789:16;;20734:77;;;:::o;20817:86::-;20852:7;20892:4;20885:5;20881:16;20870:27;;20817:86;;;:::o;20909:307::-;20977:1;20987:113;21001:6;20998:1;20995:13;20987:113;;;21086:1;21081:3;21077:11;21071:18;21067:1;21062:3;21058:11;21051:39;21023:2;21020:1;21016:10;21011:15;;20987:113;;;21118:6;21115:1;21112:13;21109:101;;;21198:1;21189:6;21184:3;21180:16;21173:27;21109:101;20958:258;20909:307;;;:::o;21222:320::-;21266:6;21303:1;21297:4;21293:12;21283:22;;21350:1;21344:4;21340:12;21371:18;21361:81;;21427:4;21419:6;21415:17;21405:27;;21361:81;21489:2;21481:6;21478:14;21458:18;21455:38;21452:84;;;21508:18;;:::i;:::-;21452:84;21273:269;21222:320;;;:::o;21548:79::-;21587:7;21616:5;21605:16;;21548:79;;;:::o;21633:180::-;21681:77;21678:1;21671:88;21778:4;21775:1;21768:15;21802:4;21799:1;21792:15;21819:180;21867:77;21864:1;21857:88;21964:4;21961:1;21954:15;21988:4;21985:1;21978:15;22005:180;22053:77;22050:1;22043:88;22150:4;22147:1;22140:15;22174:4;22171:1;22164:15;22314:117;22423:1;22420;22413:12;22437:102;22478:6;22529:2;22525:7;22520:2;22513:5;22509:14;22505:28;22495:38;;22437:102;;;:::o;22545:174::-;22685:26;22681:1;22673:6;22669:14;22662:50;22545:174;:::o;22725:222::-;22865:34;22861:1;22853:6;22849:14;22842:58;22934:5;22929:2;22921:6;22917:15;22910:30;22725:222;:::o;22953:181::-;23093:33;23089:1;23081:6;23077:14;23070:57;22953:181;:::o;23140:221::-;23280:34;23276:1;23268:6;23264:14;23257:58;23349:4;23344:2;23336:6;23332:15;23325:29;23140:221;:::o;23367:214::-;23507:66;23503:1;23495:6;23491:14;23484:90;23367:214;:::o;23587:179::-;23727:31;23723:1;23715:6;23711:14;23704:55;23587:179;:::o;23772:::-;23912:31;23908:1;23900:6;23896:14;23889:55;23772:179;:::o;23957:225::-;24097:34;24093:1;24085:6;24081:14;24074:58;24166:8;24161:2;24153:6;24149:15;24142:33;23957:225;:::o;24188:221::-;24328:34;24324:1;24316:6;24312:14;24305:58;24397:4;24392:2;24384:6;24380:15;24373:29;24188:221;:::o;24415:::-;24555:34;24551:1;24543:6;24539:14;24532:58;24624:4;24619:2;24611:6;24607:15;24600:29;24415:221;:::o;24642:180::-;24782:32;24778:1;24770:6;24766:14;24759:56;24642:180;:::o;24828:224::-;24968:34;24964:1;24956:6;24952:14;24945:58;25037:7;25032:2;25024:6;25020:15;25013:32;24828:224;:::o;25058:223::-;25198:34;25194:1;25186:6;25182:14;25175:58;25267:6;25262:2;25254:6;25250:15;25243:31;25058:223;:::o;25287:224::-;25427:34;25423:1;25415:6;25411:14;25404:58;25496:7;25491:2;25483:6;25479:15;25472:32;25287:224;:::o;25517:122::-;25590:24;25608:5;25590:24;:::i;:::-;25583:5;25580:35;25570:63;;25629:1;25626;25619:12;25570:63;25517:122;:::o;25645:::-;25718:24;25736:5;25718:24;:::i;:::-;25711:5;25708:35;25698:63;;25757:1;25754;25747:12;25698:63;25645:122;:::o;25773:::-;25846:24;25864:5;25846:24;:::i;:::-;25839:5;25836:35;25826:63;;25885:1;25882;25875:12;25826:63;25773:122;:::o;25901:118::-;25972:22;25988:5;25972:22;:::i;:::-;25965:5;25962:33;25952:61;;26009:1;26006;25999:12;25952:61;25901:118;:::o

Swarm Source

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