// Contract: XAVIERUNCLE
// Target function: function functionCallWithValue(
//SPDX-License-Identifier: MIT

/**
*==========================================*
| !! Xavier Uncle! The King of all MEMEs!! |
*==========================================*
::::::::::.....::::~7Y5PPGPPPP555YJ7~^::::::::::::::::::::^^
::::.....:::^^~!7J5GGGBBBGGGGBGGGGGGP5J!^::::::::::::::::::^
:..:::::::^!?J5GBBBGGB#BGGBBBBGGGGGGGGGPY!...:::::::::::::::
::::::.::^!7YPBBGGGGBBBBBBBBGGGGGGGGGGBBGPJJ?!^:..::::::::::
..:::::::~?5PBBBGBB##BBBGPPPPP55555555PP55PB#BP5J~::::::::::
::::.::^!YPGBBBBBBBGGP5YYJJYJJJJJJJJYYY55Y5PGBBBBGGY^.::::::
:::.::^75GGB##BPP55YYJJJJJJJJJ??????JJJY5555PGBBBB#BJ.::::::
....::^YGGGB#BP55YYYYYJJJJJJ?????????JJYYY555PBGGB##G^.:::::
:..:::?BBBBB#GP5YYYYYYJJJJJ???????????JJYYYY55PGGB##G^.:::::
::::::7GB#BBBGP5YYYYYYJ??7777777777777?JYYY5555PGB##Y.::::::
..::::~PB#BGBG5YY55555YJJ?77!!!!7?Y5PPPGPPGGGGPPG#&#Y.::::::
.:.::^^?B###B5YPGBGGPGGBGGP5J???JY5GGGGP5YYYYPGPPB&B?.::::::
...:::^!B###PY5PP55555P5555PYJ??JY555YYGGGJGBPP55P#Y:.::::::
..::::^^P&#GYYY5PBGJPPP?JY555YJJY55YYJJYYYJ5PP5YY5GJ..::::::
.....:^:Y&#5YYYY555YYYJJJY5P5YJ?J55YJJJJJJJYJYYY55GB7.::::::
.....:::!BB5YYYYYYJJJJJJJJ555J?7JY5YJ??777??JJYY55PP!.::::::
:....:::~5P5YYYYJJ?777!7?YYYY?!~7JYYYJ??7!!!7JJY555J?.::::::
::...:::~YJY55YJJJ7!!!?JY5Y55J777Y55YYJJJJ?7?JYY5PPYJ.::::::
:.::.:^:!5J555YYYJ???JYY5GBBBPPP5PBBBG5YY55YJJYY5PP57.::::::
:.::::::~555555YYYJYPGGGB#&#BB###PB#####BBBB5JJY55P5^.::::::
:::::.:::?YY555YJJYGBBB##BPP5YY5YYYY5PBBGB#PJ?JY55P7..::::::
:::...::^^7J55YYJJYGBG5PGPJJ?!!7!77?J55YYPGJJJJY5P?..:::::::
....:...::::7P5YJJJYYJJJJYYYJ????77JJJJJYYJYYYY5PY..::::::::
::.......:::^YP5YYYYYYYYYYYYYYYYYYYJJJJYYYY555PGY:.:::::::::
::........:::~5PP555555YJJJJJJJJYJJ???JY555PPPPJ:.::::::::::
...........:::~5PPPP5555YJJJ????????JJY5PPPPPPY:.:::::::::::
:::........::^J55PPPPPPPPP55YYYYYYYY55PPPPP5555J^:::::::::::
.::::::...::~YG55555PPPPPPGGGGPPPPGGGGGPPP5555PBY~::::::::::

*=============================================================================*
|  No Owner, No Regulator, Fair Launch, Community Owned -> Satoshi's Dream!!  |
*=============================================================================*

*===========================================================================================================*
| 1. This token is developed based on the Popular Meme Character Xavier Uncle.                              |
| 2. This token has no monetary value, it is deployed for fun as a meme token in the Ethereum Network.      |
| 3. This token (Xavier Uncle) has total supply of 500 Trillion and is burnable. I put this upto community  |
|    to burn the token or not from the wallet of those who wish to burn.                                    |
| 4. 50% of total supply is reserved for burning in the contract.                                           |
| 5. 5% of each transfer amount will continue to burn from the reserve when burn portal block reaches.      |                                      
| 6. DYOR (Do Your Own Research) before investing in crypto currency. No financial advice.                  |
*===========================================================================================================*

*---------------------------------------------------------------------------------------|
| Telegram Link         | https://t.me/xavier_uncle                                     |
*---------------------------------------------------------------------------------------|


┏┓┃┃┃┃┃┃┏┓┃┃┃┃━━━━┓┓┃┃┃┃┃┃┃┃┓┏━┓┃┃┃┃┃┃┃┃┃┃━━━┓┃┃┃┃┃┃┃
┃┃┃┃┃┃┃┃┛┗┓┃┃┃┏┓┏┓┃┃┃┃┃┃┃┃┃┃┃┃┏┛┃┃┃┃┃┃┃┃┃┃┏━┓┃┃┃┃┃┃┃┃
┃┃┃┃┃━━┓┓┏┛┃┃┃┛┃┃┗┛┗━┓━━┓┃┃┃┗┛┛┃┓━┓┃━━┓┃┃┃┗━┛┃┓━━┓━━┓
┃┃┃┏┓┏┓┃┃┃┃┃┃┃┃┃┃┃┃┏┓┃┏┓┃┃┃┃┏┓┃┃┫┏┓┓┏┓┃┃┃┃┏┓┏┛┫━━┫┏┓┃
┃┗━┛┃┃━┫┃┗┓┃┃┃┏┛┗┓┃┃┃┃┃━┫┃┃┃┃┃┗┓┃┃┃┃┗┛┃┃┃┃┃┃┗┓┃━━┃┃━┫
┗━━━┛━━┛┗━┛┃┃┃┗━━┛┃┛┗┛━━┛┃┃┃┛┗━┛┛┛┗┛━┓┃┃┃┃┛┗━┛┛━━┛━━┛
┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃━┛┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃
┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃┃━━┛┃┃┃┃┃┃┃┃┃┃┃┃┃┃ 
*/

pragma solidity 0.8.18;

/**
 * @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);
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(
        address account
    ) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(
        address payable recipient,
        uint256 amount
    ) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target, 
        bytes memory data
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }