ETH Price: $3,406.97 (-1.51%)
Gas: 8 Gwei

Token

MONEY (MONEY)
 

Overview

Max Total Supply

790,107,231.003496956624906334 MONEY

Holders

201

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
freecookies.eth
Balance
0.648118190312044259 MONEY

Value
$0.00
0x66d8f275b22e0d1f9482f3f55be8424b5777f557
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:
Money

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-03
*/

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/utils/math/SignedMath.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

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

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

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

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

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}

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


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

pragma solidity ^0.8.0;



/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _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) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

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

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

/**
 * @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/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```solidity
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```solidity
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
 * to enforce additional security measures for this role.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(account),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

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

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

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

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

// File: contracts/Money.sol



pragma solidity =0.8.19;




//////////////////////////////////////////////////////////////////////////////////////////
//                                  INTERFACES                                          //
//////////////////////////////////////////////////////////////////////////////////////////

interface IFactoryV2 {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address lpPair,
        uint
    );

    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address lpPair);

    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address lpPair);
}

interface IV2Pair {
    function factory() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function sync() external;
}

interface IRouter01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        external
        payable
        returns (uint amountToken, uint amountETH, uint liquidity);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function getAmountsOut(
        uint amountIn,
        address[] calldata path
    ) external view returns (uint[] memory amounts);

    function getAmountsIn(
        uint amountOut,
        address[] calldata path
    ) external view returns (uint[] memory amounts);
}

interface IRouter02 is IRouter01 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
}

//////////////////////////////////////////////////////////////////////////////////////////
//                                  MAIN                                                //
//////////////////////////////////////////////////////////////////////////////////////////

contract Money is Context, Ownable, AccessControl, IERC20 {
    bytes32 public constant JANNY_ROLE = keccak256("JANNY_ROLE");

    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    function decimals() external pure returns (uint8) {
        return _decimals;
    }

    function symbol() external pure returns (string memory) {
        return _symbol;
    }

    function name() external pure returns (string memory) {
        return _name;
    }

    function getOwner() external view returns (address) {
        return owner();
    }

    function allowance(
        address holder,
        address spender
    ) external view override returns (uint256) {
        return allowances[holder][spender];
    }

    function balanceOf(address account) public view override returns (uint256) {
        return balance[account];
    }

    mapping(address => mapping(address => uint256)) private allowances;
    mapping(address => bool) private isNoTax;
    mapping(address => bool) private isLpPair;
    mapping(address => uint256) private balance;

    uint256 private swapThreshold = _totalSupply / 5_000;

    uint256 public _totalSupply = 1_000_000_000 * 10 ** 18;
    uint256 public originalSupply = _totalSupply;
    uint256 public buyTax = 275;
    uint256 public sellTax = 275;
    uint256 public constant taxDenominator = 10_000;
    address payable private devFundsAddress =
        payable(0x2447bA7d0996FaE5214bCEc6a2d4e6C3b1B18C07);

    uint256 private devAllocation = 30;
    uint256 private burnAllocation = 70;

    IRouter02 public swapRouter;
    string private constant _name = "MONEY";
    string private constant _symbol = "MONEY";
    uint8 private constant _decimals = 18;
    bool public isTradingEnabled;
    bool private inSwap;
    bool public taxCanChange = true;

    modifier inSwapFlag() {
        inSwap = true;
        _;
        inSwap = false;
    }

    event EnableTrading();
    event AddLpPair(address indexed newLpPair);
    event ChangeThreshold(uint256 indexed newThreshold);
    event ChangeDevFundsAddress(address indexed newAddress);
    event ChangeTaxes(uint256 indexed buyTax, uint256 indexed sellTax);
    event Burned(uint256 indexed tokensBurned);
    event NewSwapRouter(address indexed newRouter);
    event ToggleNoTaxAccount(address indexed account, bool enabled);
    event TotalSupplyChange(uint256 indexed totalSupply);
    event RemoveLpPair(address indexed pairToRemove);

    constructor() {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(JANNY_ROLE, msg.sender);
        isNoTax[msg.sender] = true;
        isNoTax[address(this)] = true;

        swapRouter = IRouter02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        balance[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    receive() external payable {}

    ///@notice Locks the taxes permanently.
    function lockTaxes() external onlyOwner {
        taxCanChange = false;
    }

    function setSwapRouter(
        address newRouter,
        address newLpPair
    ) external onlyOwner {
        require(newRouter != address(0), "Zero Address");
        require(newLpPair != address(0), "Zero Address");
        require(newRouter != address(swapRouter), "Same router");
        swapRouter = IRouter02(newRouter);
        isLpPair[newLpPair] = true;
        _approve(msg.sender, address(swapRouter), type(uint256).max);
        _approve(address(this), address(swapRouter), type(uint256).max);
        emit AddLpPair(newLpPair);
        emit NewSwapRouter(newRouter);
    }

    function setSwapThreshold(
        uint256 newDenominator
    ) external onlyRole(JANNY_ROLE) {
        swapThreshold = _totalSupply / newDenominator;
        emit ChangeThreshold(swapThreshold);
    }

    function transfer(
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function approve(
        address spender,
        uint256 amount
    ) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function _approve(
        address sender,
        address spender,
        uint256 amount
    ) internal {
        require(sender != address(0), "Zero Address");
        require(spender != address(0), "Zero Address");

        allowances[sender][spender] = amount;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        if (allowances[sender][msg.sender] != type(uint256).max) {
            allowances[sender][msg.sender] -= amount;
        }

        return _transfer(sender, recipient, amount);
    }

    function isNoTaxAccount(address account) external view returns (bool) {
        return isNoTax[account];
    }

    function addNoTaxAccount(
        address account,
        bool enabled
    ) public onlyRole(JANNY_ROLE) {
        isNoTax[account] = enabled;
        emit ToggleNoTaxAccount(account, enabled);
    }

    function isLimitedAddress(
        address _in,
        address _out
    ) internal view returns (bool) {
        bool isLimited = _in != owner() &&
            _out != owner() &&
            tx.origin != owner() &&
            msg.sender != owner() &&
            _out != address(0) &&
            _out != address(this);
        return isLimited;
    }

    function isBuy(address _in, address _out) internal view returns (bool) {
        bool _isBuy = !isLpPair[_out] && isLpPair[_in];
        return _isBuy;
    }

    function isSell(address _in, address _out) internal view returns (bool) {
        bool _isSell = isLpPair[_out] && !isLpPair[_in];
        return _isSell;
    }

    function addLpPair(address newPair) external onlyRole(JANNY_ROLE) {
        isLpPair[newPair] = true;
        _approve(msg.sender, address(swapRouter), type(uint256).max);
        _approve(address(this), address(swapRouter), type(uint256).max);
        emit AddLpPair(newPair);
    }

    function removeLpPair(address pairToRemove) external onlyRole(JANNY_ROLE) {
        isLpPair[pairToRemove] = false;
        emit RemoveLpPair(pairToRemove);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal returns (bool) {
        bool takeTax = true;
        require(to != address(0), "Transfer to the zero address");
        require(from != address(0), "Transfer from the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        if (isLimitedAddress(from, to)) {
            require(isTradingEnabled, "Trading is not enabled");
        }

        if (isNoTax[from] || isNoTax[to]) {
            takeTax = false;
        }
        balance[from] -= amount;
        uint256 amountAfterFee = (takeTax)
            ? _takeTaxes(from, isBuy(from, to), isSell(from, to), amount)
            : amount;
        balance[to] += amountAfterFee;
        emit Transfer(from, to, amountAfterFee);

        return true;
    }

    function changeDevFundsAddress(address newAddress) external onlyOwner {
        devFundsAddress = payable(newAddress);
        emit ChangeDevFundsAddress(newAddress);
    }

    function _takeTaxes(
        address from,
        bool _isBuy,
        bool _isSell,
        uint256 amount
    ) internal returns (uint256) {
        uint256 tax;
        if (_isBuy) tax = buyTax;
        else if (_isSell) tax = sellTax;
        if (tax == 0) return amount;
        uint256 taxAmount = (amount * tax) / taxDenominator;
        if (taxAmount > 0) {
            balance[address(this)] += taxAmount;
            emit Transfer(from, address(this), taxAmount);
        }
        return amount - taxAmount;
    }

    function _internalSwap(
        uint256 tokensToSwap
    ) internal inSwapFlag returns (bool) {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = swapRouter.WETH();

        if (
            allowances[address(this)][address(swapRouter)] != type(uint256).max
        ) {
            allowances[address(this)][address(swapRouter)] = type(uint256).max;
        }

        swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokensToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        return true;
    }

    ///@notice Taxes are in basis points.
    function changeTaxes(
        uint256 _buyTax,
        uint256 _sellTax
    ) external onlyRole(JANNY_ROLE) {
        require(taxCanChange, "Tax cannot be changed");
        require(_buyTax % 25 == 0, "Tax must be modulo 25");
        require(_sellTax % 25 == 0, "Tax must be modulo 25");
        require((_sellTax <= 2000) && (_buyTax <= 2000), "Tax out of bounds");

        buyTax = _buyTax;
        sellTax = _sellTax;
        emit ChangeTaxes(buyTax, sellTax);
    }

    function enableTrading() external onlyOwner {
        require(!isTradingEnabled, "Trading already enabled");
        isTradingEnabled = true;
        emit EnableTrading();
    }

    ///@notice Calls the burn function and swaps the dev allocation for ETH.
    function thresholdUpkeep() external {
        uint256 contractTokenBalance = balanceOf(address(this));
        uint256 devAmount = (contractTokenBalance * devAllocation) / 100;
        uint256 burnAmount = (contractTokenBalance * burnAllocation) / 100;
        if (contractTokenBalance >= swapThreshold) {
            _internalSwap(devAmount);
            _burn(burnAmount);
        }
    }

    ///@notice Same as public burn but only for the Janny.
    function jannyUpkeep() external onlyRole(JANNY_ROLE) {
        uint256 contractTokenBalance = balanceOf(address(this));
        uint256 devAmount = (contractTokenBalance * devAllocation) / 100;
        uint256 burnAmount = (contractTokenBalance * burnAllocation) / 100;
        _internalSwap(devAmount);
        _burn(burnAmount);
    }

    function manualExtraction(uint256 gasAmount) external {
        bool success;
        uint256 amountETH = address(this).balance;
        if (gasAmount == 0) {
            gasAmount = 35000;
        }
        if (amountETH > 0)
            (success, ) = devFundsAddress.call{
                value: amountETH,
                gas: gasAmount
            }("");
    }

    function _burn(uint256 amount) internal returns (bool) {
        balance[address(this)] -= amount;
        _totalSupply -= amount;
        emit Burned(amount);
        emit TotalSupplyChange(_totalSupply);
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLpPair","type":"address"}],"name":"AddLpPair","type":"event"},{"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":"uint256","name":"tokensBurned","type":"uint256"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"ChangeDevFundsAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"buyTax","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"sellTax","type":"uint256"}],"name":"ChangeTaxes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"ChangeThreshold","type":"event"},{"anonymous":false,"inputs":[],"name":"EnableTrading","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRouter","type":"address"}],"name":"NewSwapRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pairToRemove","type":"address"}],"name":"RemoveLpPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"ToggleNoTaxAccount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"TotalSupplyChange","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":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JANNY_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newPair","type":"address"}],"name":"addLpPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"addNoTaxAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"changeDevFundsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTax","type":"uint256"},{"internalType":"uint256","name":"_sellTax","type":"uint256"}],"name":"changeTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isNoTaxAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jannyUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gasAmount","type":"uint256"}],"name":"manualExtraction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"originalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pairToRemove","type":"address"}],"name":"removeLpPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"},{"internalType":"address","name":"newLpPair","type":"address"}],"name":"setSwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDenominator","type":"uint256"}],"name":"setSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract IRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"taxCanChange","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thresholdUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405261138860075462000016919062000546565b6006556b033b2e3c9fd0803ce8000000600755600754600855610113600955610113600a55732447ba7d0996fae5214bcec6a2d4e6c3b1b18c07600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601e600c556046600d556001600e60166101000a81548160ff021916908315150217905550348015620000c257600080fd5b50620000e3620000d7620002e560201b60201c565b620002ed60201b60201c565b620000f86000801b33620003b160201b60201c565b6200012a7f744eed60732ef1413c1151b37832d163badcdd4b724806d4c7a318c45ca01a4f33620003b160201b60201c565b6001600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600754600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600754604051620002d791906200058f565b60405180910390a3620005ac565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003c38282620004a260201b60201c565b6200049e57600180600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000443620002e560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000553826200050d565b915062000560836200050d565b92508262000573576200057262000517565b5b828204905092915050565b62000589816200050d565b82525050565b6000602082019050620005a660008301846200057e565b92915050565b61407380620005bc6000396000f3fe6080604052600436106102555760003560e01c8063715018a611610139578063a9059cbb116100b6578063d547741f1161007a578063d547741f14610877578063db7bb2cc146108a0578063dc40e2d0146108dd578063dd62ed3e14610906578063f2fde38b14610943578063fe2314d61461096c5761025c565b8063a9059cbb146107a2578063b261c65b146107df578063b361b2b5146107f6578063c31c9c0714610821578063cc1776d31461084c5761025c565b80638da5cb5b116100fd5780638da5cb5b146106bb57806391d14854146106e657806395d89b41146107235780639d0014b11461074e578063a217fddf146107775761025c565b8063715018a61461062257806378648edf146106395780638785048414610650578063893d20e8146106795780638a8c523c146106a45761025c565b80632f2ff15d116101d25780634b2ba0dd116101965780634b2ba0dd146105125780634f7041a51461053d5780635bd3ae0d146105685780635c8cb212146105935780636f10edd5146105bc57806370a08231146105e55761025c565b80632f2ff15d14610453578063304d65171461047c578063313ce5671461049357806336568abe146104be5780633eaaf86b146104e75761025c565b806318160ddd1161021957806318160ddd1461035a5780631a6059af1461038557806323b872dd146103ae578063248a9ca3146103eb5780632be63d9a146104285761025c565b806301ffc9a7146102615780630228c19c1461029e578063064a59d0146102c757806306fdde03146102f2578063095ea7b31461031d5761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190612fb5565b610995565b6040516102959190612ffd565b60405180910390f35b3480156102aa57600080fd5b506102c560048036038101906102c09190613076565b610a0f565b005b3480156102d357600080fd5b506102dc610ad8565b6040516102e99190612ffd565b60405180910390f35b3480156102fe57600080fd5b50610307610aeb565b6040516103149190613133565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f919061318b565b610b28565b6040516103519190612ffd565b60405180910390f35b34801561036657600080fd5b5061036f610b3f565b60405161037c91906131da565b60405180910390f35b34801561039157600080fd5b506103ac60048036038101906103a791906131f5565b610b49565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190613222565b610bfd565b6040516103e29190612ffd565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d91906132ab565b610d4a565b60405161041f91906132e7565b60405180910390f35b34801561043457600080fd5b5061043d610d6a565b60405161044a9190612ffd565b60405180910390f35b34801561045f57600080fd5b5061047a60048036038101906104759190613302565b610d7d565b005b34801561048857600080fd5b50610491610d9e565b005b34801561049f57600080fd5b506104a8610e0a565b6040516104b5919061335e565b60405180910390f35b3480156104ca57600080fd5b506104e560048036038101906104e09190613302565b610e13565b005b3480156104f357600080fd5b506104fc610e96565b60405161050991906131da565b60405180910390f35b34801561051e57600080fd5b50610527610e9c565b60405161053491906131da565b60405180910390f35b34801561054957600080fd5b50610552610ea2565b60405161055f91906131da565b60405180910390f35b34801561057457600080fd5b5061057d610ea8565b60405161058a91906132e7565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b591906133a5565b610ecc565b005b3480156105c857600080fd5b506105e360048036038101906105de9190613076565b610fa0565b005b3480156105f157600080fd5b5061060c60048036038101906106079190613076565b611103565b60405161061991906131da565b60405180910390f35b34801561062e57600080fd5b5061063761114c565b005b34801561064557600080fd5b5061064e611160565b005b34801561065c57600080fd5b5061067760048036038101906106729190613076565b611185565b005b34801561068557600080fd5b5061068e611214565b60405161069b91906133f4565b60405180910390f35b3480156106b057600080fd5b506106b9611223565b005b3480156106c757600080fd5b506106d06112c4565b6040516106dd91906133f4565b60405180910390f35b3480156106f257600080fd5b5061070d60048036038101906107089190613302565b6112ed565b60405161071a9190612ffd565b60405180910390f35b34801561072f57600080fd5b50610738611358565b6040516107459190613133565b60405180910390f35b34801561075a57600080fd5b50610775600480360381019061077091906131f5565b611395565b005b34801561078357600080fd5b5061078c611406565b60405161079991906132e7565b60405180910390f35b3480156107ae57600080fd5b506107c960048036038101906107c4919061318b565b61140d565b6040516107d69190612ffd565b60405180910390f35b3480156107eb57600080fd5b506107f4611425565b005b34801561080257600080fd5b5061080b6114b2565b60405161081891906131da565b60405180910390f35b34801561082d57600080fd5b506108366114b8565b604051610843919061346e565b60405180910390f35b34801561085857600080fd5b506108616114de565b60405161086e91906131da565b60405180910390f35b34801561088357600080fd5b5061089e60048036038101906108999190613302565b6114e4565b005b3480156108ac57600080fd5b506108c760048036038101906108c29190613076565b611505565b6040516108d49190612ffd565b60405180910390f35b3480156108e957600080fd5b5061090460048036038101906108ff9190613489565b61155b565b005b34801561091257600080fd5b5061092d60048036038101906109289190613489565b61188e565b60405161093a91906131da565b60405180910390f35b34801561094f57600080fd5b5061096a60048036038101906109659190613076565b611915565b005b34801561097857600080fd5b50610993600480360381019061098e91906134c9565b611998565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a085750610a0782611b47565b5b9050919050565b7f744eed60732ef1413c1151b37832d163badcdd4b724806d4c7a318c45ca01a4f610a3981611bb1565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f8fd3ac7b1965dbfd2523994c41ccdd0be4fb0f0d784120b6be2c60e98aaccd4260405160405180910390a25050565b600e60149054906101000a900460ff1681565b60606040518060400160405280600581526020017f4d4f4e4559000000000000000000000000000000000000000000000000000000815250905090565b6000610b35338484611bc5565b6001905092915050565b6000600754905090565b60008047905060008303610b5d576188b892505b6000811115610bf857600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16818490604051610bae9061353a565b600060405180830381858888f193505050503d8060008114610bec576040519150601f19603f3d011682016040523d82523d6000602084013e610bf1565b606091505b5050809250505b505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610d365781600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d2e919061357e565b925050819055505b610d41848484611d29565b90509392505050565b600060016000838152602001908152602001600020600101549050919050565b600e60169054906101000a900460ff1681565b610d8682610d4a565b610d8f81611bb1565b610d9983836120a7565b505050565b6000610da930611103565b905060006064600c5483610dbd91906135b2565b610dc79190613623565b905060006064600d5484610ddb91906135b2565b610de59190613623565b90506006548310610e0557610df982612187565b50610e0381612564565b505b505050565b60006012905090565b610e1b61263a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7f906136c6565b60405180910390fd5b610e928282612642565b5050565b60075481565b60085481565b60095481565b7f744eed60732ef1413c1151b37832d163badcdd4b724806d4c7a318c45ca01a4f81565b7f744eed60732ef1413c1151b37832d163badcdd4b724806d4c7a318c45ca01a4f610ef681611bb1565b81600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167f9df45066c8b10cc4a20907c92f2ac2868b48bd065fca3f306df692ca09d74e6e83604051610f939190612ffd565b60405180910390a2505050565b7f744eed60732ef1413c1151b37832d163badcdd4b724806d4c7a318c45ca01a4f610fca81611bb1565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061106f33600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611bc5565b6110bc30600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611bc5565b8173ffffffffffffffffffffffffffffffffffffffff167f8ec520a99f1993d01011d73061b0327fb609db775f99d5a7a547d43f4ebf6add60405160405180910390a25050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611154612724565b61115e60006127a2565b565b611168612724565b6000600e60166101000a81548160ff021916908315150217905550565b61118d612724565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f63b16bbf1d7e61525c0baf8e81c29e50caaea89e39a4f2ecf7bf0ad48c9c283a60405160405180910390a250565b600061121e6112c4565b905090565b61122b612724565b600e60149054906101000a900460ff161561127b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127290613732565b60405180910390fd5b6001600e60146101000a81548160ff0219169083151502179055507f1d97b7cdf6b6f3405cbe398b69512e5419a0ce78232b6e9c6ffbf1466774bd8d60405160405180910390a1565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606040518060400160405280600581526020017f4d4f4e4559000000000000000000000000000000000000000000000000000000815250905090565b7f744eed60732ef1413c1151b37832d163badcdd4b724806d4c7a318c45ca01a4f6113bf81611bb1565b816007546113cd9190613623565b6006819055506006547f9947ac58e204d2da07b9748298663b3b77da7fb0638201d778987ded7c90fbaa60405160405180910390a25050565b6000801b81565b600061141a338484611d29565b506001905092915050565b7f744eed60732ef1413c1151b37832d163badcdd4b724806d4c7a318c45ca01a4f61144f81611bb1565b600061145a30611103565b905060006064600c548361146e91906135b2565b6114789190613623565b905060006064600d548461148c91906135b2565b6114969190613623565b90506114a182612187565b506114ab81612564565b5050505050565b61271081565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b6114ed82610d4a565b6114f681611bb1565b6115008383612642565b505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611563612724565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c99061379e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611641576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116389061379e565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c89061380a565b60405180910390fd5b81600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506117b733600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611bc5565b61180430600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611bc5565b8073ffffffffffffffffffffffffffffffffffffffff167f8ec520a99f1993d01011d73061b0327fb609db775f99d5a7a547d43f4ebf6add60405160405180910390a28173ffffffffffffffffffffffffffffffffffffffff167fdf9875a9a8977fb4b070a90c9f4b1f1b8ac32ef8bce3a97deab2fcf5fb89cd4e60405160405180910390a25050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61191d612724565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361198c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119839061389c565b60405180910390fd5b611995816127a2565b50565b7f744eed60732ef1413c1151b37832d163badcdd4b724806d4c7a318c45ca01a4f6119c281611bb1565b600e60169054906101000a900460ff16611a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0890613908565b60405180910390fd5b6000601984611a209190613928565b14611a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a57906139a5565b60405180910390fd5b6000601983611a6f9190613928565b14611aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa6906139a5565b60405180910390fd5b6107d08211158015611ac357506107d08311155b611b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af990613a11565b60405180910390fd5b8260098190555081600a81905550600a546009547fe5d51dc78edbb1ef2a1acc3ee7dbfec6cc09ea76021321c59a83c84fe52629fa60405160405180910390a3505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611bc281611bbd61263a565b612866565b50565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2b9061379e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9a9061379e565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b60008060019050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9690613a7d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0590613ae9565b60405180910390fd5b60008311611e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4890613b7b565b60405180910390fd5b611e5b85856128eb565b15611eb057600e60149054906101000a900460ff16611eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea690613be7565b60405180910390fd5b5b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611f515750600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611f5b57600090505b82600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611faa919061357e565b92505081905550600081611fbe5783611fdd565b611fdc86611fcc8888612a5f565b611fd68989612b11565b87612bc3565b5b905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461202e9190613c07565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161209291906131da565b60405180910390a36001925050509392505050565b6120b182826112ed565b61218357600180600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061212861263a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006001600e60156101000a81548160ff0219169083151502179055506000600267ffffffffffffffff8111156121c1576121c0613c3b565b5b6040519080825280602002602001820160405280156121ef5781602001602082028036833780820191505090505b509050308160008151811061220757612206613c6a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d29190613cae565b816001815181106122e6576122e5613c6a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146124a9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008430426040518663ffffffff1660e01b815260040161250d959493929190613dd4565b600060405180830381600087803b15801561252757600080fd5b505af115801561253b573d6000803e3d6000fd5b5050505060019150506000600e60156101000a81548160ff021916908315150217905550919050565b600081600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125b5919061357e565b9250508190555081600760008282546125ce919061357e565b92505081905550817fd83c63197e8e676d80ab0122beba9a9d20f3828839e9a1d6fe81d242e9cd7e6e60405160405180910390a26007547f78bcde01236b83f68bca3d0f5cd715abb54a0928720cc01f937d913f88b06fe660405160405180910390a260019050919050565b600033905090565b61264c82826112ed565b156127205760006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506126c561263a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61272c61263a565b73ffffffffffffffffffffffffffffffffffffffff1661274a6112c4565b73ffffffffffffffffffffffffffffffffffffffff16146127a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279790613e7a565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61287082826112ed565b6128e75761287d81612cef565b61288b8360001c6020612d1c565b60405160200161289c929190613f6e565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128de9190613133565b60405180910390fd5b5050565b6000806128f66112c4565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561296457506129346112c4565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b80156129a357506129736112c4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b80156129e257506129b26112c4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b8015612a1b5750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612a5357503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b90508091505092915050565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612b055750600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b90508091505092915050565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612bb75750600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b90508091505092915050565b6000808415612bd6576009549050612be3565b8315612be257600a5490505b5b60008103612bf45782915050612ce7565b60006127108285612c0591906135b2565b612c0f9190613623565b90506000811115612cd65780600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c699190613c07565b925050819055503073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612ccd91906131da565b60405180910390a35b8084612ce2919061357e565b925050505b949350505050565b6060612d158273ffffffffffffffffffffffffffffffffffffffff16601460ff16612d1c565b9050919050565b606060006002836002612d2f91906135b2565b612d399190613c07565b67ffffffffffffffff811115612d5257612d51613c3b565b5b6040519080825280601f01601f191660200182016040528015612d845781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612dbc57612dbb613c6a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612e2057612e1f613c6a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612e6091906135b2565b612e6a9190613c07565b90505b6001811115612f0a577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612eac57612eab613c6a565b5b1a60f81b828281518110612ec357612ec2613c6a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612f0390613fa8565b9050612e6d565b5060008414612f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f459061401d565b60405180910390fd5b8091505092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f9281612f5d565b8114612f9d57600080fd5b50565b600081359050612faf81612f89565b92915050565b600060208284031215612fcb57612fca612f58565b5b6000612fd984828501612fa0565b91505092915050565b60008115159050919050565b612ff781612fe2565b82525050565b60006020820190506130126000830184612fee565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061304382613018565b9050919050565b61305381613038565b811461305e57600080fd5b50565b6000813590506130708161304a565b92915050565b60006020828403121561308c5761308b612f58565b5b600061309a84828501613061565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130dd5780820151818401526020810190506130c2565b60008484015250505050565b6000601f19601f8301169050919050565b6000613105826130a3565b61310f81856130ae565b935061311f8185602086016130bf565b613128816130e9565b840191505092915050565b6000602082019050818103600083015261314d81846130fa565b905092915050565b6000819050919050565b61316881613155565b811461317357600080fd5b50565b6000813590506131858161315f565b92915050565b600080604083850312156131a2576131a1612f58565b5b60006131b085828601613061565b92505060206131c185828601613176565b9150509250929050565b6131d481613155565b82525050565b60006020820190506131ef60008301846131cb565b92915050565b60006020828403121561320b5761320a612f58565b5b600061321984828501613176565b91505092915050565b60008060006060848603121561323b5761323a612f58565b5b600061324986828701613061565b935050602061325a86828701613061565b925050604061326b86828701613176565b9150509250925092565b6000819050919050565b61328881613275565b811461329357600080fd5b50565b6000813590506132a58161327f565b92915050565b6000602082840312156132c1576132c0612f58565b5b60006132cf84828501613296565b91505092915050565b6132e181613275565b82525050565b60006020820190506132fc60008301846132d8565b92915050565b6000806040838503121561331957613318612f58565b5b600061332785828601613296565b925050602061333885828601613061565b9150509250929050565b600060ff82169050919050565b61335881613342565b82525050565b6000602082019050613373600083018461334f565b92915050565b61338281612fe2565b811461338d57600080fd5b50565b60008135905061339f81613379565b92915050565b600080604083850312156133bc576133bb612f58565b5b60006133ca85828601613061565b92505060206133db85828601613390565b9150509250929050565b6133ee81613038565b82525050565b600060208201905061340960008301846133e5565b92915050565b6000819050919050565b600061343461342f61342a84613018565b61340f565b613018565b9050919050565b600061344682613419565b9050919050565b60006134588261343b565b9050919050565b6134688161344d565b82525050565b6000602082019050613483600083018461345f565b92915050565b600080604083850312156134a05761349f612f58565b5b60006134ae85828601613061565b92505060206134bf85828601613061565b9150509250929050565b600080604083850312156134e0576134df612f58565b5b60006134ee85828601613176565b92505060206134ff85828601613176565b9150509250929050565b600081905092915050565b50565b6000613524600083613509565b915061352f82613514565b600082019050919050565b600061354582613517565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061358982613155565b915061359483613155565b92508282039050818111156135ac576135ab61354f565b5b92915050565b60006135bd82613155565b91506135c883613155565b92508282026135d681613155565b915082820484148315176135ed576135ec61354f565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061362e82613155565b915061363983613155565b925082613649576136486135f4565b5b828204905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006136b0602f836130ae565b91506136bb82613654565b604082019050919050565b600060208201905081810360008301526136df816136a3565b9050919050565b7f54726164696e6720616c726561647920656e61626c6564000000000000000000600082015250565b600061371c6017836130ae565b9150613727826136e6565b602082019050919050565b6000602082019050818103600083015261374b8161370f565b9050919050565b7f5a65726f20416464726573730000000000000000000000000000000000000000600082015250565b6000613788600c836130ae565b915061379382613752565b602082019050919050565b600060208201905081810360008301526137b78161377b565b9050919050565b7f53616d6520726f75746572000000000000000000000000000000000000000000600082015250565b60006137f4600b836130ae565b91506137ff826137be565b602082019050919050565b60006020820190508181036000830152613823816137e7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006138866026836130ae565b91506138918261382a565b604082019050919050565b600060208201905081810360008301526138b581613879565b9050919050565b7f5461782063616e6e6f74206265206368616e6765640000000000000000000000600082015250565b60006138f26015836130ae565b91506138fd826138bc565b602082019050919050565b60006020820190508181036000830152613921816138e5565b9050919050565b600061393382613155565b915061393e83613155565b92508261394e5761394d6135f4565b5b828206905092915050565b7f546178206d757374206265206d6f64756c6f2032350000000000000000000000600082015250565b600061398f6015836130ae565b915061399a82613959565b602082019050919050565b600060208201905081810360008301526139be81613982565b9050919050565b7f546178206f7574206f6620626f756e6473000000000000000000000000000000600082015250565b60006139fb6011836130ae565b9150613a06826139c5565b602082019050919050565b60006020820190508181036000830152613a2a816139ee565b9050919050565b7f5472616e7366657220746f20746865207a65726f206164647265737300000000600082015250565b6000613a67601c836130ae565b9150613a7282613a31565b602082019050919050565b60006020820190508181036000830152613a9681613a5a565b9050919050565b7f5472616e736665722066726f6d20746865207a65726f20616464726573730000600082015250565b6000613ad3601e836130ae565b9150613ade82613a9d565b602082019050919050565b60006020820190508181036000830152613b0281613ac6565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000613b656029836130ae565b9150613b7082613b09565b604082019050919050565b60006020820190508181036000830152613b9481613b58565b9050919050565b7f54726164696e67206973206e6f7420656e61626c656400000000000000000000600082015250565b6000613bd16016836130ae565b9150613bdc82613b9b565b602082019050919050565b60006020820190508181036000830152613c0081613bc4565b9050919050565b6000613c1282613155565b9150613c1d83613155565b9250828201905080821115613c3557613c3461354f565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050613ca88161304a565b92915050565b600060208284031215613cc457613cc3612f58565b5b6000613cd284828501613c99565b91505092915050565b6000819050919050565b6000613d00613cfb613cf684613cdb565b61340f565b613155565b9050919050565b613d1081613ce5565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d4b81613038565b82525050565b6000613d5d8383613d42565b60208301905092915050565b6000602082019050919050565b6000613d8182613d16565b613d8b8185613d21565b9350613d9683613d32565b8060005b83811015613dc7578151613dae8882613d51565b9750613db983613d69565b925050600181019050613d9a565b5085935050505092915050565b600060a082019050613de960008301886131cb565b613df66020830187613d07565b8181036040830152613e088186613d76565b9050613e1760608301856133e5565b613e2460808301846131cb565b9695505050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e646020836130ae565b9150613e6f82613e2e565b602082019050919050565b60006020820190508181036000830152613e9381613e57565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613edb601783613e9a565b9150613ee682613ea5565b601782019050919050565b6000613efc826130a3565b613f068185613e9a565b9350613f168185602086016130bf565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613f58601183613e9a565b9150613f6382613f22565b601182019050919050565b6000613f7982613ece565b9150613f858285613ef1565b9150613f9082613f4b565b9150613f9c8284613ef1565b91508190509392505050565b6000613fb382613155565b915060008203613fc657613fc561354f565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006140076020836130ae565b915061401282613fd1565b602082019050919050565b6000602082019050818103600083015261403681613ffa565b905091905056fea2646970667358221220c72fdd07ee370b5b65dba5e8fa8f972102d1961caa902c27a7773025f726783064736f6c63430008130033

Deployed Bytecode

0x6080604052600436106102555760003560e01c8063715018a611610139578063a9059cbb116100b6578063d547741f1161007a578063d547741f14610877578063db7bb2cc146108a0578063dc40e2d0146108dd578063dd62ed3e14610906578063f2fde38b14610943578063fe2314d61461096c5761025c565b8063a9059cbb146107a2578063b261c65b146107df578063b361b2b5146107f6578063c31c9c0714610821578063cc1776d31461084c5761025c565b80638da5cb5b116100fd5780638da5cb5b146106bb57806391d14854146106e657806395d89b41146107235780639d0014b11461074e578063a217fddf146107775761025c565b8063715018a61461062257806378648edf146106395780638785048414610650578063893d20e8146106795780638a8c523c146106a45761025c565b80632f2ff15d116101d25780634b2ba0dd116101965780634b2ba0dd146105125780634f7041a51461053d5780635bd3ae0d146105685780635c8cb212146105935780636f10edd5146105bc57806370a08231146105e55761025c565b80632f2ff15d14610453578063304d65171461047c578063313ce5671461049357806336568abe146104be5780633eaaf86b146104e75761025c565b806318160ddd1161021957806318160ddd1461035a5780631a6059af1461038557806323b872dd146103ae578063248a9ca3146103eb5780632be63d9a146104285761025c565b806301ffc9a7146102615780630228c19c1461029e578063064a59d0146102c757806306fdde03146102f2578063095ea7b31461031d5761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190612fb5565b610995565b6040516102959190612ffd565b60405180910390f35b3480156102aa57600080fd5b506102c560048036038101906102c09190613076565b610a0f565b005b3480156102d357600080fd5b506102dc610ad8565b6040516102e99190612ffd565b60405180910390f35b3480156102fe57600080fd5b50610307610aeb565b6040516103149190613133565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f919061318b565b610b28565b6040516103519190612ffd565b60405180910390f35b34801561036657600080fd5b5061036f610b3f565b60405161037c91906131da565b60405180910390f35b34801561039157600080fd5b506103ac60048036038101906103a791906131f5565b610b49565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190613222565b610bfd565b6040516103e29190612ffd565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d91906132ab565b610d4a565b60405161041f91906132e7565b60405180910390f35b34801561043457600080fd5b5061043d610d6a565b60405161044a9190612ffd565b60405180910390f35b34801561045f57600080fd5b5061047a60048036038101906104759190613302565b610d7d565b005b34801561048857600080fd5b50610491610d9e565b005b34801561049f57600080fd5b506104a8610e0a565b6040516104b5919061335e565b60405180910390f35b3480156104ca57600080fd5b506104e560048036038101906104e09190613302565b610e13565b005b3480156104f357600080fd5b506104fc610e96565b60405161050991906131da565b60405180910390f35b34801561051e57600080fd5b50610527610e9c565b60405161053491906131da565b60405180910390f35b34801561054957600080fd5b50610552610ea2565b60405161055f91906131da565b60405180910390f35b34801561057457600080fd5b5061057d610ea8565b60405161058a91906132e7565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b591906133a5565b610ecc565b005b3480156105c857600080fd5b506105e360048036038101906105de9190613076565b610fa0565b005b3480156105f157600080fd5b5061060c60048036038101906106079190613076565b611103565b60405161061991906131da565b60405180910390f35b34801561062e57600080fd5b5061063761114c565b005b34801561064557600080fd5b5061064e611160565b005b34801561065c57600080fd5b5061067760048036038101906106729190613076565b611185565b005b34801561068557600080fd5b5061068e611214565b60405161069b91906133f4565b60405180910390f35b3480156106b057600080fd5b506106b9611223565b005b3480156106c757600080fd5b506106d06112c4565b6040516106dd91906133f4565b60405180910390f35b3480156106f257600080fd5b5061070d60048036038101906107089190613302565b6112ed565b60405161071a9190612ffd565b60405180910390f35b34801561072f57600080fd5b50610738611358565b6040516107459190613133565b60405180910390f35b34801561075a57600080fd5b50610775600480360381019061077091906131f5565b611395565b005b34801561078357600080fd5b5061078c611406565b60405161079991906132e7565b60405180910390f35b3480156107ae57600080fd5b506107c960048036038101906107c4919061318b565b61140d565b6040516107d69190612ffd565b60405180910390f35b3480156107eb57600080fd5b506107f4611425565b005b34801561080257600080fd5b5061080b6114b2565b60405161081891906131da565b60405180910390f35b34801561082d57600080fd5b506108366114b8565b604051610843919061346e565b60405180910390f35b34801561085857600080fd5b506108616114de565b60405161086e91906131da565b60405180910390f35b34801561088357600080fd5b5061089e60048036038101906108999190613302565b6114e4565b005b3480156108ac57600080fd5b506108c760048036038101906108c29190613076565b611505565b6040516108d49190612ffd565b60405180910390f35b3480156108e957600080fd5b5061090460048036038101906108ff9190613489565b61155b565b005b34801561091257600080fd5b5061092d60048036038101906109289190613489565b61188e565b60405161093a91906131da565b60405180910390f35b34801561094f57600080fd5b5061096a60048036038101906109659190613076565b611915565b005b34801561097857600080fd5b50610993600480360381019061098e91906134c9565b611998565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a085750610a0782611b47565b5b9050919050565b7f744eed60732ef1413c1151b37832d163badcdd4b724806d4c7a318c45ca01a4f610a3981611bb1565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f8fd3ac7b1965dbfd2523994c41ccdd0be4fb0f0d784120b6be2c60e98aaccd4260405160405180910390a25050565b600e60149054906101000a900460ff1681565b60606040518060400160405280600581526020017f4d4f4e4559000000000000000000000000000000000000000000000000000000815250905090565b6000610b35338484611bc5565b6001905092915050565b6000600754905090565b60008047905060008303610b5d576188b892505b6000811115610bf857600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16818490604051610bae9061353a565b600060405180830381858888f193505050503d8060008114610bec576040519150601f19603f3d011682016040523d82523d6000602084013e610bf1565b606091505b5050809250505b505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610d365781600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d2e919061357e565b925050819055505b610d41848484611d29565b90509392505050565b600060016000838152602001908152602001600020600101549050919050565b600e60169054906101000a900460ff1681565b610d8682610d4a565b610d8f81611bb1565b610d9983836120a7565b505050565b6000610da930611103565b905060006064600c5483610dbd91906135b2565b610dc79190613623565b905060006064600d5484610ddb91906135b2565b610de59190613623565b90506006548310610e0557610df982612187565b50610e0381612564565b505b505050565b60006012905090565b610e1b61263a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7f906136c6565b60405180910390fd5b610e928282612642565b5050565b60075481565b60085481565b60095481565b7f744eed60732ef1413c1151b37832d163badcdd4b724806d4c7a318c45ca01a4f81565b7f744eed60732ef1413c1151b37832d163badcdd4b724806d4c7a318c45ca01a4f610ef681611bb1565b81600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167f9df45066c8b10cc4a20907c92f2ac2868b48bd065fca3f306df692ca09d74e6e83604051610f939190612ffd565b60405180910390a2505050565b7f744eed60732ef1413c1151b37832d163badcdd4b724806d4c7a318c45ca01a4f610fca81611bb1565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061106f33600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611bc5565b6110bc30600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611bc5565b8173ffffffffffffffffffffffffffffffffffffffff167f8ec520a99f1993d01011d73061b0327fb609db775f99d5a7a547d43f4ebf6add60405160405180910390a25050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611154612724565b61115e60006127a2565b565b611168612724565b6000600e60166101000a81548160ff021916908315150217905550565b61118d612724565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f63b16bbf1d7e61525c0baf8e81c29e50caaea89e39a4f2ecf7bf0ad48c9c283a60405160405180910390a250565b600061121e6112c4565b905090565b61122b612724565b600e60149054906101000a900460ff161561127b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127290613732565b60405180910390fd5b6001600e60146101000a81548160ff0219169083151502179055507f1d97b7cdf6b6f3405cbe398b69512e5419a0ce78232b6e9c6ffbf1466774bd8d60405160405180910390a1565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606040518060400160405280600581526020017f4d4f4e4559000000000000000000000000000000000000000000000000000000815250905090565b7f744eed60732ef1413c1151b37832d163badcdd4b724806d4c7a318c45ca01a4f6113bf81611bb1565b816007546113cd9190613623565b6006819055506006547f9947ac58e204d2da07b9748298663b3b77da7fb0638201d778987ded7c90fbaa60405160405180910390a25050565b6000801b81565b600061141a338484611d29565b506001905092915050565b7f744eed60732ef1413c1151b37832d163badcdd4b724806d4c7a318c45ca01a4f61144f81611bb1565b600061145a30611103565b905060006064600c548361146e91906135b2565b6114789190613623565b905060006064600d548461148c91906135b2565b6114969190613623565b90506114a182612187565b506114ab81612564565b5050505050565b61271081565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b6114ed82610d4a565b6114f681611bb1565b6115008383612642565b505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611563612724565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c99061379e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611641576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116389061379e565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c89061380a565b60405180910390fd5b81600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506117b733600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611bc5565b61180430600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611bc5565b8073ffffffffffffffffffffffffffffffffffffffff167f8ec520a99f1993d01011d73061b0327fb609db775f99d5a7a547d43f4ebf6add60405160405180910390a28173ffffffffffffffffffffffffffffffffffffffff167fdf9875a9a8977fb4b070a90c9f4b1f1b8ac32ef8bce3a97deab2fcf5fb89cd4e60405160405180910390a25050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61191d612724565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361198c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119839061389c565b60405180910390fd5b611995816127a2565b50565b7f744eed60732ef1413c1151b37832d163badcdd4b724806d4c7a318c45ca01a4f6119c281611bb1565b600e60169054906101000a900460ff16611a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0890613908565b60405180910390fd5b6000601984611a209190613928565b14611a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a57906139a5565b60405180910390fd5b6000601983611a6f9190613928565b14611aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa6906139a5565b60405180910390fd5b6107d08211158015611ac357506107d08311155b611b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af990613a11565b60405180910390fd5b8260098190555081600a81905550600a546009547fe5d51dc78edbb1ef2a1acc3ee7dbfec6cc09ea76021321c59a83c84fe52629fa60405160405180910390a3505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611bc281611bbd61263a565b612866565b50565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2b9061379e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9a9061379e565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b60008060019050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9690613a7d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0590613ae9565b60405180910390fd5b60008311611e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4890613b7b565b60405180910390fd5b611e5b85856128eb565b15611eb057600e60149054906101000a900460ff16611eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea690613be7565b60405180910390fd5b5b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611f515750600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611f5b57600090505b82600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611faa919061357e565b92505081905550600081611fbe5783611fdd565b611fdc86611fcc8888612a5f565b611fd68989612b11565b87612bc3565b5b905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461202e9190613c07565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161209291906131da565b60405180910390a36001925050509392505050565b6120b182826112ed565b61218357600180600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061212861263a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006001600e60156101000a81548160ff0219169083151502179055506000600267ffffffffffffffff8111156121c1576121c0613c3b565b5b6040519080825280602002602001820160405280156121ef5781602001602082028036833780820191505090505b509050308160008151811061220757612206613c6a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d29190613cae565b816001815181106122e6576122e5613c6a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146124a9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008430426040518663ffffffff1660e01b815260040161250d959493929190613dd4565b600060405180830381600087803b15801561252757600080fd5b505af115801561253b573d6000803e3d6000fd5b5050505060019150506000600e60156101000a81548160ff021916908315150217905550919050565b600081600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125b5919061357e565b9250508190555081600760008282546125ce919061357e565b92505081905550817fd83c63197e8e676d80ab0122beba9a9d20f3828839e9a1d6fe81d242e9cd7e6e60405160405180910390a26007547f78bcde01236b83f68bca3d0f5cd715abb54a0928720cc01f937d913f88b06fe660405160405180910390a260019050919050565b600033905090565b61264c82826112ed565b156127205760006001600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506126c561263a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61272c61263a565b73ffffffffffffffffffffffffffffffffffffffff1661274a6112c4565b73ffffffffffffffffffffffffffffffffffffffff16146127a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279790613e7a565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61287082826112ed565b6128e75761287d81612cef565b61288b8360001c6020612d1c565b60405160200161289c929190613f6e565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128de9190613133565b60405180910390fd5b5050565b6000806128f66112c4565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561296457506129346112c4565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b80156129a357506129736112c4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b80156129e257506129b26112c4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b8015612a1b5750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612a5357503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b90508091505092915050565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612b055750600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b90508091505092915050565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612bb75750600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b90508091505092915050565b6000808415612bd6576009549050612be3565b8315612be257600a5490505b5b60008103612bf45782915050612ce7565b60006127108285612c0591906135b2565b612c0f9190613623565b90506000811115612cd65780600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c699190613c07565b925050819055503073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612ccd91906131da565b60405180910390a35b8084612ce2919061357e565b925050505b949350505050565b6060612d158273ffffffffffffffffffffffffffffffffffffffff16601460ff16612d1c565b9050919050565b606060006002836002612d2f91906135b2565b612d399190613c07565b67ffffffffffffffff811115612d5257612d51613c3b565b5b6040519080825280601f01601f191660200182016040528015612d845781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612dbc57612dbb613c6a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612e2057612e1f613c6a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612e6091906135b2565b612e6a9190613c07565b90505b6001811115612f0a577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612eac57612eab613c6a565b5b1a60f81b828281518110612ec357612ec2613c6a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612f0390613fa8565b9050612e6d565b5060008414612f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f459061401d565b60405180910390fd5b8091505092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f9281612f5d565b8114612f9d57600080fd5b50565b600081359050612faf81612f89565b92915050565b600060208284031215612fcb57612fca612f58565b5b6000612fd984828501612fa0565b91505092915050565b60008115159050919050565b612ff781612fe2565b82525050565b60006020820190506130126000830184612fee565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061304382613018565b9050919050565b61305381613038565b811461305e57600080fd5b50565b6000813590506130708161304a565b92915050565b60006020828403121561308c5761308b612f58565b5b600061309a84828501613061565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130dd5780820151818401526020810190506130c2565b60008484015250505050565b6000601f19601f8301169050919050565b6000613105826130a3565b61310f81856130ae565b935061311f8185602086016130bf565b613128816130e9565b840191505092915050565b6000602082019050818103600083015261314d81846130fa565b905092915050565b6000819050919050565b61316881613155565b811461317357600080fd5b50565b6000813590506131858161315f565b92915050565b600080604083850312156131a2576131a1612f58565b5b60006131b085828601613061565b92505060206131c185828601613176565b9150509250929050565b6131d481613155565b82525050565b60006020820190506131ef60008301846131cb565b92915050565b60006020828403121561320b5761320a612f58565b5b600061321984828501613176565b91505092915050565b60008060006060848603121561323b5761323a612f58565b5b600061324986828701613061565b935050602061325a86828701613061565b925050604061326b86828701613176565b9150509250925092565b6000819050919050565b61328881613275565b811461329357600080fd5b50565b6000813590506132a58161327f565b92915050565b6000602082840312156132c1576132c0612f58565b5b60006132cf84828501613296565b91505092915050565b6132e181613275565b82525050565b60006020820190506132fc60008301846132d8565b92915050565b6000806040838503121561331957613318612f58565b5b600061332785828601613296565b925050602061333885828601613061565b9150509250929050565b600060ff82169050919050565b61335881613342565b82525050565b6000602082019050613373600083018461334f565b92915050565b61338281612fe2565b811461338d57600080fd5b50565b60008135905061339f81613379565b92915050565b600080604083850312156133bc576133bb612f58565b5b60006133ca85828601613061565b92505060206133db85828601613390565b9150509250929050565b6133ee81613038565b82525050565b600060208201905061340960008301846133e5565b92915050565b6000819050919050565b600061343461342f61342a84613018565b61340f565b613018565b9050919050565b600061344682613419565b9050919050565b60006134588261343b565b9050919050565b6134688161344d565b82525050565b6000602082019050613483600083018461345f565b92915050565b600080604083850312156134a05761349f612f58565b5b60006134ae85828601613061565b92505060206134bf85828601613061565b9150509250929050565b600080604083850312156134e0576134df612f58565b5b60006134ee85828601613176565b92505060206134ff85828601613176565b9150509250929050565b600081905092915050565b50565b6000613524600083613509565b915061352f82613514565b600082019050919050565b600061354582613517565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061358982613155565b915061359483613155565b92508282039050818111156135ac576135ab61354f565b5b92915050565b60006135bd82613155565b91506135c883613155565b92508282026135d681613155565b915082820484148315176135ed576135ec61354f565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061362e82613155565b915061363983613155565b925082613649576136486135f4565b5b828204905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006136b0602f836130ae565b91506136bb82613654565b604082019050919050565b600060208201905081810360008301526136df816136a3565b9050919050565b7f54726164696e6720616c726561647920656e61626c6564000000000000000000600082015250565b600061371c6017836130ae565b9150613727826136e6565b602082019050919050565b6000602082019050818103600083015261374b8161370f565b9050919050565b7f5a65726f20416464726573730000000000000000000000000000000000000000600082015250565b6000613788600c836130ae565b915061379382613752565b602082019050919050565b600060208201905081810360008301526137b78161377b565b9050919050565b7f53616d6520726f75746572000000000000000000000000000000000000000000600082015250565b60006137f4600b836130ae565b91506137ff826137be565b602082019050919050565b60006020820190508181036000830152613823816137e7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006138866026836130ae565b91506138918261382a565b604082019050919050565b600060208201905081810360008301526138b581613879565b9050919050565b7f5461782063616e6e6f74206265206368616e6765640000000000000000000000600082015250565b60006138f26015836130ae565b91506138fd826138bc565b602082019050919050565b60006020820190508181036000830152613921816138e5565b9050919050565b600061393382613155565b915061393e83613155565b92508261394e5761394d6135f4565b5b828206905092915050565b7f546178206d757374206265206d6f64756c6f2032350000000000000000000000600082015250565b600061398f6015836130ae565b915061399a82613959565b602082019050919050565b600060208201905081810360008301526139be81613982565b9050919050565b7f546178206f7574206f6620626f756e6473000000000000000000000000000000600082015250565b60006139fb6011836130ae565b9150613a06826139c5565b602082019050919050565b60006020820190508181036000830152613a2a816139ee565b9050919050565b7f5472616e7366657220746f20746865207a65726f206164647265737300000000600082015250565b6000613a67601c836130ae565b9150613a7282613a31565b602082019050919050565b60006020820190508181036000830152613a9681613a5a565b9050919050565b7f5472616e736665722066726f6d20746865207a65726f20616464726573730000600082015250565b6000613ad3601e836130ae565b9150613ade82613a9d565b602082019050919050565b60006020820190508181036000830152613b0281613ac6565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000613b656029836130ae565b9150613b7082613b09565b604082019050919050565b60006020820190508181036000830152613b9481613b58565b9050919050565b7f54726164696e67206973206e6f7420656e61626c656400000000000000000000600082015250565b6000613bd16016836130ae565b9150613bdc82613b9b565b602082019050919050565b60006020820190508181036000830152613c0081613bc4565b9050919050565b6000613c1282613155565b9150613c1d83613155565b9250828201905080821115613c3557613c3461354f565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050613ca88161304a565b92915050565b600060208284031215613cc457613cc3612f58565b5b6000613cd284828501613c99565b91505092915050565b6000819050919050565b6000613d00613cfb613cf684613cdb565b61340f565b613155565b9050919050565b613d1081613ce5565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d4b81613038565b82525050565b6000613d5d8383613d42565b60208301905092915050565b6000602082019050919050565b6000613d8182613d16565b613d8b8185613d21565b9350613d9683613d32565b8060005b83811015613dc7578151613dae8882613d51565b9750613db983613d69565b925050600181019050613d9a565b5085935050505092915050565b600060a082019050613de960008301886131cb565b613df66020830187613d07565b8181036040830152613e088186613d76565b9050613e1760608301856133e5565b613e2460808301846131cb565b9695505050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e646020836130ae565b9150613e6f82613e2e565b602082019050919050565b60006020820190508181036000830152613e9381613e57565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613edb601783613e9a565b9150613ee682613ea5565b601782019050919050565b6000613efc826130a3565b613f068185613e9a565b9350613f168185602086016130bf565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613f58601183613e9a565b9150613f6382613f22565b601182019050919050565b6000613f7982613ece565b9150613f858285613ef1565b9150613f9082613f4b565b9150613f9c8284613ef1565b91508190509392505050565b6000613fb382613155565b915060008203613fc657613fc561354f565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006140076020836130ae565b915061401282613fd1565b602082019050919050565b6000602082019050818103600083015261403681613ffa565b905091905056fea2646970667358221220c72fdd07ee370b5b65dba5e8fa8f972102d1961caa902c27a7773025f726783064736f6c63430008130033

Deployed Bytecode Sourcemap

40534:11007:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28751:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46849:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42342:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40968:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44680:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40668:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50917:375;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45162:338;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30574:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42403:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31015:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50101:398;;;;;;;;;;;;;:::i;:::-;;40778:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32159:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41739:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41800:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41851:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40599:60;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45628:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46553:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41333:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36296:103;;;;;;;;;;;;;:::i;:::-;;43573:79;;;;;;;;;;;;;:::i;:::-;;47902:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41061:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49834:181;;;;;;;;;;;;;:::i;:::-;;35655:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29047:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40871:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44268:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28152:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44482:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50567:342;;;;;;;;;;;;;:::i;:::-;;41920:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42170:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41885:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31455:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45508:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43660:600;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41154:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36554:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49343:483;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28751:204;28836:4;28875:32;28860:47;;;:11;:47;;;;:87;;;;28911:36;28935:11;28911:23;:36::i;:::-;28860:87;28853:94;;28751:204;;;:::o;46849:165::-;40636:23;28643:16;28654:4;28643:10;:16::i;:::-;46959:5:::1;46934:8;:22;46943:12;46934:22;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;46993:12;46980:26;;;;;;;;;;;;46849:165:::0;;:::o;42342:28::-;;;;;;;;;;;;;:::o;40968:85::-;41007:13;41040:5;;;;;;;;;;;;;;;;;41033:12;;40968:85;:::o;44680:186::-;44782:4;44799:37;44808:10;44820:7;44829:6;44799:8;:37::i;:::-;44854:4;44847:11;;44680:186;;;;:::o;40668:102::-;40723:7;40750:12;;40743:19;;40668:102;:::o;50917:375::-;50982:12;51005:17;51025:21;51005:41;;51074:1;51061:9;:14;51057:64;;51104:5;51092:17;;51057:64;51147:1;51135:9;:13;51131:153;;;51177:15;;;;;;;;;;;:20;;51223:9;51256;51177:107;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51163:121;;;;;51131:153;50971:321;;50917:375;:::o;45162:338::-;45296:4;45351:17;45317:10;:18;45328:6;45317:18;;;;;;;;;;;;;;;:30;45336:10;45317:30;;;;;;;;;;;;;;;;:51;45313:124;;45419:6;45385:10;:18;45396:6;45385:18;;;;;;;;;;;;;;;:30;45404:10;45385:30;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;45313:124;45456:36;45466:6;45474:9;45485:6;45456:9;:36::i;:::-;45449:43;;45162:338;;;;;:::o;30574:131::-;30648:7;30675:6;:12;30682:4;30675:12;;;;;;;;;;;:22;;;30668:29;;30574:131;;;:::o;42403:31::-;;;;;;;;;;;;;:::o;31015:147::-;31098:18;31111:4;31098:12;:18::i;:::-;28643:16;28654:4;28643:10;:16::i;:::-;31129:25:::1;31140:4;31146:7;31129:10;:25::i;:::-;31015:147:::0;;;:::o;50101:398::-;50148:28;50179:24;50197:4;50179:9;:24::i;:::-;50148:55;;50214:17;50275:3;50258:13;;50235:20;:36;;;;:::i;:::-;50234:44;;;;:::i;:::-;50214:64;;50289:18;50352:3;50334:14;;50311:20;:37;;;;:::i;:::-;50310:45;;;;:::i;:::-;50289:66;;50394:13;;50370:20;:37;50366:126;;50424:24;50438:9;50424:13;:24::i;:::-;;50463:17;50469:10;50463:5;:17::i;:::-;;50366:126;50137:362;;;50101:398::o;40778:85::-;40821:5;42333:2;40839:16;;40778:85;:::o;32159:218::-;32266:12;:10;:12::i;:::-;32255:23;;:7;:23;;;32247:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;32343:26;32355:4;32361:7;32343:11;:26::i;:::-;32159:218;;:::o;41739:54::-;;;;:::o;41800:44::-;;;;:::o;41851:27::-;;;;:::o;40599:60::-;40636:23;40599:60;:::o;45628:206::-;40636:23;28643:16;28654:4;28643:10;:16::i;:::-;45767:7:::1;45748;:16;45756:7;45748:16;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;45809:7;45790:36;;;45818:7;45790:36;;;;;;:::i;:::-;;;;;;;;45628:206:::0;;;:::o;46553:288::-;40636:23;28643:16;28654:4;28643:10;:16::i;:::-;46650:4:::1;46630:8;:17;46639:7;46630:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;46665:60;46674:10;46694;;;;;;;;;;;46707:17;46665:8;:60::i;:::-;46736:63;46753:4;46768:10;;;;;;;;;;;46781:17;46736:8;:63::i;:::-;46825:7;46815:18;;;;;;;;;;;;46553:288:::0;;:::o;41333:117::-;41399:7;41426;:16;41434:7;41426:16;;;;;;;;;;;;;;;;41419:23;;41333:117;;;:::o;36296:103::-;35541:13;:11;:13::i;:::-;36361:30:::1;36388:1;36361:18;:30::i;:::-;36296:103::o:0;43573:79::-;35541:13;:11;:13::i;:::-;43639:5:::1;43624:12;;:20;;;;;;;;;;;;;;;;;;43573:79::o:0;47902:175::-;35541:13;:11;:13::i;:::-;48009:10:::1;47983:15;;:37;;;;;;;;;;;;;;;;;;48058:10;48036:33;;;;;;;;;;;;47902:175:::0;:::o;41061:85::-;41104:7;41131;:5;:7::i;:::-;41124:14;;41061:85;:::o;49834:181::-;35541:13;:11;:13::i;:::-;49898:16:::1;;;;;;;;;;;49897:17;49889:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;49972:4;49953:16;;:23;;;;;;;;;;;;;;;;;;49992:15;;;;;;;;;;49834:181::o:0;35655:87::-;35701:7;35728:6;;;;;;;;;;;35721:13;;35655:87;:::o;29047:147::-;29133:4;29157:6;:12;29164:4;29157:12;;;;;;;;;;;:20;;:29;29178:7;29157:29;;;;;;;;;;;;;;;;;;;;;;;;;29150:36;;29047:147;;;;:::o;40871:89::-;40912:13;40945:7;;;;;;;;;;;;;;;;;40938:14;;40871:89;:::o;44268:206::-;40636:23;28643:16;28654:4;28643:10;:16::i;:::-;44406:14:::1;44391:12;;:29;;;;:::i;:::-;44375:13;:45;;;;44452:13;;44436:30;;;;;;;;;;44268:206:::0;;:::o;28152:49::-;28197:4;28152:49;;;:::o;44482:190::-;44585:4;44602:40;44612:10;44624:9;44635:6;44602:9;:40::i;:::-;;44660:4;44653:11;;44482:190;;;;:::o;50567:342::-;40636:23;28643:16;28654:4;28643:10;:16::i;:::-;50631:28:::1;50662:24;50680:4;50662:9;:24::i;:::-;50631:55;;50697:17;50758:3;50741:13;;50718:20;:36;;;;:::i;:::-;50717:44;;;;:::i;:::-;50697:64;;50772:18;50835:3;50817:14;;50794:20;:37;;;;:::i;:::-;50793:45;;;;:::i;:::-;50772:66;;50849:24;50863:9;50849:13;:24::i;:::-;;50884:17;50890:10;50884:5;:17::i;:::-;;50620:289;;;50567:342:::0;:::o;41920:47::-;41961:6;41920:47;:::o;42170:27::-;;;;;;;;;;;;;:::o;41885:28::-;;;;:::o;31455:149::-;31539:18;31552:4;31539:12;:18::i;:::-;28643:16;28654:4;28643:10;:16::i;:::-;31570:26:::1;31582:4;31588:7;31570:11;:26::i;:::-;31455:149:::0;;;:::o;45508:112::-;45572:4;45596:7;:16;45604:7;45596:16;;;;;;;;;;;;;;;;;;;;;;;;;45589:23;;45508:112;;;:::o;43660:600::-;35541:13;:11;:13::i;:::-;43805:1:::1;43784:23;;:9;:23;;::::0;43776:48:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;43864:1;43843:23;;:9;:23;;::::0;43835:48:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;43923:10;;;;;;;;;;;43902:32;;:9;:32;;::::0;43894:56:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;43984:9;43961:10;;:33;;;;;;;;;;;;;;;;;;44027:4;44005:8;:19;44014:9;44005:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;44042:60;44051:10;44071;;;;;;;;;;;44084:17;44042:8;:60::i;:::-;44113:63;44130:4;44145:10;;;;;;;;;;;44158:17;44113:8;:63::i;:::-;44202:9;44192:20;;;;;;;;;;;;44242:9;44228:24;;;;;;;;;;;;43660:600:::0;;:::o;41154:171::-;41263:7;41290:10;:18;41301:6;41290:18;;;;;;;;;;;;;;;:27;41309:7;41290:27;;;;;;;;;;;;;;;;41283:34;;41154:171;;;;:::o;36554:201::-;35541:13;:11;:13::i;:::-;36663:1:::1;36643:22;;:8;:22;;::::0;36635:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36719:28;36738:8;36719:18;:28::i;:::-;36554:201:::0;:::o;49343:483::-;40636:23;28643:16;28654:4;28643:10;:16::i;:::-;49473:12:::1;;;;;;;;;;;49465:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;49546:1;49540:2;49530:7;:12;;;;:::i;:::-;:17;49522:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;49609:1;49603:2;49592:8;:13;;;;:::i;:::-;:18;49584:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;49668:4;49656:8;:16;;49655:39;;;;;49689:4;49678:7;:15;;49655:39;49647:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;49738:7;49729:6;:16;;;;49766:8;49756:7;:18;;;;49810:7;;49802:6;;49790:28;;;;;;;;;;49343:483:::0;;;:::o;1782:157::-;1867:4;1906:25;1891:40;;;:11;:40;;;;1884:47;;1782:157;;;:::o;29498:105::-;29565:30;29576:4;29582:12;:10;:12::i;:::-;29565:10;:30::i;:::-;29498:105;:::o;44874:280::-;45021:1;45003:20;;:6;:20;;;44995:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;45078:1;45059:21;;:7;:21;;;45051:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;45140:6;45110:10;:18;45121:6;45110:18;;;;;;;;;;;;;;;:27;45129:7;45110:27;;;;;;;;;;;;;;;:36;;;;44874:280;;;:::o;47022:872::-;47135:4;47152:12;47167:4;47152:19;;47204:1;47190:16;;:2;:16;;;47182:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;47274:1;47258:18;;:4;:18;;;47250:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47339:1;47330:6;:10;47322:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;47403:26;47420:4;47426:2;47403:16;:26::i;:::-;47399:110;;;47454:16;;;;;;;;;;;47446:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;47399:110;47525:7;:13;47533:4;47525:13;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;;47542:7;:11;47550:2;47542:11;;;;;;;;;;;;;;;;;;;;;;;;;47525:28;47521:76;;;47580:5;47570:15;;47521:76;47624:6;47607:7;:13;47615:4;47607:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;47641:22;47667:7;47666:106;;47766:6;47666:106;;;47691:59;47702:4;47708:15;47714:4;47720:2;47708:5;:15::i;:::-;47725:16;47732:4;47738:2;47725:6;:16::i;:::-;47743:6;47691:10;:59::i;:::-;47666:106;47641:131;;47798:14;47783:7;:11;47791:2;47783:11;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;47843:2;47828:34;;47837:4;47828:34;;;47847:14;47828:34;;;;;;:::i;:::-;;;;;;;;47882:4;47875:11;;;;47022:872;;;;;:::o;33756:238::-;33840:22;33848:4;33854:7;33840;:22::i;:::-;33835:152;;33911:4;33879:6;:12;33886:4;33879:12;;;;;;;;;;;:20;;:29;33900:7;33879:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;33962:12;:10;:12::i;:::-;33935:40;;33953:7;33935:40;;33947:4;33935:40;;;;;;;;;;33835:152;33756:238;;:::o;48634:658::-;48724:4;42485;42476:6;;:13;;;;;;;;;;;;;;;;;;48741:21:::1;48779:1;48765:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48741:40;;48810:4;48792;48797:1;48792:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;48836:10;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48826:4;48831:1;48826:7;;;;;;;;:::i;:::-;;;;;;;:27;;;;;;;;;::::0;::::1;48934:17;48884:10;:25;48903:4;48884:25;;;;;;;;;;;;;;;:46;48918:10;;;;;;;;;;;48884:46;;;;;;;;;;;;;;;;:67;48866:190;;49027:17;48978:10;:25;48997:4;48978:25;;;;;;;;;;;;;;;:46;49012:10;;;;;;;;;;;48978:46;;;;;;;;;;;;;;;:66;;;;48866:190;49068:10;;;;;;;;;;;:61;;;49144:12;49171:1;49187:4;49214;49234:15;49068:192;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49280:4;49273:11;;;42521:5:::0;42512:6;;:14;;;;;;;;;;;;;;;;;;48634:658;;;:::o;51300:238::-;51349:4;51392:6;51366:7;:22;51382:4;51366:22;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;51425:6;51409:12;;:22;;;;;;;:::i;:::-;;;;;;;;51454:6;51447:14;;;;;;;;;;51495:12;;51477:31;;;;;;;;;;51526:4;51519:11;;51300:238;;;:::o;25833:98::-;25886:7;25913:10;25906:17;;25833:98;:::o;34174:239::-;34258:22;34266:4;34272:7;34258;:22::i;:::-;34254:152;;;34329:5;34297:6;:12;34304:4;34297:12;;;;;;;;;;;:20;;:29;34318:7;34297:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;34381:12;:10;:12::i;:::-;34354:40;;34372:7;34354:40;;34366:4;34354:40;;;;;;;;;;34254:152;34174:239;;:::o;35820:132::-;35895:12;:10;:12::i;:::-;35884:23;;:7;:5;:7::i;:::-;:23;;;35876:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35820:132::o;36915:191::-;36989:16;37008:6;;;;;;;;;;;36989:25;;37034:8;37025:6;;:17;;;;;;;;;;;;;;;;;;37089:8;37058:40;;37079:8;37058:40;;;;;;;;;;;;36978:128;36915:191;:::o;29893:492::-;29982:22;29990:4;29996:7;29982;:22::i;:::-;29977:401;;30170:28;30190:7;30170:19;:28::i;:::-;30271:38;30299:4;30291:13;;30306:2;30271:19;:38::i;:::-;30075:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30021:345;;;;;;;;;;;:::i;:::-;;;;;;;;29977:401;29893:492;;:::o;45842:364::-;45943:4;45960:14;45984:7;:5;:7::i;:::-;45977:14;;:3;:14;;;;:46;;;;;46016:7;:5;:7::i;:::-;46008:15;;:4;:15;;;;45977:46;:83;;;;;46053:7;:5;:7::i;:::-;46040:20;;:9;:20;;;;45977:83;:121;;;;;46091:7;:5;:7::i;:::-;46077:21;;:10;:21;;;;45977:121;:156;;;;;46131:1;46115:18;;:4;:18;;;;45977:156;:194;;;;;46166:4;46150:21;;:4;:21;;;;45977:194;45960:211;;46189:9;46182:16;;;45842:364;;;;:::o;46214:160::-;46279:4;46296:11;46311:8;:14;46320:4;46311:14;;;;;;;;;;;;;;;;;;;;;;;;;46310:15;:32;;;;;46329:8;:13;46338:3;46329:13;;;;;;;;;;;;;;;;;;;;;;;;;46310:32;46296:46;;46360:6;46353:13;;;46214:160;;;;:::o;46382:163::-;46448:4;46465:12;46480:8;:14;46489:4;46480:14;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;;46499:8;:13;46508:3;46499:13;;;;;;;;;;;;;;;;;;;;;;;;;46498:14;46480:32;46465:47;;46530:7;46523:14;;;46382:163;;;;:::o;48085:541::-;48223:7;48243:11;48269:6;48265:66;;;48283:6;;48277:12;;48265:66;;;48309:7;48305:26;;;48324:7;;48318:13;;48305:26;48265:66;48353:1;48346:3;:8;48342:27;;48363:6;48356:13;;;;;48342:27;48380:17;41961:6;48410:3;48401:6;:12;;;;:::i;:::-;48400:31;;;;:::i;:::-;48380:51;;48458:1;48446:9;:13;48442:141;;;48502:9;48476:7;:22;48492:4;48476:22;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;48554:4;48531:40;;48540:4;48531:40;;;48561:9;48531:40;;;;;;:::i;:::-;;;;;;;;48442:141;48609:9;48600:6;:18;;;;:::i;:::-;48593:25;;;;48085:541;;;;;;;:::o;18882:151::-;18940:13;18973:52;19001:4;18985:22;;16757:2;18973:52;;:11;:52::i;:::-;18966:59;;18882:151;;;:::o;18278:447::-;18353:13;18379:19;18424:1;18415:6;18411:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18401:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18379:47;;18437:15;:6;18444:1;18437:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18463;:6;18470:1;18463:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18494:9;18519:1;18510:6;18506:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18494:26;;18489:131;18526:1;18522;:5;18489:131;;;18561:8;18578:3;18570:5;:11;18561:21;;;;;;;:::i;:::-;;;;;18549:6;18556:1;18549:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;18607:1;18597:11;;;;;18529:3;;;;:::i;:::-;;;18489:131;;;;18647:1;18638:5;:10;18630:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;18710:6;18696:21;;;18278:447;;;;:::o;88:117:1:-;197:1;194;187:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:329::-;2084:6;2133:2;2121:9;2112:7;2108:23;2104:32;2101:119;;;2139:79;;:::i;:::-;2101:119;2259:1;2284:53;2329:7;2320:6;2309:9;2305:22;2284:53;:::i;:::-;2274:63;;2230:117;2025:329;;;;:::o;2360:99::-;2412:6;2446:5;2440:12;2430:22;;2360:99;;;:::o;2465:169::-;2549:11;2583:6;2578:3;2571:19;2623:4;2618:3;2614:14;2599:29;;2465:169;;;;:::o;2640:246::-;2721:1;2731:113;2745:6;2742:1;2739:13;2731:113;;;2830:1;2825:3;2821:11;2815:18;2811:1;2806:3;2802:11;2795:39;2767:2;2764:1;2760:10;2755:15;;2731:113;;;2878:1;2869:6;2864:3;2860:16;2853:27;2702:184;2640:246;;;:::o;2892:102::-;2933:6;2984:2;2980:7;2975:2;2968:5;2964:14;2960:28;2950:38;;2892:102;;;:::o;3000:377::-;3088:3;3116:39;3149:5;3116:39;:::i;:::-;3171:71;3235:6;3230:3;3171:71;:::i;:::-;3164:78;;3251:65;3309:6;3304:3;3297:4;3290:5;3286:16;3251:65;:::i;:::-;3341:29;3363:6;3341:29;:::i;:::-;3336:3;3332:39;3325:46;;3092:285;3000:377;;;;:::o;3383:313::-;3496:4;3534:2;3523:9;3519:18;3511:26;;3583:9;3577:4;3573:20;3569:1;3558:9;3554:17;3547:47;3611:78;3684:4;3675:6;3611:78;:::i;:::-;3603:86;;3383:313;;;;:::o;3702:77::-;3739:7;3768:5;3757:16;;3702:77;;;:::o;3785:122::-;3858:24;3876:5;3858:24;:::i;:::-;3851:5;3848:35;3838:63;;3897:1;3894;3887:12;3838:63;3785:122;:::o;3913:139::-;3959:5;3997:6;3984:20;3975:29;;4013:33;4040:5;4013:33;:::i;:::-;3913:139;;;;:::o;4058:474::-;4126:6;4134;4183:2;4171:9;4162:7;4158:23;4154:32;4151:119;;;4189:79;;:::i;:::-;4151:119;4309:1;4334:53;4379:7;4370:6;4359:9;4355:22;4334:53;:::i;:::-;4324:63;;4280:117;4436:2;4462:53;4507:7;4498:6;4487:9;4483:22;4462:53;:::i;:::-;4452:63;;4407:118;4058:474;;;;;:::o;4538:118::-;4625:24;4643:5;4625:24;:::i;:::-;4620:3;4613:37;4538:118;;:::o;4662:222::-;4755:4;4793:2;4782:9;4778:18;4770:26;;4806:71;4874:1;4863:9;4859:17;4850:6;4806:71;:::i;:::-;4662:222;;;;:::o;4890:329::-;4949:6;4998:2;4986:9;4977:7;4973:23;4969:32;4966:119;;;5004:79;;:::i;:::-;4966:119;5124:1;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5095:117;4890:329;;;;:::o;5225:619::-;5302:6;5310;5318;5367:2;5355:9;5346:7;5342:23;5338:32;5335:119;;;5373:79;;:::i;:::-;5335:119;5493:1;5518:53;5563:7;5554:6;5543:9;5539:22;5518:53;:::i;:::-;5508:63;;5464:117;5620:2;5646:53;5691:7;5682:6;5671:9;5667:22;5646:53;:::i;:::-;5636:63;;5591:118;5748:2;5774:53;5819:7;5810:6;5799:9;5795:22;5774:53;:::i;:::-;5764:63;;5719:118;5225:619;;;;;:::o;5850:77::-;5887:7;5916:5;5905:16;;5850:77;;;:::o;5933:122::-;6006:24;6024:5;6006:24;:::i;:::-;5999:5;5996:35;5986:63;;6045:1;6042;6035:12;5986:63;5933:122;:::o;6061:139::-;6107:5;6145:6;6132:20;6123:29;;6161:33;6188:5;6161:33;:::i;:::-;6061:139;;;;:::o;6206:329::-;6265:6;6314:2;6302:9;6293:7;6289:23;6285:32;6282:119;;;6320:79;;:::i;:::-;6282:119;6440:1;6465:53;6510:7;6501:6;6490:9;6486:22;6465:53;:::i;:::-;6455:63;;6411:117;6206:329;;;;:::o;6541:118::-;6628:24;6646:5;6628:24;:::i;:::-;6623:3;6616:37;6541:118;;:::o;6665:222::-;6758:4;6796:2;6785:9;6781:18;6773:26;;6809:71;6877:1;6866:9;6862:17;6853:6;6809:71;:::i;:::-;6665:222;;;;:::o;6893:474::-;6961:6;6969;7018:2;7006:9;6997:7;6993:23;6989:32;6986:119;;;7024:79;;:::i;:::-;6986:119;7144:1;7169:53;7214:7;7205:6;7194:9;7190:22;7169:53;:::i;:::-;7159:63;;7115:117;7271:2;7297:53;7342:7;7333:6;7322:9;7318:22;7297:53;:::i;:::-;7287:63;;7242:118;6893:474;;;;;:::o;7373:86::-;7408:7;7448:4;7441:5;7437:16;7426:27;;7373:86;;;:::o;7465:112::-;7548:22;7564:5;7548:22;:::i;:::-;7543:3;7536:35;7465:112;;:::o;7583:214::-;7672:4;7710:2;7699:9;7695:18;7687:26;;7723:67;7787:1;7776:9;7772:17;7763:6;7723:67;:::i;:::-;7583:214;;;;:::o;7803:116::-;7873:21;7888:5;7873:21;:::i;:::-;7866:5;7863:32;7853:60;;7909:1;7906;7899:12;7853:60;7803:116;:::o;7925:133::-;7968:5;8006:6;7993:20;7984:29;;8022:30;8046:5;8022:30;:::i;:::-;7925:133;;;;:::o;8064:468::-;8129:6;8137;8186:2;8174:9;8165:7;8161:23;8157:32;8154:119;;;8192:79;;:::i;:::-;8154:119;8312:1;8337:53;8382:7;8373:6;8362:9;8358:22;8337:53;:::i;:::-;8327:63;;8283:117;8439:2;8465:50;8507:7;8498:6;8487:9;8483:22;8465:50;:::i;:::-;8455:60;;8410:115;8064:468;;;;;:::o;8538:118::-;8625:24;8643:5;8625:24;:::i;:::-;8620:3;8613:37;8538:118;;:::o;8662:222::-;8755:4;8793:2;8782:9;8778:18;8770:26;;8806:71;8874:1;8863:9;8859:17;8850:6;8806:71;:::i;:::-;8662:222;;;;:::o;8890:60::-;8918:3;8939:5;8932:12;;8890:60;;;:::o;8956:142::-;9006:9;9039:53;9057:34;9066:24;9084:5;9066:24;:::i;:::-;9057:34;:::i;:::-;9039:53;:::i;:::-;9026:66;;8956:142;;;:::o;9104:126::-;9154:9;9187:37;9218:5;9187:37;:::i;:::-;9174:50;;9104:126;;;:::o;9236:144::-;9304:9;9337:37;9368:5;9337:37;:::i;:::-;9324:50;;9236:144;;;:::o;9386:167::-;9491:55;9540:5;9491:55;:::i;:::-;9486:3;9479:68;9386:167;;:::o;9559:258::-;9670:4;9708:2;9697:9;9693:18;9685:26;;9721:89;9807:1;9796:9;9792:17;9783:6;9721:89;:::i;:::-;9559:258;;;;:::o;9823:474::-;9891:6;9899;9948:2;9936:9;9927:7;9923:23;9919:32;9916:119;;;9954:79;;:::i;:::-;9916:119;10074:1;10099:53;10144:7;10135:6;10124:9;10120:22;10099:53;:::i;:::-;10089:63;;10045:117;10201:2;10227:53;10272:7;10263:6;10252:9;10248:22;10227:53;:::i;:::-;10217:63;;10172:118;9823:474;;;;;:::o;10303:::-;10371:6;10379;10428:2;10416:9;10407:7;10403:23;10399:32;10396:119;;;10434:79;;:::i;:::-;10396:119;10554:1;10579:53;10624:7;10615:6;10604:9;10600:22;10579:53;:::i;:::-;10569:63;;10525:117;10681:2;10707:53;10752:7;10743:6;10732:9;10728:22;10707:53;:::i;:::-;10697:63;;10652:118;10303:474;;;;;:::o;10783:147::-;10884:11;10921:3;10906:18;;10783:147;;;;:::o;10936:114::-;;:::o;11056:398::-;11215:3;11236:83;11317:1;11312:3;11236:83;:::i;:::-;11229:90;;11328:93;11417:3;11328:93;:::i;:::-;11446:1;11441:3;11437:11;11430:18;;11056:398;;;:::o;11460:379::-;11644:3;11666:147;11809:3;11666:147;:::i;:::-;11659:154;;11830:3;11823:10;;11460:379;;;:::o;11845:180::-;11893:77;11890:1;11883:88;11990:4;11987:1;11980:15;12014:4;12011:1;12004:15;12031:194;12071:4;12091:20;12109:1;12091:20;:::i;:::-;12086:25;;12125:20;12143:1;12125:20;:::i;:::-;12120:25;;12169:1;12166;12162:9;12154:17;;12193:1;12187:4;12184:11;12181:37;;;12198:18;;:::i;:::-;12181:37;12031:194;;;;:::o;12231:410::-;12271:7;12294:20;12312:1;12294:20;:::i;:::-;12289:25;;12328:20;12346:1;12328:20;:::i;:::-;12323:25;;12383:1;12380;12376:9;12405:30;12423:11;12405:30;:::i;:::-;12394:41;;12584:1;12575:7;12571:15;12568:1;12565:22;12545:1;12538:9;12518:83;12495:139;;12614:18;;:::i;:::-;12495:139;12279:362;12231:410;;;;:::o;12647:180::-;12695:77;12692:1;12685:88;12792:4;12789:1;12782:15;12816:4;12813:1;12806:15;12833:185;12873:1;12890:20;12908:1;12890:20;:::i;:::-;12885:25;;12924:20;12942:1;12924:20;:::i;:::-;12919:25;;12963:1;12953:35;;12968:18;;:::i;:::-;12953:35;13010:1;13007;13003:9;12998:14;;12833:185;;;;:::o;13024:234::-;13164:34;13160:1;13152:6;13148:14;13141:58;13233:17;13228:2;13220:6;13216:15;13209:42;13024:234;:::o;13264:366::-;13406:3;13427:67;13491:2;13486:3;13427:67;:::i;:::-;13420:74;;13503:93;13592:3;13503:93;:::i;:::-;13621:2;13616:3;13612:12;13605:19;;13264:366;;;:::o;13636:419::-;13802:4;13840:2;13829:9;13825:18;13817:26;;13889:9;13883:4;13879:20;13875:1;13864:9;13860:17;13853:47;13917:131;14043:4;13917:131;:::i;:::-;13909:139;;13636:419;;;:::o;14061:173::-;14201:25;14197:1;14189:6;14185:14;14178:49;14061:173;:::o;14240:366::-;14382:3;14403:67;14467:2;14462:3;14403:67;:::i;:::-;14396:74;;14479:93;14568:3;14479:93;:::i;:::-;14597:2;14592:3;14588:12;14581:19;;14240:366;;;:::o;14612:419::-;14778:4;14816:2;14805:9;14801:18;14793:26;;14865:9;14859:4;14855:20;14851:1;14840:9;14836:17;14829:47;14893:131;15019:4;14893:131;:::i;:::-;14885:139;;14612:419;;;:::o;15037:162::-;15177:14;15173:1;15165:6;15161:14;15154:38;15037:162;:::o;15205:366::-;15347:3;15368:67;15432:2;15427:3;15368:67;:::i;:::-;15361:74;;15444:93;15533:3;15444:93;:::i;:::-;15562:2;15557:3;15553:12;15546:19;;15205:366;;;:::o;15577:419::-;15743:4;15781:2;15770:9;15766:18;15758:26;;15830:9;15824:4;15820:20;15816:1;15805:9;15801:17;15794:47;15858:131;15984:4;15858:131;:::i;:::-;15850:139;;15577:419;;;:::o;16002:161::-;16142:13;16138:1;16130:6;16126:14;16119:37;16002:161;:::o;16169:366::-;16311:3;16332:67;16396:2;16391:3;16332:67;:::i;:::-;16325:74;;16408:93;16497:3;16408:93;:::i;:::-;16526:2;16521:3;16517:12;16510:19;;16169:366;;;:::o;16541:419::-;16707:4;16745:2;16734:9;16730:18;16722:26;;16794:9;16788:4;16784:20;16780:1;16769:9;16765:17;16758:47;16822:131;16948:4;16822:131;:::i;:::-;16814:139;;16541:419;;;:::o;16966:225::-;17106:34;17102:1;17094:6;17090:14;17083:58;17175:8;17170:2;17162:6;17158:15;17151:33;16966:225;:::o;17197:366::-;17339:3;17360:67;17424:2;17419:3;17360:67;:::i;:::-;17353:74;;17436:93;17525:3;17436:93;:::i;:::-;17554:2;17549:3;17545:12;17538:19;;17197:366;;;:::o;17569:419::-;17735:4;17773:2;17762:9;17758:18;17750:26;;17822:9;17816:4;17812:20;17808:1;17797:9;17793:17;17786:47;17850:131;17976:4;17850:131;:::i;:::-;17842:139;;17569:419;;;:::o;17994:171::-;18134:23;18130:1;18122:6;18118:14;18111:47;17994:171;:::o;18171:366::-;18313:3;18334:67;18398:2;18393:3;18334:67;:::i;:::-;18327:74;;18410:93;18499:3;18410:93;:::i;:::-;18528:2;18523:3;18519:12;18512:19;;18171:366;;;:::o;18543:419::-;18709:4;18747:2;18736:9;18732:18;18724:26;;18796:9;18790:4;18786:20;18782:1;18771:9;18767:17;18760:47;18824:131;18950:4;18824:131;:::i;:::-;18816:139;;18543:419;;;:::o;18968:176::-;19000:1;19017:20;19035:1;19017:20;:::i;:::-;19012:25;;19051:20;19069:1;19051:20;:::i;:::-;19046:25;;19090:1;19080:35;;19095:18;;:::i;:::-;19080:35;19136:1;19133;19129:9;19124:14;;18968:176;;;;:::o;19150:171::-;19290:23;19286:1;19278:6;19274:14;19267:47;19150:171;:::o;19327:366::-;19469:3;19490:67;19554:2;19549:3;19490:67;:::i;:::-;19483:74;;19566:93;19655:3;19566:93;:::i;:::-;19684:2;19679:3;19675:12;19668:19;;19327:366;;;:::o;19699:419::-;19865:4;19903:2;19892:9;19888:18;19880:26;;19952:9;19946:4;19942:20;19938:1;19927:9;19923:17;19916:47;19980:131;20106:4;19980:131;:::i;:::-;19972:139;;19699:419;;;:::o;20124:167::-;20264:19;20260:1;20252:6;20248:14;20241:43;20124:167;:::o;20297:366::-;20439:3;20460:67;20524:2;20519:3;20460:67;:::i;:::-;20453:74;;20536:93;20625:3;20536:93;:::i;:::-;20654:2;20649:3;20645:12;20638:19;;20297:366;;;:::o;20669:419::-;20835:4;20873:2;20862:9;20858:18;20850:26;;20922:9;20916:4;20912:20;20908:1;20897:9;20893:17;20886:47;20950:131;21076:4;20950:131;:::i;:::-;20942:139;;20669:419;;;:::o;21094:178::-;21234:30;21230:1;21222:6;21218:14;21211:54;21094:178;:::o;21278:366::-;21420:3;21441:67;21505:2;21500:3;21441:67;:::i;:::-;21434:74;;21517:93;21606:3;21517:93;:::i;:::-;21635:2;21630:3;21626:12;21619:19;;21278:366;;;:::o;21650:419::-;21816:4;21854:2;21843:9;21839:18;21831:26;;21903:9;21897:4;21893:20;21889:1;21878:9;21874:17;21867:47;21931:131;22057:4;21931:131;:::i;:::-;21923:139;;21650:419;;;:::o;22075:180::-;22215:32;22211:1;22203:6;22199:14;22192:56;22075:180;:::o;22261:366::-;22403:3;22424:67;22488:2;22483:3;22424:67;:::i;:::-;22417:74;;22500:93;22589:3;22500:93;:::i;:::-;22618:2;22613:3;22609:12;22602:19;;22261:366;;;:::o;22633:419::-;22799:4;22837:2;22826:9;22822:18;22814:26;;22886:9;22880:4;22876:20;22872:1;22861:9;22857:17;22850:47;22914:131;23040:4;22914:131;:::i;:::-;22906:139;;22633:419;;;:::o;23058:228::-;23198:34;23194:1;23186:6;23182:14;23175:58;23267:11;23262:2;23254:6;23250:15;23243:36;23058:228;:::o;23292:366::-;23434:3;23455:67;23519:2;23514:3;23455:67;:::i;:::-;23448:74;;23531:93;23620:3;23531:93;:::i;:::-;23649:2;23644:3;23640:12;23633:19;;23292:366;;;:::o;23664:419::-;23830:4;23868:2;23857:9;23853:18;23845:26;;23917:9;23911:4;23907:20;23903:1;23892:9;23888:17;23881:47;23945:131;24071:4;23945:131;:::i;:::-;23937:139;;23664:419;;;:::o;24089:172::-;24229:24;24225:1;24217:6;24213:14;24206:48;24089:172;:::o;24267:366::-;24409:3;24430:67;24494:2;24489:3;24430:67;:::i;:::-;24423:74;;24506:93;24595:3;24506:93;:::i;:::-;24624:2;24619:3;24615:12;24608:19;;24267:366;;;:::o;24639:419::-;24805:4;24843:2;24832:9;24828:18;24820:26;;24892:9;24886:4;24882:20;24878:1;24867:9;24863:17;24856:47;24920:131;25046:4;24920:131;:::i;:::-;24912:139;;24639:419;;;:::o;25064:191::-;25104:3;25123:20;25141:1;25123:20;:::i;:::-;25118:25;;25157:20;25175:1;25157:20;:::i;:::-;25152:25;;25200:1;25197;25193:9;25186:16;;25221:3;25218:1;25215:10;25212:36;;;25228:18;;:::i;:::-;25212:36;25064:191;;;;:::o;25261:180::-;25309:77;25306:1;25299:88;25406:4;25403:1;25396:15;25430:4;25427:1;25420:15;25447:180;25495:77;25492:1;25485:88;25592:4;25589:1;25582:15;25616:4;25613:1;25606:15;25633:143;25690:5;25721:6;25715:13;25706:22;;25737:33;25764:5;25737:33;:::i;:::-;25633:143;;;;:::o;25782:351::-;25852:6;25901:2;25889:9;25880:7;25876:23;25872:32;25869:119;;;25907:79;;:::i;:::-;25869:119;26027:1;26052:64;26108:7;26099:6;26088:9;26084:22;26052:64;:::i;:::-;26042:74;;25998:128;25782:351;;;;:::o;26139:85::-;26184:7;26213:5;26202:16;;26139:85;;;:::o;26230:158::-;26288:9;26321:61;26339:42;26348:32;26374:5;26348:32;:::i;:::-;26339:42;:::i;:::-;26321:61;:::i;:::-;26308:74;;26230:158;;;:::o;26394:147::-;26489:45;26528:5;26489:45;:::i;:::-;26484:3;26477:58;26394:147;;:::o;26547:114::-;26614:6;26648:5;26642:12;26632:22;;26547:114;;;:::o;26667:184::-;26766:11;26800:6;26795:3;26788:19;26840:4;26835:3;26831:14;26816:29;;26667:184;;;;:::o;26857:132::-;26924:4;26947:3;26939:11;;26977:4;26972:3;26968:14;26960:22;;26857:132;;;:::o;26995:108::-;27072:24;27090:5;27072:24;:::i;:::-;27067:3;27060:37;26995:108;;:::o;27109:179::-;27178:10;27199:46;27241:3;27233:6;27199:46;:::i;:::-;27277:4;27272:3;27268:14;27254:28;;27109:179;;;;:::o;27294:113::-;27364:4;27396;27391:3;27387:14;27379:22;;27294:113;;;:::o;27443:732::-;27562:3;27591:54;27639:5;27591:54;:::i;:::-;27661:86;27740:6;27735:3;27661:86;:::i;:::-;27654:93;;27771:56;27821:5;27771:56;:::i;:::-;27850:7;27881:1;27866:284;27891:6;27888:1;27885:13;27866:284;;;27967:6;27961:13;27994:63;28053:3;28038:13;27994:63;:::i;:::-;27987:70;;28080:60;28133:6;28080:60;:::i;:::-;28070:70;;27926:224;27913:1;27910;27906:9;27901:14;;27866:284;;;27870:14;28166:3;28159:10;;27567:608;;;27443:732;;;;:::o;28181:831::-;28444:4;28482:3;28471:9;28467:19;28459:27;;28496:71;28564:1;28553:9;28549:17;28540:6;28496:71;:::i;:::-;28577:80;28653:2;28642:9;28638:18;28629:6;28577:80;:::i;:::-;28704:9;28698:4;28694:20;28689:2;28678:9;28674:18;28667:48;28732:108;28835:4;28826:6;28732:108;:::i;:::-;28724:116;;28850:72;28918:2;28907:9;28903:18;28894:6;28850:72;:::i;:::-;28932:73;29000:3;28989:9;28985:19;28976:6;28932:73;:::i;:::-;28181:831;;;;;;;;:::o;29018:182::-;29158:34;29154:1;29146:6;29142:14;29135:58;29018:182;:::o;29206:366::-;29348:3;29369:67;29433:2;29428:3;29369:67;:::i;:::-;29362:74;;29445:93;29534:3;29445:93;:::i;:::-;29563:2;29558:3;29554:12;29547:19;;29206:366;;;:::o;29578:419::-;29744:4;29782:2;29771:9;29767:18;29759:26;;29831:9;29825:4;29821:20;29817:1;29806:9;29802:17;29795:47;29859:131;29985:4;29859:131;:::i;:::-;29851:139;;29578:419;;;:::o;30003:148::-;30105:11;30142:3;30127:18;;30003:148;;;;:::o;30157:173::-;30297:25;30293:1;30285:6;30281:14;30274:49;30157:173;:::o;30336:402::-;30496:3;30517:85;30599:2;30594:3;30517:85;:::i;:::-;30510:92;;30611:93;30700:3;30611:93;:::i;:::-;30729:2;30724:3;30720:12;30713:19;;30336:402;;;:::o;30744:390::-;30850:3;30878:39;30911:5;30878:39;:::i;:::-;30933:89;31015:6;31010:3;30933:89;:::i;:::-;30926:96;;31031:65;31089:6;31084:3;31077:4;31070:5;31066:16;31031:65;:::i;:::-;31121:6;31116:3;31112:16;31105:23;;30854:280;30744:390;;;;:::o;31140:167::-;31280:19;31276:1;31268:6;31264:14;31257:43;31140:167;:::o;31313:402::-;31473:3;31494:85;31576:2;31571:3;31494:85;:::i;:::-;31487:92;;31588:93;31677:3;31588:93;:::i;:::-;31706:2;31701:3;31697:12;31690:19;;31313:402;;;:::o;31721:967::-;32103:3;32125:148;32269:3;32125:148;:::i;:::-;32118:155;;32290:95;32381:3;32372:6;32290:95;:::i;:::-;32283:102;;32402:148;32546:3;32402:148;:::i;:::-;32395:155;;32567:95;32658:3;32649:6;32567:95;:::i;:::-;32560:102;;32679:3;32672:10;;31721:967;;;;;:::o;32694:171::-;32733:3;32756:24;32774:5;32756:24;:::i;:::-;32747:33;;32802:4;32795:5;32792:15;32789:41;;32810:18;;:::i;:::-;32789:41;32857:1;32850:5;32846:13;32839:20;;32694:171;;;:::o;32871:182::-;33011:34;33007:1;32999:6;32995:14;32988:58;32871:182;:::o;33059:366::-;33201:3;33222:67;33286:2;33281:3;33222:67;:::i;:::-;33215:74;;33298:93;33387:3;33298:93;:::i;:::-;33416:2;33411:3;33407:12;33400:19;;33059:366;;;:::o;33431:419::-;33597:4;33635:2;33624:9;33620:18;33612:26;;33684:9;33678:4;33674:20;33670:1;33659:9;33655:17;33648:47;33712:131;33838:4;33712:131;:::i;:::-;33704:139;;33431:419;;;:::o

Swarm Source

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