ETH Price: $3,354.39 (-1.02%)

Token

QuDefi (QUDEFI)
 

Overview

Max Total Supply

1,000,000,000 QUDEFI

Holders

57

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
6,987,320.056552217418412611 QUDEFI

Value
$0.00
0xca87711b4061bc5c61f7da6814256304b51275f9
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:
QuDefi

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-10-17
*/

// SPDX-License-Identifier: MIT

/*

// Telegram: https://t.me/QuDefi_QuLabs
// X: https://x.com/Qudefiai
// Web: https://www.qulabs.io/

*/

pragma solidity 0.8.25;

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

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

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

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

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value
    ) external returns (bool);
}

// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

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

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

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

// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)

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

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

// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(
        address sender,
        uint256 balance,
        uint256 needed
    );

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(
        address spender,
        uint256 allowance,
        uint256 needed
    );

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(
        address sender,
        uint256 balance,
        uint256 needed,
        uint256 tokenId
    );

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

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

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(
        address from,
        address to,
        uint256 value
    ) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(
        address owner,
        address spender,
        uint256 value
    ) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(
        address owner,
        address spender,
        uint256 value,
        bool emitEvent
    ) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

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

// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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);
    }
}

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);
}

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

    function WETH() external pure returns (address);

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

contract QuDefi is Ownable, ERC20 {
    IUniswapV2Router public immutable uniswapV2Router;

    address public constant ZERO_ADDRESS = address(0);
    address public constant DEAD_ADDRESS = address(0xdEaD);

    address public immutable uniswapV2Pair;
    address public operationsWallet;
    address public developmentWallet;

    bool public isLimitsEnabled;
    bool public isCooldownEnabled;
    bool public isTaxEnabled;
    bool private inSwapBack;
    bool public isLaunched;

    uint256 public launchBlock;
    uint256 public launchTime;

    uint256 private lastSwapBackExecutionBlock;

    uint256 public constant MAX_FEE = 99;

    uint256 public maxBuy;
    uint256 public maxSell;
    uint256 public maxWallet;

    uint256 public swapTokensAtAmount;
    uint256 public buyFee;
    uint256 public sellFee;
    uint256 public transferFee;

    mapping(address => bool) public isBot;
    mapping(address => bool) public isExcludedFromFees;
    mapping(address => bool) public isExcludedFromLimits;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => uint256) private _holderLastTransferTimestamp;

    event Launch();
    event SetOperationsWallet(address newWallet, address oldWallet);
    event SetDevelopmentWallet(address newWallet, address oldWallet);
    event SetLimitsEnabled(bool status);
    event SetCooldownEnabled(bool status);
    event SetTaxesEnabled(bool status);
    event SetMaxBuy(uint256 amount);
    event SetMaxSell(uint256 amount);
    event SetMaxWallet(uint256 amount);
    event SetSwapTokensAtAmount(uint256 newValue, uint256 oldValue);
    event SetBuyFees(uint256 newValue, uint256 oldValue);
    event SetSellFees(uint256 newValue, uint256 oldValue);
    event SetTransferFees(uint256 newValue, uint256 oldValue);
    event ExcludeFromFees(address account, bool isExcluded);
    event ExcludeFromLimits(address account, bool isExcluded);
    event SetBots(address account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address pair, bool value);
    event WithdrawStuckTokens(address token, uint256 amount);

    modifier lockSwapBack() {
        inSwapBack = true;
        _;
        inSwapBack = false;
    }

    constructor() Ownable(msg.sender) ERC20("QuDefi", "QUDEFI") {
        address sender = msg.sender;
        _mint(sender, 1_000_000_000 ether);
        uint256 totalSupply = totalSupply();

        operationsWallet = 0xb96B4c36d6Fc350BD038762aabAd1bFb8AB691d8;
        developmentWallet = 0xb96B4c36d6Fc350BD038762aabAd1bFb8AB691d8;

        maxBuy = (totalSupply * 20) / 1000;
        maxSell = (totalSupply * 20) / 1000;
        maxWallet = (totalSupply * 20) / 1000;
        swapTokensAtAmount = (totalSupply * 5) / 10000;

        isLimitsEnabled = true;
        isCooldownEnabled = true;
        isTaxEnabled = true;

        buyFee = 25;
        sellFee = 40;
        transferFee = 25;

        uniswapV2Router = IUniswapV2Router(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
            address(this),
            uniswapV2Router.WETH()
        );

        _setAutomatedMarketMakerPair(uniswapV2Pair, true);
        _approve(address(this), address(uniswapV2Router), type(uint256).max);
        _excludeFromFees(address(this), true);
        _excludeFromFees(DEAD_ADDRESS, true);
        _excludeFromFees(sender, true);
        _excludeFromFees(operationsWallet, true);
        _excludeFromFees(developmentWallet, true);
        _excludeFromLimits(address(this), true);
        _excludeFromLimits(DEAD_ADDRESS, true);
        _excludeFromLimits(sender, true);
        _excludeFromLimits(operationsWallet, true);
        _excludeFromLimits(developmentWallet, true);
    }

    receive() external payable {}

    fallback() external payable {}

    function _transferOwnership(address newOwner) internal override {
        address oldOwner = owner();
        if (oldOwner != address(0)) {
            _excludeFromFees(oldOwner, false);
            _excludeFromLimits(oldOwner, false);
        }
        _excludeFromFees(newOwner, true);
        _excludeFromLimits(newOwner, true);
        super._transferOwnership(newOwner);
    }

    function permitTrading() external onlyOwner {
        require(!isLaunched, "Already Launched");
        isLaunched = true;
        launchBlock = block.number;
        launchTime = block.timestamp;
        emit Launch();
    }

    function setOperationsWallet(address _operationsWallet) external onlyOwner {
        require(_operationsWallet != address(0), "Address Zero");
        address oldWallet = operationsWallet;
        operationsWallet = _operationsWallet;
        emit SetOperationsWallet(operationsWallet, oldWallet);
    }

    function setDevelopmentWallet(address _developmentWallet)
        external
        onlyOwner
    {
        require(_developmentWallet != address(0), "Address Zero");
        address oldWallet = developmentWallet;
        developmentWallet = _developmentWallet;
        emit SetDevelopmentWallet(developmentWallet, oldWallet);
    }

    function setLimitsEnabled(bool value) external onlyOwner {
        isLimitsEnabled = value;
        emit SetLimitsEnabled(value);
    }

    function setCooldownEnabled(bool value) external onlyOwner {
        isCooldownEnabled = value;
        emit SetCooldownEnabled(value);
    }

    function setTaxesEnabled(bool value) external onlyOwner {
        isTaxEnabled = value;
        emit SetTaxesEnabled(value);
    }

    function setMaxBuy(uint256 amount) external onlyOwner {
        require(amount >= ((totalSupply() * 2) / 1000), "AmountTooLow");
        maxBuy = amount;
        emit SetMaxBuy(maxBuy);
    }

    function setMaxSell(uint256 amount) external onlyOwner {
        require(amount >= ((totalSupply() * 2) / 1000), "AmountTooLow");
        maxSell = amount;
        emit SetMaxSell(maxSell);
    }

    function setMaxWallet(uint256 amount) external onlyOwner {
        require(amount >= ((totalSupply() * 3) / 1000), "AmountTooLow");
        maxWallet = amount;
        emit SetMaxWallet(maxWallet);
    }

    function setSwapTokensAtAmount(uint256 amount) external onlyOwner {
        uint256 _totalSupply = totalSupply();
        require(amount >= (_totalSupply * 1) / 1000000, "AmountTooLow");
        require(amount <= (_totalSupply * 5) / 1000, "AmountTooHigh");
        uint256 oldValue = swapTokensAtAmount;
        swapTokensAtAmount = amount;
        emit SetSwapTokensAtAmount(amount, oldValue);
    }

    function setBuyFees(uint256 _buyFee) external onlyOwner {
        require(_buyFee <= 50, "FeeTooHigh");
        uint256 oldValue = buyFee;
        buyFee = _buyFee;
        emit SetBuyFees(_buyFee, oldValue);
    }

    function setSellFees(uint256 _sellFee) external onlyOwner {
        require(_sellFee <= 99, "FeeTooHigh");
        uint256 oldValue = sellFee;
        sellFee = _sellFee;
        emit SetSellFees(_sellFee, oldValue);
    }

    function setTransferFees(uint256 _transferFee) external onlyOwner {
        require(_transferFee <= 50, "FeeTooHigh");
        uint256 oldValue = transferFee;
        transferFee = _transferFee;
        emit SetTransferFees(_transferFee, oldValue);
    }

    function excludeFromFees(address[] calldata accounts, bool value)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < accounts.length; i++) {
            _excludeFromFees(accounts[i], value);
        }
    }

    function excludeFromLimits(address[] calldata accounts, bool value)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < accounts.length; i++) {
            _excludeFromLimits(accounts[i], value);
        }
    }

    function setBots(address[] calldata accounts, bool value)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < accounts.length; i++) {
            if (
                (!automatedMarketMakerPairs[accounts[i]]) &&
                (accounts[i] != address(uniswapV2Router)) &&
                (accounts[i] != address(this)) &&
                (accounts[i] != ZERO_ADDRESS) &&
                (!isExcludedFromFees[accounts[i]] &&
                    !isExcludedFromLimits[accounts[i]])
            ) _setBots(accounts[i], value);
        }
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        external
        onlyOwner
    {
        require(!automatedMarketMakerPairs[pair], "AMMAlreadySet");
        _setAutomatedMarketMakerPair(pair, value);
    }

    function withdrawStuckTokens(address _token) external onlyOwner {
        address sender = msg.sender;
        uint256 amount;
        if (_token == ZERO_ADDRESS) {
            bool success;
            amount = address(this).balance;
            require(amount > 0, "NoNativeTokens");
            (success, ) = address(sender).call{value: amount}("");
            require(success, "FailedToWithdrawNativeTokens");
        } else {
            amount = IERC20(_token).balanceOf(address(this));
            require(amount > 0, "NoTokens");
            IERC20(_token).transfer(msg.sender, amount);
        }
        emit WithdrawStuckTokens(_token, amount);
    }

    function _update(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        address sender = msg.sender;
        address origin = tx.origin;
        uint256 blockNumber = block.number;

        require(!isBot[from], "BotDetected");
        require(sender == from || !isBot[sender], "BotDetected");
        require(
            origin == from || origin == sender || !isBot[origin],
            "BotDetected"
        );

        require(
            isLaunched ||
                isExcludedFromLimits[from] ||
                isExcludedFromLimits[to],
            "NotLaunched"
        );

        bool limits = isLimitsEnabled &&
            !inSwapBack &&
            !(isExcludedFromLimits[from] || isExcludedFromLimits[to]);
        if (limits) {
            if (
                from != owner() &&
                to != owner() &&
                to != ZERO_ADDRESS &&
                to != DEAD_ADDRESS
            ) {
                if (isCooldownEnabled) {
                    if (to != address(uniswapV2Router) && to != uniswapV2Pair) {
                        require(
                            _holderLastTransferTimestamp[origin] <
                                blockNumber - 3 &&
                                _holderLastTransferTimestamp[to] <
                                blockNumber - 3,
                            "TransferDelay"
                        );
                        _holderLastTransferTimestamp[origin] = blockNumber;
                        _holderLastTransferTimestamp[to] = blockNumber;
                    }
                }

                if (
                    automatedMarketMakerPairs[from] && !isExcludedFromLimits[to]
                ) {
                    require(amount <= maxBuy, "MaxBuyAmountExceed");
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "MaxWalletAmountExceed"
                    );
                } else if (
                    automatedMarketMakerPairs[to] && !isExcludedFromLimits[from]
                ) {
                    require(amount <= maxSell, "MaxSellAmountExceed");
                } else if (!isExcludedFromLimits[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "MaxWalletAmountExceed"
                    );
                }
            }
        }

        bool takeFee = isTaxEnabled &&
            !inSwapBack &&
            !(isExcludedFromFees[from] || isExcludedFromFees[to]);

        if (takeFee) {
            uint256 fees = 0;
            if (automatedMarketMakerPairs[to] && sellFee > 0) {
                fees = (amount * sellFee) / 100;
            } else if (automatedMarketMakerPairs[from] && buyFee > 0) {
                fees = (amount * buyFee) / 100;
            } else if (
                !automatedMarketMakerPairs[to] &&
                !automatedMarketMakerPairs[from] &&
                transferFee > 0
            ) {
                fees = (amount * transferFee) / 100;
            }

            if (fees > 0) {
                amount -= fees;
                super._update(from, address(this), fees);
            }
        }

        uint256 balance = balanceOf(address(this));
        bool shouldSwap = balance >= swapTokensAtAmount;
        if (takeFee && !automatedMarketMakerPairs[from] && shouldSwap) {
            if (blockNumber > lastSwapBackExecutionBlock) {
                _swapBack(balance);
                lastSwapBackExecutionBlock = blockNumber;
            }
        }

        super._update(from, to, amount);
    }

    function _swapBack(uint256 balance) internal virtual lockSwapBack {
        bool success;
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        uint256 maxSwapAmount = swapTokensAtAmount * 20;

        if (balance > maxSwapAmount) {
            balance = maxSwapAmount;
        }

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            balance,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 ethBalance = address(this).balance;

        uint256 ethForDevelopment = ethBalance / 5;

        uint256 ethForOperations = ethBalance - ethForDevelopment;

        (success, ) = address(operationsWallet).call{value: ethForOperations}(
            ""
        );

        (success, ) = address(developmentWallet).call{value: ethForDevelopment}(
            ""
        );
    }

    function _excludeFromFees(address account, bool value) internal virtual {
        isExcludedFromFees[account] = value;
        emit ExcludeFromFees(account, value);
    }

    function _excludeFromLimits(address account, bool value) internal virtual {
        isExcludedFromLimits[account] = value;
        emit ExcludeFromLimits(account, value);
    }

    function _setBots(address account, bool value) internal virtual {
        isBot[account] = value;
        emit SetBots(account, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value)
        internal
        virtual
    {
        automatedMarketMakerPairs[pair] = value;
        emit SetAutomatedMarketMakerPair(pair, value);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromLimits","type":"event"},{"anonymous":false,"inputs":[],"name":"Launch","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":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"SetBots","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"SetBuyFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"SetCooldownEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newWallet","type":"address"},{"indexed":false,"internalType":"address","name":"oldWallet","type":"address"}],"name":"SetDevelopmentWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"SetLimitsEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SetMaxBuy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SetMaxSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SetMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newWallet","type":"address"},{"indexed":false,"internalType":"address","name":"oldWallet","type":"address"}],"name":"SetOperationsWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"SetSellFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"SetSwapTokensAtAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"SetTaxesEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"SetTransferFees","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawStuckTokens","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DEAD_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developmentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isCooldownEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLimitsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTaxEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"permitTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFee","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_developmentWallet","type":"address"}],"name":"setDevelopmentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setLimitsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operationsWallet","type":"address"}],"name":"setOperationsWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellFee","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setTaxesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transferFee","type":"uint256"}],"name":"setTransferFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561000f575f80fd5b506040518060400160405280600681526020017f51754465666900000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f5155444546490000000000000000000000000000000000000000000000000000815250335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100ed575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100e49190611f3d565b60405180910390fd5b6100fc8161063260201b60201c565b50816004908161010c9190612190565b50806005908161011c9190612190565b5050505f33905061013f816b033b2e3c9fd0803ce80000006106cc60201b60201c565b5f61014e61075160201b60201c565b905073b96b4c36d6fc350bd038762aabad1bfb8ab691d860065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b96b4c36d6fc350bd038762aabad1bfb8ab691d860075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103e8601482610208919061228c565b61021291906122fa565b600b819055506103e8601482610228919061228c565b61023291906122fa565b600c819055506103e8601482610248919061228c565b61025291906122fa565b600d81905550612710600582610268919061228c565b61027291906122fa565b600e819055506001600760146101000a81548160ff0219169083151502179055506001600760156101000a81548160ff0219169083151502179055506001600760166101000a81548160ff0219169083151502179055506019600f8190555060286010819055506019601181905550737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610374573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103989190612358565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104239190612358565b6040518363ffffffff1660e01b8152600401610440929190612383565b6020604051808303815f875af115801561045c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104809190612358565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506104c660a051600161075a60201b60201c565b6104f9306080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6107eb60201b60201c565b61050a30600161080360201b60201c565b61051d61dead600161080360201b60201c565b61052e82600161080360201b60201c565b61056060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161080360201b60201c565b61059260075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161080360201b60201c565b6105a330600161089460201b60201c565b6105b661dead600161089460201b60201c565b6105c782600161089460201b60201c565b6105f960065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161089460201b60201c565b61062b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161089460201b60201c565b50506128e4565b5f61064161092560201b60201c565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461069757610686815f61080360201b60201c565b610696815f61089460201b60201c565b5b6106a882600161080360201b60201c565b6106b982600161089460201b60201c565b6106c88261094c60201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361073c575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016107339190611f3d565b60405180910390fd5b61074d5f8383610a0d60201b60201c565b5050565b5f600354905090565b8060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab82826040516107df9291906123c4565b60405180910390a15050565b6107fe838383600161177160201b60201c565b505050565b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782826040516108889291906123c4565b60405180910390a15050565b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc9282826040516109199291906123c4565b60405180910390a15050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f3390505f3290505f43905060125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615610aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9a90612445565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610b24575060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b610b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5a90612445565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480610bc857508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80610c1a575060125f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b610c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5090612445565b60405180910390fd5b600760189054906101000a900460ff1680610cba575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b80610d0b575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b610d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d41906124ad565b60405180910390fd5b5f600760149054906101000a900460ff168015610d745750600760179054906101000a900460ff16155b8015610e18575060145f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680610e16575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b905080156113eb57610e2e61092560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614158015610ea25750610e7261092560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015610eda57505f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015610f14575061dead73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b156113ea57600760159054906101000a900460ff16156111045760805173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610f9a575060a05173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b1561110357600382610fac91906124cb565b60165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410801561103f5750600382610fff91906124cb565b60165f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054105b61107e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107590612548565b60405180910390fd5b8160165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160165f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5b60155f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156111a1575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561124e57600b548511156111eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e2906125b0565b60405180910390fd5b600d546111fd8761194060201b60201c565b8661120891906125ce565b1115611249576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112409061264b565b60405180910390fd5b6113e9565b60155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156112eb575060145f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561133a57600c54851115611335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132c906126b3565b60405180910390fd5b6113e8565b60145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166113e757600d5461139a8761194060201b60201c565b866113a591906125ce565b11156113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd9061264b565b60405180910390fd5b5b5b5b5b5b5f600760169054906101000a900460ff1680156114155750600760179054906101000a900460ff16155b80156114b9575060135f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806114b7575060135f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b905080156116b5575f60155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561151957505f601054115b1561153f5760646010548861152e919061228c565b61153891906122fa565b905061168b565b60155f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561159657505f600f54115b156115bc576064600f54886115ab919061228c565b6115b591906122fa565b905061168a565b60155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561165a575060155f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561166757505f601154115b156116895760646011548861167c919061228c565b61168691906122fa565b90505b5b5b5f8111156116b357808761169f91906124cb565b96506116b289308361198660201b60201c565b5b505b5f6116c53061194060201b60201c565b90505f600e548210159050828015611724575060155f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561172d5750805b1561175457600a548511156117535761174b82611ba260201b60201c565b84600a819055505b5b6117658a8a8a61198660201b60201c565b50505050505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036117e1575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016117d89190611f3d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611851575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016118489190611f3d565b60405180910390fd5b8160025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801561193a578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161193191906126e0565b60405180910390a35b50505050565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036119d6578060035f8282546119ca91906125ce565b92505081905550611aa6565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611a60578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611a57939291906126f9565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611aed578060035f8282540392505081905550611b38565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b9591906126e0565b60405180910390a3505050565b6001600760176101000a81548160ff0219169083151502179055505f80600267ffffffffffffffff811115611bda57611bd9611f60565b5b604051908082528060200260200182016040528015611c085781602001602082028036833780820191505090505b50905030815f81518110611c1f57611c1e61272e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ca4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cc89190612358565b81600181518110611cdc57611cdb61272e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f6014600e54611d26919061228c565b905080841115611d34578093505b60805173ffffffffffffffffffffffffffffffffffffffff1663791ac947855f8530426040518663ffffffff1660e01b8152600401611d7795949392919061284b565b5f604051808303815f87803b158015611d8e575f80fd5b505af1158015611da0573d5f803e3d5ffd5b505050505f4790505f600582611db691906122fa565b90505f8183611dc591906124cb565b905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051611e0c906128d0565b5f6040518083038185875af1925050503d805f8114611e46576040519150601f19603f3d011682016040523d82523d5f602084013e611e4b565b606091505b50508096505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611e96906128d0565b5f6040518083038185875af1925050503d805f8114611ed0576040519150601f19603f3d011682016040523d82523d5f602084013e611ed5565b606091505b5050809650505050505050505f600760176101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f2782611efe565b9050919050565b611f3781611f1d565b82525050565b5f602082019050611f505f830184611f2e565b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611fd157607f821691505b602082108103611fe457611fe3611f8d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026120467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261200b565b612050868361200b565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61209461208f61208a84612068565b612071565b612068565b9050919050565b5f819050919050565b6120ad8361207a565b6120c16120b98261209b565b848454612017565b825550505050565b5f90565b6120d56120c9565b6120e08184846120a4565b505050565b5b81811015612103576120f85f826120cd565b6001810190506120e6565b5050565b601f8211156121485761211981611fea565b61212284611ffc565b81016020851015612131578190505b61214561213d85611ffc565b8301826120e5565b50505b505050565b5f82821c905092915050565b5f6121685f198460080261214d565b1980831691505092915050565b5f6121808383612159565b9150826002028217905092915050565b61219982611f56565b67ffffffffffffffff8111156121b2576121b1611f60565b5b6121bc8254611fba565b6121c7828285612107565b5f60209050601f8311600181146121f8575f84156121e6578287015190505b6121f08582612175565b865550612257565b601f19841661220686611fea565b5f5b8281101561222d57848901518255600182019150602085019450602081019050612208565b8683101561224a5784890151612246601f891682612159565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61229682612068565b91506122a183612068565b92508282026122af81612068565b915082820484148315176122c6576122c561225f565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61230482612068565b915061230f83612068565b92508261231f5761231e6122cd565b5b828204905092915050565b5f80fd5b61233781611f1d565b8114612341575f80fd5b50565b5f815190506123528161232e565b92915050565b5f6020828403121561236d5761236c61232a565b5b5f61237a84828501612344565b91505092915050565b5f6040820190506123965f830185611f2e565b6123a36020830184611f2e565b9392505050565b5f8115159050919050565b6123be816123aa565b82525050565b5f6040820190506123d75f830185611f2e565b6123e460208301846123b5565b9392505050565b5f82825260208201905092915050565b7f426f7444657465637465640000000000000000000000000000000000000000005f82015250565b5f61242f600b836123eb565b915061243a826123fb565b602082019050919050565b5f6020820190508181035f83015261245c81612423565b9050919050565b7f4e6f744c61756e636865640000000000000000000000000000000000000000005f82015250565b5f612497600b836123eb565b91506124a282612463565b602082019050919050565b5f6020820190508181035f8301526124c48161248b565b9050919050565b5f6124d582612068565b91506124e083612068565b92508282039050818111156124f8576124f761225f565b5b92915050565b7f5472616e7366657244656c6179000000000000000000000000000000000000005f82015250565b5f612532600d836123eb565b915061253d826124fe565b602082019050919050565b5f6020820190508181035f83015261255f81612526565b9050919050565b7f4d6178427579416d6f756e7445786365656400000000000000000000000000005f82015250565b5f61259a6012836123eb565b91506125a582612566565b602082019050919050565b5f6020820190508181035f8301526125c78161258e565b9050919050565b5f6125d882612068565b91506125e383612068565b92508282019050808211156125fb576125fa61225f565b5b92915050565b7f4d617857616c6c6574416d6f756e7445786365656400000000000000000000005f82015250565b5f6126356015836123eb565b915061264082612601565b602082019050919050565b5f6020820190508181035f83015261266281612629565b9050919050565b7f4d617853656c6c416d6f756e74457863656564000000000000000000000000005f82015250565b5f61269d6013836123eb565b91506126a882612669565b602082019050919050565b5f6020820190508181035f8301526126ca81612691565b9050919050565b6126da81612068565b82525050565b5f6020820190506126f35f8301846126d1565b92915050565b5f60608201905061270c5f830186611f2e565b61271960208301856126d1565b61272660408301846126d1565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f61277e6127796127748461275b565b612071565b612068565b9050919050565b61278e81612764565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6127c681611f1d565b82525050565b5f6127d783836127bd565b60208301905092915050565b5f602082019050919050565b5f6127f982612794565b612803818561279e565b935061280e836127ae565b805f5b8381101561283e57815161282588826127cc565b9750612830836127e3565b925050600181019050612811565b5085935050505092915050565b5f60a08201905061285e5f8301886126d1565b61286b6020830187612785565b818103604083015261287d81866127ef565b905061288c6060830185611f2e565b61289960808301846126d1565b9695505050505050565b5f81905092915050565b50565b5f6128bb5f836128a3565b91506128c6826128ad565b5f82019050919050565b5f6128da826128b0565b9150819050919050565b60805160a051614beb6129285f395f8181610e7b0152612d6401525f8181610d800152818161147501528181612d0d015281816138fc01526139f50152614beb5ff3fe608060405260043610610338575f3560e01c806395927c25116101aa578063d00efb2f116100f6578063ec3ef93711610094578063f2fde38b1161006e578063f2fde38b14610bcf578063f53bc83514610bf7578063f8b45b0514610c1f578063fd72e22a14610c495761033f565b8063ec3ef93714610b69578063ee5ecc8914610b7f578063ef998cf014610ba75761033f565b8063dcf7aef3116100d0578063dcf7aef314610ab1578063dd62ed3e14610ad9578063e2f4560514610b15578063e6c1909b14610b3f5761033f565b8063d00efb2f14610a35578063d26ed3e314610a5f578063d5759ba314610a875761033f565b8063ad29ffde11610163578063b8eb35461161013d578063b8eb35461461098f578063bc063e1a146109b9578063c04a5414146109e3578063cb96372814610a0d5761033f565b8063ad29ffde14610903578063afa4f3b21461092b578063b62496f5146109535761033f565b806395927c25146107fb57806395d89b41146108235780639a7a23d61461084d5780639c0db5f314610875578063a9059cbb1461089d578063acb2ad6f146108d95761033f565b80634e6fd6c4116102845780636ca541e511610222578063715018a6116101fc578063715018a61461076957806372ac24861461077f578063790ca413146107a75780638da5cb5b146107d15761033f565b80636ca541e5146106d957806370a082311461070357806370db69d61461073f5761033f565b80635932ead11161025e5780635932ead11461062557806359512ab01461064d5780635cce86cd146106755780635d0044ca146106b15761033f565b80634e6fd6c4146105955780634fbee193146105bf578063538ba4f9146105fb5761033f565b80632b14ca56116102f15780633bbac579116102cb5780633bbac579146104dd57806341aea9de14610519578063470624021461054157806349bd5a5e1461056b5761033f565b80632b14ca561461045f578063307aebc914610489578063313ce567146104b35761033f565b806306fdde0314610341578063095ea7b31461036b578063106a5a8f146103a75780631694505e146103cf57806318160ddd146103f957806323b872dd146104235761033f565b3661033f57005b005b34801561034c575f80fd5b50610355610c73565b6040516103629190613c4b565b60405180910390f35b348015610376575f80fd5b50610391600480360381019061038c9190613d00565b610d03565b60405161039e9190613d58565b60405180910390f35b3480156103b2575f80fd5b506103cd60048036038101906103c89190613dfc565b610d25565b005b3480156103da575f80fd5b506103e3610d7e565b6040516103f09190613eb4565b60405180910390f35b348015610404575f80fd5b5061040d610da2565b60405161041a9190613edc565b60405180910390f35b34801561042e575f80fd5b5061044960048036038101906104449190613ef5565b610dab565b6040516104569190613d58565b60405180910390f35b34801561046a575f80fd5b50610473610dd9565b6040516104809190613edc565b60405180910390f35b348015610494575f80fd5b5061049d610ddf565b6040516104aa9190613d58565b60405180910390f35b3480156104be575f80fd5b506104c7610df2565b6040516104d49190613f60565b60405180910390f35b3480156104e8575f80fd5b5061050360048036038101906104fe9190613f79565b610dfa565b6040516105109190613d58565b60405180910390f35b348015610524575f80fd5b5061053f600480360381019061053a9190613fa4565b610e17565b005b34801561054c575f80fd5b50610555610e73565b6040516105629190613edc565b60405180910390f35b348015610576575f80fd5b5061057f610e79565b60405161058c9190613fde565b60405180910390f35b3480156105a0575f80fd5b506105a9610e9d565b6040516105b69190613fde565b60405180910390f35b3480156105ca575f80fd5b506105e560048036038101906105e09190613f79565b610ea3565b6040516105f29190613d58565b60405180910390f35b348015610606575f80fd5b5061060f610ec0565b60405161061c9190613fde565b60405180910390f35b348015610630575f80fd5b5061064b60048036038101906106469190613fa4565b610ec4565b005b348015610658575f80fd5b50610673600480360381019061066e9190613fa4565b610f20565b005b348015610680575f80fd5b5061069b60048036038101906106969190613f79565b610f7c565b6040516106a89190613d58565b60405180910390f35b3480156106bc575f80fd5b506106d760048036038101906106d29190613ff7565b610f99565b005b3480156106e4575f80fd5b506106ed611047565b6040516106fa9190613d58565b60405180910390f35b34801561070e575f80fd5b5061072960048036038101906107249190613f79565b61105a565b6040516107369190613edc565b60405180910390f35b34801561074a575f80fd5b506107536110a0565b6040516107609190613edc565b60405180910390f35b348015610774575f80fd5b5061077d6110a6565b005b34801561078a575f80fd5b506107a560048036038101906107a09190613f79565b6110b9565b005b3480156107b2575f80fd5b506107bb6111f2565b6040516107c89190613edc565b60405180910390f35b3480156107dc575f80fd5b506107e56111f8565b6040516107f29190613fde565b60405180910390f35b348015610806575f80fd5b50610821600480360381019061081c9190613ff7565b61121f565b005b34801561082e575f80fd5b506108376112b5565b6040516108449190613c4b565b60405180910390f35b348015610858575f80fd5b50610873600480360381019061086e9190614022565b611345565b005b348015610880575f80fd5b5061089b60048036038101906108969190613dfc565b6113e5565b005b3480156108a8575f80fd5b506108c360048036038101906108be9190613d00565b6116e7565b6040516108d09190613d58565b60405180910390f35b3480156108e4575f80fd5b506108ed611709565b6040516108fa9190613edc565b60405180910390f35b34801561090e575f80fd5b5061092960048036038101906109249190613dfc565b61170f565b005b348015610936575f80fd5b50610951600480360381019061094c9190613ff7565b611768565b005b34801561095e575f80fd5b5061097960048036038101906109749190613f79565b61187f565b6040516109869190613d58565b60405180910390f35b34801561099a575f80fd5b506109a361189c565b6040516109b09190613edc565b60405180910390f35b3480156109c4575f80fd5b506109cd6118a2565b6040516109da9190613edc565b60405180910390f35b3480156109ee575f80fd5b506109f76118a7565b604051610a049190613fde565b60405180910390f35b348015610a18575f80fd5b50610a336004803603810190610a2e9190613f79565b6118cc565b005b348015610a40575f80fd5b50610a49611b78565b604051610a569190613edc565b60405180910390f35b348015610a6a575f80fd5b50610a856004803603810190610a809190613ff7565b611b7e565b005b348015610a92575f80fd5b50610a9b611c14565b604051610aa89190613d58565b60405180910390f35b348015610abc575f80fd5b50610ad76004803603810190610ad29190613ff7565b611c27565b005b348015610ae4575f80fd5b50610aff6004803603810190610afa9190614060565b611cbd565b604051610b0c9190613edc565b60405180910390f35b348015610b20575f80fd5b50610b29611d3f565b604051610b369190613edc565b60405180910390f35b348015610b4a575f80fd5b50610b53611d45565b604051610b609190613d58565b60405180910390f35b348015610b74575f80fd5b50610b7d611d58565b005b348015610b8a575f80fd5b50610ba56004803603810190610ba09190613f79565b611e07565b005b348015610bb2575f80fd5b50610bcd6004803603810190610bc89190613ff7565b611f40565b005b348015610bda575f80fd5b50610bf56004803603810190610bf09190613f79565b611fee565b005b348015610c02575f80fd5b50610c1d6004803603810190610c189190613ff7565b612072565b005b348015610c2a575f80fd5b50610c33612120565b604051610c409190613edc565b60405180910390f35b348015610c54575f80fd5b50610c5d612126565b604051610c6a9190613fde565b60405180910390f35b606060048054610c82906140cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610cae906140cb565b8015610cf95780601f10610cd057610100808354040283529160200191610cf9565b820191905f5260205f20905b815481529060010190602001808311610cdc57829003601f168201915b5050505050905090565b5f80610d0d61214b565b9050610d1a818585612152565b600191505092915050565b610d2d612164565b5f5b83839050811015610d7857610d6b848483818110610d5057610d4f6140fb565b5b9050602002016020810190610d659190613f79565b836121eb565b8080600101915050610d2f565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f600354905090565b5f80610db561214b565b9050610dc285828561227c565b610dcd85858561230e565b60019150509392505050565b60105481565b600760189054906101000a900460ff1681565b5f6012905090565b6012602052805f5260405f205f915054906101000a900460ff1681565b610e1f612164565b80600760146101000a81548160ff0219169083151502179055507ff771b1e218dc92494b39e21852f9c24c3b448d6697c2b485cc1f0cff3c9ec78181604051610e689190613d58565b60405180910390a150565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b61dead81565b6013602052805f5260405f205f915054906101000a900460ff1681565b5f81565b610ecc612164565b80600760156101000a81548160ff0219169083151502179055507f381fb4c4aa72df83c60e7e567b9b6faf3fc2b05a6da932da9f071d63442c828f81604051610f159190613d58565b60405180910390a150565b610f28612164565b80600760166101000a81548160ff0219169083151502179055507f06cf69227e5c2b5a71319bc3784f6a5355ea0ba2a69bc4c39d64413dfa5a012b81604051610f719190613d58565b60405180910390a150565b6014602052805f5260405f205f915054906101000a900460ff1681565b610fa1612164565b6103e86003610fae610da2565b610fb89190614155565b610fc291906141c3565b811015611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb9061423d565b60405180910390fd5b80600d819055507fa2c87c3e7a3048198ae94e814f6a27e12a4e2a7476e33a0db4d97ffeaf636186600d5460405161103c9190613edc565b60405180910390a150565b600760159054906101000a900460ff1681565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b600b5481565b6110ae612164565b6110b75f6123fe565b565b6110c1612164565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361112f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611126906142a5565b60405180910390fd5b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f2b355c7f17401d9755d704a4cf6149a26deb56a381bb5d06c87b608183dbe09c60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516111e69291906142c3565b60405180910390a15050565b60095481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611227612164565b606381111561126b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126290614334565b60405180910390fd5b5f6010549050816010819055507f125b37650f21d088600cef1223439f6a8bd70800debfd486c503a8a2d19d4b0182826040516112a9929190614352565b60405180910390a15050565b6060600580546112c4906140cb565b80601f01602080910402602001604051908101604052809291908181526020018280546112f0906140cb565b801561133b5780601f106113125761010080835404028352916020019161133b565b820191905f5260205f20905b81548152906001019060200180831161131e57829003601f168201915b5050505050905090565b61134d612164565b60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156113d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ce906143c3565b60405180910390fd5b6113e18282612474565b5050565b6113ed612164565b5f5b838390508110156116e15760155f8585848181106114105761140f6140fb565b5b90506020020160208101906114259190613f79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156114eb57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168484838181106114bd576114bc6140fb565b5b90506020020160208101906114d29190613f79565b73ffffffffffffffffffffffffffffffffffffffff1614155b801561154a57503073ffffffffffffffffffffffffffffffffffffffff1684848381811061151c5761151b6140fb565b5b90506020020160208101906115319190613f79565b73ffffffffffffffffffffffffffffffffffffffff1614155b80156115a957505f73ffffffffffffffffffffffffffffffffffffffff1684848381811061157b5761157a6140fb565b5b90506020020160208101906115909190613f79565b73ffffffffffffffffffffffffffffffffffffffff1614155b801561169d575060135f8585848181106115c6576115c56140fb565b5b90506020020160208101906115db9190613f79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561169c575060145f85858481811061163f5761163e6140fb565b5b90506020020160208101906116549190613f79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b5b156116d4576116d38484838181106116b8576116b76140fb565b5b90506020020160208101906116cd9190613f79565b83612505565b5b80806001019150506113ef565b50505050565b5f806116f161214b565b90506116fe81858561230e565b600191505092915050565b60115481565b611717612164565b5f5b838390508110156117625761175584848381811061173a576117396140fb565b5b905060200201602081019061174f9190613f79565b83612596565b8080600101915050611719565b50505050565b611770612164565b5f611779610da2565b9050620f424060018261178c9190614155565b61179691906141c3565b8210156117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf9061423d565b60405180910390fd5b6103e86005826117e89190614155565b6117f291906141c3565b821115611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b9061442b565b60405180910390fd5b5f600e54905082600e819055507f190dc7c30bc62ef30e35c5f5512ad715a1bd03230f2d89c965249246c8d8ecca8382604051611872929190614352565b60405180910390a1505050565b6015602052805f5260405f205f915054906101000a900460ff1681565b600c5481565b606381565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6118d4612164565b5f3390505f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a01575f4791505f8211611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194990614493565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1682604051611976906144de565b5f6040518083038185875af1925050503d805f81146119b0576040519150601f19603f3d011682016040523d82523d5f602084013e6119b5565b606091505b505080915050806119fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f29061453c565b60405180910390fd5b50611b3a565b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a3a9190613fde565b602060405180830381865afa158015611a55573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a79919061456e565b90505f8111611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab4906145e3565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611af8929190614601565b6020604051808303815f875af1158015611b14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b38919061463c565b505b7f07c81a5e6d155913a9ed2ce53630058179c89fc94bb5de130620b0245c9f6a0b8382604051611b6b929190614601565b60405180910390a1505050565b60085481565b611b86612164565b6032811115611bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc190614334565b60405180910390fd5b5f6011549050816011819055507f8fd531ce6f3cbc5b8cc01a0413b630e3f11569780ee5cf8d0c78e03bca30bc258282604051611c08929190614352565b60405180910390a15050565b600760149054906101000a900460ff1681565b611c2f612164565b6032811115611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90614334565b60405180910390fd5b5f600f54905081600f819055507f5fcc0eea159d45a3b8d481be746c9beed251431a542a5fed4484be37ab783e8d8282604051611cb1929190614352565b60405180910390a15050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b600e5481565b600760169054906101000a900460ff1681565b611d60612164565b600760189054906101000a900460ff1615611db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da7906146b1565b60405180910390fd5b6001600760186101000a81548160ff02191690831515021790555043600881905550426009819055507f02ac8168caf2f254b394bd39e19417c5c28124ab89c9bc2d44921b19808e266960405160405180910390a1565b611e0f612164565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e74906142a5565b60405180910390fd5b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fe20a721838fcbbb3840bd5d97dde1ffeb479fe73d75736fa6fdfc0f220aae00560065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051611f349291906142c3565b60405180910390a15050565b611f48612164565b6103e86002611f55610da2565b611f5f9190614155565b611f6991906141c3565b811015611fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa29061423d565b60405180910390fd5b80600c819055507f3c0ac525ebd597ae4e1201e687d8a7424b740a53b775b1527eb1c1936c1bd3b7600c54604051611fe39190613edc565b60405180910390a150565b611ff6612164565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612066575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161205d9190613fde565b60405180910390fd5b61206f816123fe565b50565b61207a612164565b6103e86002612087610da2565b6120919190614155565b61209b91906141c3565b8110156120dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d49061423d565b60405180910390fd5b80600b819055507f16fd9174d80e7089ed0c10c47c8079476be2ec28b97c4b40846cffd8a7aa9e9f600b546040516121159190613edc565b60405180910390a150565b600d5481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f33905090565b61215f8383836001612627565b505050565b61216c61214b565b73ffffffffffffffffffffffffffffffffffffffff1661218a6111f8565b73ffffffffffffffffffffffffffffffffffffffff16146121e9576121ad61214b565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016121e09190613fde565b60405180910390fd5b565b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc9282826040516122709291906146cf565b60405180910390a15050565b5f6122878484611cbd565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461230857818110156122f9578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016122f0939291906146f6565b60405180910390fd5b61230784848484035f612627565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361237e575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016123759190613fde565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123ee575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016123e59190613fde565b60405180910390fd5b6123f98383836127f6565b505050565b5f6124076111f8565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461245157612446815f612596565b612450815f6121eb565b5b61245c826001612596565b6124678260016121eb565b61247082613566565b5050565b8060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab82826040516124f99291906146cf565b60405180910390a15050565b8060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507ff7f8b40d08076851dfb7cfd6c584ae9a829a570f264abee45e0d7ca342ae8dc8828260405161258a9291906146cf565b60405180910390a15050565b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7828260405161261b9291906146cf565b60405180910390a15050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612697575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161268e9190613fde565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612707575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016126fe9190613fde565b60405180910390fd5b8160025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156127f0578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516127e79190613edc565b60405180910390a35b50505050565b5f3390505f3290505f43905060125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561288c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288390614775565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061290d575060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b61294c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294390614775565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806129b157508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80612a03575060125f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b612a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3990614775565b60405180910390fd5b600760189054906101000a900460ff1680612aa3575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b80612af4575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b612b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2a906147dd565b60405180910390fd5b5f600760149054906101000a900460ff168015612b5d5750600760179054906101000a900460ff16155b8015612c01575060145f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612bff575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b905080156131f857612c116111f8565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614158015612c7f5750612c4f6111f8565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015612cb757505f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015612cf1575061dead73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b156131f757600760159054906101000a900460ff1615612f1d577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612db357507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b15612f1c57600382612dc591906147fb565b60165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054108015612e585750600382612e1891906147fb565b60165f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054105b612e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8e90614878565b60405180910390fd5b8160165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160165f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5b60155f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612fba575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561306157600b54851115613004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ffb906148e0565b60405180910390fd5b600d546130108761105a565b8661301b91906148fe565b111561305c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130539061497b565b60405180910390fd5b6131f6565b60155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156130fe575060145f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561314d57600c54851115613148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313f906149e3565b60405180910390fd5b6131f5565b60145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166131f457600d546131a78761105a565b866131b291906148fe565b11156131f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ea9061497b565b60405180910390fd5b5b5b5b5b5b5f600760169054906101000a900460ff1680156132225750600760179054906101000a900460ff16155b80156132c6575060135f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806132c4575060135f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b905080156134bc575f60155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561332657505f601054115b1561334c5760646010548861333b9190614155565b61334591906141c3565b9050613498565b60155f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156133a357505f600f54115b156133c9576064600f54886133b89190614155565b6133c291906141c3565b9050613497565b60155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015613467575060155f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561347457505f601154115b15613496576064601154886134899190614155565b61349391906141c3565b90505b5b5b5f8111156134ba5780876134ac91906147fb565b96506134b9893083613627565b5b505b5f6134c63061105a565b90505f600e548210159050828015613525575060155f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561352e5750805b1561354f57600a5485111561354e5761354682613843565b84600a819055505b5b61355a8a8a8a613627565b50505050505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613677578060035f82825461366b91906148fe565b92505081905550613747565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613701578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016136f8939291906146f6565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361378e578060035f82825403925050819055506137d9565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516138369190613edc565b60405180910390a3505050565b6001600760176101000a81548160ff0219169083151502179055505f80600267ffffffffffffffff81111561387b5761387a614a01565b5b6040519080825280602002602001820160405280156138a95781602001602082028036833780820191505090505b50905030815f815181106138c0576138bf6140fb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613963573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139879190614a42565b8160018151811061399b5761399a6140fb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f6014600e546139e59190614155565b9050808411156139f3578093505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac947855f8530426040518663ffffffff1660e01b8152600401613a54959493929190614b5d565b5f604051808303815f87803b158015613a6b575f80fd5b505af1158015613a7d573d5f803e3d5ffd5b505050505f4790505f600582613a9391906141c3565b90505f8183613aa291906147fb565b905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051613ae9906144de565b5f6040518083038185875af1925050503d805f8114613b23576040519150601f19603f3d011682016040523d82523d5f602084013e613b28565b606091505b50508096505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051613b73906144de565b5f6040518083038185875af1925050503d805f8114613bad576040519150601f19603f3d011682016040523d82523d5f602084013e613bb2565b606091505b5050809650505050505050505f600760176101000a81548160ff02191690831515021790555050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f613c1d82613bdb565b613c278185613be5565b9350613c37818560208601613bf5565b613c4081613c03565b840191505092915050565b5f6020820190508181035f830152613c638184613c13565b905092915050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613c9c82613c73565b9050919050565b613cac81613c92565b8114613cb6575f80fd5b50565b5f81359050613cc781613ca3565b92915050565b5f819050919050565b613cdf81613ccd565b8114613ce9575f80fd5b50565b5f81359050613cfa81613cd6565b92915050565b5f8060408385031215613d1657613d15613c6b565b5b5f613d2385828601613cb9565b9250506020613d3485828601613cec565b9150509250929050565b5f8115159050919050565b613d5281613d3e565b82525050565b5f602082019050613d6b5f830184613d49565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112613d9257613d91613d71565b5b8235905067ffffffffffffffff811115613daf57613dae613d75565b5b602083019150836020820283011115613dcb57613dca613d79565b5b9250929050565b613ddb81613d3e565b8114613de5575f80fd5b50565b5f81359050613df681613dd2565b92915050565b5f805f60408486031215613e1357613e12613c6b565b5b5f84013567ffffffffffffffff811115613e3057613e2f613c6f565b5b613e3c86828701613d7d565b93509350506020613e4f86828701613de8565b9150509250925092565b5f819050919050565b5f613e7c613e77613e7284613c73565b613e59565b613c73565b9050919050565b5f613e8d82613e62565b9050919050565b5f613e9e82613e83565b9050919050565b613eae81613e94565b82525050565b5f602082019050613ec75f830184613ea5565b92915050565b613ed681613ccd565b82525050565b5f602082019050613eef5f830184613ecd565b92915050565b5f805f60608486031215613f0c57613f0b613c6b565b5b5f613f1986828701613cb9565b9350506020613f2a86828701613cb9565b9250506040613f3b86828701613cec565b9150509250925092565b5f60ff82169050919050565b613f5a81613f45565b82525050565b5f602082019050613f735f830184613f51565b92915050565b5f60208284031215613f8e57613f8d613c6b565b5b5f613f9b84828501613cb9565b91505092915050565b5f60208284031215613fb957613fb8613c6b565b5b5f613fc684828501613de8565b91505092915050565b613fd881613c92565b82525050565b5f602082019050613ff15f830184613fcf565b92915050565b5f6020828403121561400c5761400b613c6b565b5b5f61401984828501613cec565b91505092915050565b5f806040838503121561403857614037613c6b565b5b5f61404585828601613cb9565b925050602061405685828601613de8565b9150509250929050565b5f806040838503121561407657614075613c6b565b5b5f61408385828601613cb9565b925050602061409485828601613cb9565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806140e257607f821691505b6020821081036140f5576140f461409e565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61415f82613ccd565b915061416a83613ccd565b925082820261417881613ccd565b9150828204841483151761418f5761418e614128565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6141cd82613ccd565b91506141d883613ccd565b9250826141e8576141e7614196565b5b828204905092915050565b7f416d6f756e74546f6f4c6f7700000000000000000000000000000000000000005f82015250565b5f614227600c83613be5565b9150614232826141f3565b602082019050919050565b5f6020820190508181035f8301526142548161421b565b9050919050565b7f41646472657373205a65726f00000000000000000000000000000000000000005f82015250565b5f61428f600c83613be5565b915061429a8261425b565b602082019050919050565b5f6020820190508181035f8301526142bc81614283565b9050919050565b5f6040820190506142d65f830185613fcf565b6142e36020830184613fcf565b9392505050565b7f466565546f6f48696768000000000000000000000000000000000000000000005f82015250565b5f61431e600a83613be5565b9150614329826142ea565b602082019050919050565b5f6020820190508181035f83015261434b81614312565b9050919050565b5f6040820190506143655f830185613ecd565b6143726020830184613ecd565b9392505050565b7f414d4d416c7265616479536574000000000000000000000000000000000000005f82015250565b5f6143ad600d83613be5565b91506143b882614379565b602082019050919050565b5f6020820190508181035f8301526143da816143a1565b9050919050565b7f416d6f756e74546f6f48696768000000000000000000000000000000000000005f82015250565b5f614415600d83613be5565b9150614420826143e1565b602082019050919050565b5f6020820190508181035f83015261444281614409565b9050919050565b7f4e6f4e6174697665546f6b656e730000000000000000000000000000000000005f82015250565b5f61447d600e83613be5565b915061448882614449565b602082019050919050565b5f6020820190508181035f8301526144aa81614471565b9050919050565b5f81905092915050565b50565b5f6144c95f836144b1565b91506144d4826144bb565b5f82019050919050565b5f6144e8826144be565b9150819050919050565b7f4661696c6564546f57697468647261774e6174697665546f6b656e73000000005f82015250565b5f614526601c83613be5565b9150614531826144f2565b602082019050919050565b5f6020820190508181035f8301526145538161451a565b9050919050565b5f8151905061456881613cd6565b92915050565b5f6020828403121561458357614582613c6b565b5b5f6145908482850161455a565b91505092915050565b7f4e6f546f6b656e730000000000000000000000000000000000000000000000005f82015250565b5f6145cd600883613be5565b91506145d882614599565b602082019050919050565b5f6020820190508181035f8301526145fa816145c1565b9050919050565b5f6040820190506146145f830185613fcf565b6146216020830184613ecd565b9392505050565b5f8151905061463681613dd2565b92915050565b5f6020828403121561465157614650613c6b565b5b5f61465e84828501614628565b91505092915050565b7f416c7265616479204c61756e63686564000000000000000000000000000000005f82015250565b5f61469b601083613be5565b91506146a682614667565b602082019050919050565b5f6020820190508181035f8301526146c88161468f565b9050919050565b5f6040820190506146e25f830185613fcf565b6146ef6020830184613d49565b9392505050565b5f6060820190506147095f830186613fcf565b6147166020830185613ecd565b6147236040830184613ecd565b949350505050565b7f426f7444657465637465640000000000000000000000000000000000000000005f82015250565b5f61475f600b83613be5565b915061476a8261472b565b602082019050919050565b5f6020820190508181035f83015261478c81614753565b9050919050565b7f4e6f744c61756e636865640000000000000000000000000000000000000000005f82015250565b5f6147c7600b83613be5565b91506147d282614793565b602082019050919050565b5f6020820190508181035f8301526147f4816147bb565b9050919050565b5f61480582613ccd565b915061481083613ccd565b925082820390508181111561482857614827614128565b5b92915050565b7f5472616e7366657244656c6179000000000000000000000000000000000000005f82015250565b5f614862600d83613be5565b915061486d8261482e565b602082019050919050565b5f6020820190508181035f83015261488f81614856565b9050919050565b7f4d6178427579416d6f756e7445786365656400000000000000000000000000005f82015250565b5f6148ca601283613be5565b91506148d582614896565b602082019050919050565b5f6020820190508181035f8301526148f7816148be565b9050919050565b5f61490882613ccd565b915061491383613ccd565b925082820190508082111561492b5761492a614128565b5b92915050565b7f4d617857616c6c6574416d6f756e7445786365656400000000000000000000005f82015250565b5f614965601583613be5565b915061497082614931565b602082019050919050565b5f6020820190508181035f83015261499281614959565b9050919050565b7f4d617853656c6c416d6f756e74457863656564000000000000000000000000005f82015250565b5f6149cd601383613be5565b91506149d882614999565b602082019050919050565b5f6020820190508181035f8301526149fa816149c1565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f81519050614a3c81613ca3565b92915050565b5f60208284031215614a5757614a56613c6b565b5b5f614a6484828501614a2e565b91505092915050565b5f819050919050565b5f614a90614a8b614a8684614a6d565b613e59565b613ccd565b9050919050565b614aa081614a76565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614ad881613c92565b82525050565b5f614ae98383614acf565b60208301905092915050565b5f602082019050919050565b5f614b0b82614aa6565b614b158185614ab0565b9350614b2083614ac0565b805f5b83811015614b50578151614b378882614ade565b9750614b4283614af5565b925050600181019050614b23565b5085935050505092915050565b5f60a082019050614b705f830188613ecd565b614b7d6020830187614a97565b8181036040830152614b8f8186614b01565b9050614b9e6060830185613fcf565b614bab6080830184613ecd565b969550505050505056fea2646970667358221220a038e8869df2517e8cbad2f3446525d2a6a2fc32d395188f28690e91f2b1c47a64736f6c63430008190033

Deployed Bytecode

0x608060405260043610610338575f3560e01c806395927c25116101aa578063d00efb2f116100f6578063ec3ef93711610094578063f2fde38b1161006e578063f2fde38b14610bcf578063f53bc83514610bf7578063f8b45b0514610c1f578063fd72e22a14610c495761033f565b8063ec3ef93714610b69578063ee5ecc8914610b7f578063ef998cf014610ba75761033f565b8063dcf7aef3116100d0578063dcf7aef314610ab1578063dd62ed3e14610ad9578063e2f4560514610b15578063e6c1909b14610b3f5761033f565b8063d00efb2f14610a35578063d26ed3e314610a5f578063d5759ba314610a875761033f565b8063ad29ffde11610163578063b8eb35461161013d578063b8eb35461461098f578063bc063e1a146109b9578063c04a5414146109e3578063cb96372814610a0d5761033f565b8063ad29ffde14610903578063afa4f3b21461092b578063b62496f5146109535761033f565b806395927c25146107fb57806395d89b41146108235780639a7a23d61461084d5780639c0db5f314610875578063a9059cbb1461089d578063acb2ad6f146108d95761033f565b80634e6fd6c4116102845780636ca541e511610222578063715018a6116101fc578063715018a61461076957806372ac24861461077f578063790ca413146107a75780638da5cb5b146107d15761033f565b80636ca541e5146106d957806370a082311461070357806370db69d61461073f5761033f565b80635932ead11161025e5780635932ead11461062557806359512ab01461064d5780635cce86cd146106755780635d0044ca146106b15761033f565b80634e6fd6c4146105955780634fbee193146105bf578063538ba4f9146105fb5761033f565b80632b14ca56116102f15780633bbac579116102cb5780633bbac579146104dd57806341aea9de14610519578063470624021461054157806349bd5a5e1461056b5761033f565b80632b14ca561461045f578063307aebc914610489578063313ce567146104b35761033f565b806306fdde0314610341578063095ea7b31461036b578063106a5a8f146103a75780631694505e146103cf57806318160ddd146103f957806323b872dd146104235761033f565b3661033f57005b005b34801561034c575f80fd5b50610355610c73565b6040516103629190613c4b565b60405180910390f35b348015610376575f80fd5b50610391600480360381019061038c9190613d00565b610d03565b60405161039e9190613d58565b60405180910390f35b3480156103b2575f80fd5b506103cd60048036038101906103c89190613dfc565b610d25565b005b3480156103da575f80fd5b506103e3610d7e565b6040516103f09190613eb4565b60405180910390f35b348015610404575f80fd5b5061040d610da2565b60405161041a9190613edc565b60405180910390f35b34801561042e575f80fd5b5061044960048036038101906104449190613ef5565b610dab565b6040516104569190613d58565b60405180910390f35b34801561046a575f80fd5b50610473610dd9565b6040516104809190613edc565b60405180910390f35b348015610494575f80fd5b5061049d610ddf565b6040516104aa9190613d58565b60405180910390f35b3480156104be575f80fd5b506104c7610df2565b6040516104d49190613f60565b60405180910390f35b3480156104e8575f80fd5b5061050360048036038101906104fe9190613f79565b610dfa565b6040516105109190613d58565b60405180910390f35b348015610524575f80fd5b5061053f600480360381019061053a9190613fa4565b610e17565b005b34801561054c575f80fd5b50610555610e73565b6040516105629190613edc565b60405180910390f35b348015610576575f80fd5b5061057f610e79565b60405161058c9190613fde565b60405180910390f35b3480156105a0575f80fd5b506105a9610e9d565b6040516105b69190613fde565b60405180910390f35b3480156105ca575f80fd5b506105e560048036038101906105e09190613f79565b610ea3565b6040516105f29190613d58565b60405180910390f35b348015610606575f80fd5b5061060f610ec0565b60405161061c9190613fde565b60405180910390f35b348015610630575f80fd5b5061064b60048036038101906106469190613fa4565b610ec4565b005b348015610658575f80fd5b50610673600480360381019061066e9190613fa4565b610f20565b005b348015610680575f80fd5b5061069b60048036038101906106969190613f79565b610f7c565b6040516106a89190613d58565b60405180910390f35b3480156106bc575f80fd5b506106d760048036038101906106d29190613ff7565b610f99565b005b3480156106e4575f80fd5b506106ed611047565b6040516106fa9190613d58565b60405180910390f35b34801561070e575f80fd5b5061072960048036038101906107249190613f79565b61105a565b6040516107369190613edc565b60405180910390f35b34801561074a575f80fd5b506107536110a0565b6040516107609190613edc565b60405180910390f35b348015610774575f80fd5b5061077d6110a6565b005b34801561078a575f80fd5b506107a560048036038101906107a09190613f79565b6110b9565b005b3480156107b2575f80fd5b506107bb6111f2565b6040516107c89190613edc565b60405180910390f35b3480156107dc575f80fd5b506107e56111f8565b6040516107f29190613fde565b60405180910390f35b348015610806575f80fd5b50610821600480360381019061081c9190613ff7565b61121f565b005b34801561082e575f80fd5b506108376112b5565b6040516108449190613c4b565b60405180910390f35b348015610858575f80fd5b50610873600480360381019061086e9190614022565b611345565b005b348015610880575f80fd5b5061089b60048036038101906108969190613dfc565b6113e5565b005b3480156108a8575f80fd5b506108c360048036038101906108be9190613d00565b6116e7565b6040516108d09190613d58565b60405180910390f35b3480156108e4575f80fd5b506108ed611709565b6040516108fa9190613edc565b60405180910390f35b34801561090e575f80fd5b5061092960048036038101906109249190613dfc565b61170f565b005b348015610936575f80fd5b50610951600480360381019061094c9190613ff7565b611768565b005b34801561095e575f80fd5b5061097960048036038101906109749190613f79565b61187f565b6040516109869190613d58565b60405180910390f35b34801561099a575f80fd5b506109a361189c565b6040516109b09190613edc565b60405180910390f35b3480156109c4575f80fd5b506109cd6118a2565b6040516109da9190613edc565b60405180910390f35b3480156109ee575f80fd5b506109f76118a7565b604051610a049190613fde565b60405180910390f35b348015610a18575f80fd5b50610a336004803603810190610a2e9190613f79565b6118cc565b005b348015610a40575f80fd5b50610a49611b78565b604051610a569190613edc565b60405180910390f35b348015610a6a575f80fd5b50610a856004803603810190610a809190613ff7565b611b7e565b005b348015610a92575f80fd5b50610a9b611c14565b604051610aa89190613d58565b60405180910390f35b348015610abc575f80fd5b50610ad76004803603810190610ad29190613ff7565b611c27565b005b348015610ae4575f80fd5b50610aff6004803603810190610afa9190614060565b611cbd565b604051610b0c9190613edc565b60405180910390f35b348015610b20575f80fd5b50610b29611d3f565b604051610b369190613edc565b60405180910390f35b348015610b4a575f80fd5b50610b53611d45565b604051610b609190613d58565b60405180910390f35b348015610b74575f80fd5b50610b7d611d58565b005b348015610b8a575f80fd5b50610ba56004803603810190610ba09190613f79565b611e07565b005b348015610bb2575f80fd5b50610bcd6004803603810190610bc89190613ff7565b611f40565b005b348015610bda575f80fd5b50610bf56004803603810190610bf09190613f79565b611fee565b005b348015610c02575f80fd5b50610c1d6004803603810190610c189190613ff7565b612072565b005b348015610c2a575f80fd5b50610c33612120565b604051610c409190613edc565b60405180910390f35b348015610c54575f80fd5b50610c5d612126565b604051610c6a9190613fde565b60405180910390f35b606060048054610c82906140cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610cae906140cb565b8015610cf95780601f10610cd057610100808354040283529160200191610cf9565b820191905f5260205f20905b815481529060010190602001808311610cdc57829003601f168201915b5050505050905090565b5f80610d0d61214b565b9050610d1a818585612152565b600191505092915050565b610d2d612164565b5f5b83839050811015610d7857610d6b848483818110610d5057610d4f6140fb565b5b9050602002016020810190610d659190613f79565b836121eb565b8080600101915050610d2f565b50505050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b5f600354905090565b5f80610db561214b565b9050610dc285828561227c565b610dcd85858561230e565b60019150509392505050565b60105481565b600760189054906101000a900460ff1681565b5f6012905090565b6012602052805f5260405f205f915054906101000a900460ff1681565b610e1f612164565b80600760146101000a81548160ff0219169083151502179055507ff771b1e218dc92494b39e21852f9c24c3b448d6697c2b485cc1f0cff3c9ec78181604051610e689190613d58565b60405180910390a150565b600f5481565b7f000000000000000000000000513c958143abd5d2ddb2bdda58e849efdf6f0d2f81565b61dead81565b6013602052805f5260405f205f915054906101000a900460ff1681565b5f81565b610ecc612164565b80600760156101000a81548160ff0219169083151502179055507f381fb4c4aa72df83c60e7e567b9b6faf3fc2b05a6da932da9f071d63442c828f81604051610f159190613d58565b60405180910390a150565b610f28612164565b80600760166101000a81548160ff0219169083151502179055507f06cf69227e5c2b5a71319bc3784f6a5355ea0ba2a69bc4c39d64413dfa5a012b81604051610f719190613d58565b60405180910390a150565b6014602052805f5260405f205f915054906101000a900460ff1681565b610fa1612164565b6103e86003610fae610da2565b610fb89190614155565b610fc291906141c3565b811015611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb9061423d565b60405180910390fd5b80600d819055507fa2c87c3e7a3048198ae94e814f6a27e12a4e2a7476e33a0db4d97ffeaf636186600d5460405161103c9190613edc565b60405180910390a150565b600760159054906101000a900460ff1681565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b600b5481565b6110ae612164565b6110b75f6123fe565b565b6110c1612164565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361112f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611126906142a5565b60405180910390fd5b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f2b355c7f17401d9755d704a4cf6149a26deb56a381bb5d06c87b608183dbe09c60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516111e69291906142c3565b60405180910390a15050565b60095481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611227612164565b606381111561126b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126290614334565b60405180910390fd5b5f6010549050816010819055507f125b37650f21d088600cef1223439f6a8bd70800debfd486c503a8a2d19d4b0182826040516112a9929190614352565b60405180910390a15050565b6060600580546112c4906140cb565b80601f01602080910402602001604051908101604052809291908181526020018280546112f0906140cb565b801561133b5780601f106113125761010080835404028352916020019161133b565b820191905f5260205f20905b81548152906001019060200180831161131e57829003601f168201915b5050505050905090565b61134d612164565b60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156113d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ce906143c3565b60405180910390fd5b6113e18282612474565b5050565b6113ed612164565b5f5b838390508110156116e15760155f8585848181106114105761140f6140fb565b5b90506020020160208101906114259190613f79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156114eb57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168484838181106114bd576114bc6140fb565b5b90506020020160208101906114d29190613f79565b73ffffffffffffffffffffffffffffffffffffffff1614155b801561154a57503073ffffffffffffffffffffffffffffffffffffffff1684848381811061151c5761151b6140fb565b5b90506020020160208101906115319190613f79565b73ffffffffffffffffffffffffffffffffffffffff1614155b80156115a957505f73ffffffffffffffffffffffffffffffffffffffff1684848381811061157b5761157a6140fb565b5b90506020020160208101906115909190613f79565b73ffffffffffffffffffffffffffffffffffffffff1614155b801561169d575060135f8585848181106115c6576115c56140fb565b5b90506020020160208101906115db9190613f79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561169c575060145f85858481811061163f5761163e6140fb565b5b90506020020160208101906116549190613f79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b5b156116d4576116d38484838181106116b8576116b76140fb565b5b90506020020160208101906116cd9190613f79565b83612505565b5b80806001019150506113ef565b50505050565b5f806116f161214b565b90506116fe81858561230e565b600191505092915050565b60115481565b611717612164565b5f5b838390508110156117625761175584848381811061173a576117396140fb565b5b905060200201602081019061174f9190613f79565b83612596565b8080600101915050611719565b50505050565b611770612164565b5f611779610da2565b9050620f424060018261178c9190614155565b61179691906141c3565b8210156117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf9061423d565b60405180910390fd5b6103e86005826117e89190614155565b6117f291906141c3565b821115611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b9061442b565b60405180910390fd5b5f600e54905082600e819055507f190dc7c30bc62ef30e35c5f5512ad715a1bd03230f2d89c965249246c8d8ecca8382604051611872929190614352565b60405180910390a1505050565b6015602052805f5260405f205f915054906101000a900460ff1681565b600c5481565b606381565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6118d4612164565b5f3390505f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a01575f4791505f8211611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194990614493565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1682604051611976906144de565b5f6040518083038185875af1925050503d805f81146119b0576040519150601f19603f3d011682016040523d82523d5f602084013e6119b5565b606091505b505080915050806119fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f29061453c565b60405180910390fd5b50611b3a565b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a3a9190613fde565b602060405180830381865afa158015611a55573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a79919061456e565b90505f8111611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab4906145e3565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611af8929190614601565b6020604051808303815f875af1158015611b14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b38919061463c565b505b7f07c81a5e6d155913a9ed2ce53630058179c89fc94bb5de130620b0245c9f6a0b8382604051611b6b929190614601565b60405180910390a1505050565b60085481565b611b86612164565b6032811115611bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc190614334565b60405180910390fd5b5f6011549050816011819055507f8fd531ce6f3cbc5b8cc01a0413b630e3f11569780ee5cf8d0c78e03bca30bc258282604051611c08929190614352565b60405180910390a15050565b600760149054906101000a900460ff1681565b611c2f612164565b6032811115611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90614334565b60405180910390fd5b5f600f54905081600f819055507f5fcc0eea159d45a3b8d481be746c9beed251431a542a5fed4484be37ab783e8d8282604051611cb1929190614352565b60405180910390a15050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b600e5481565b600760169054906101000a900460ff1681565b611d60612164565b600760189054906101000a900460ff1615611db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da7906146b1565b60405180910390fd5b6001600760186101000a81548160ff02191690831515021790555043600881905550426009819055507f02ac8168caf2f254b394bd39e19417c5c28124ab89c9bc2d44921b19808e266960405160405180910390a1565b611e0f612164565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e74906142a5565b60405180910390fd5b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fe20a721838fcbbb3840bd5d97dde1ffeb479fe73d75736fa6fdfc0f220aae00560065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051611f349291906142c3565b60405180910390a15050565b611f48612164565b6103e86002611f55610da2565b611f5f9190614155565b611f6991906141c3565b811015611fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa29061423d565b60405180910390fd5b80600c819055507f3c0ac525ebd597ae4e1201e687d8a7424b740a53b775b1527eb1c1936c1bd3b7600c54604051611fe39190613edc565b60405180910390a150565b611ff6612164565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612066575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161205d9190613fde565b60405180910390fd5b61206f816123fe565b50565b61207a612164565b6103e86002612087610da2565b6120919190614155565b61209b91906141c3565b8110156120dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d49061423d565b60405180910390fd5b80600b819055507f16fd9174d80e7089ed0c10c47c8079476be2ec28b97c4b40846cffd8a7aa9e9f600b546040516121159190613edc565b60405180910390a150565b600d5481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f33905090565b61215f8383836001612627565b505050565b61216c61214b565b73ffffffffffffffffffffffffffffffffffffffff1661218a6111f8565b73ffffffffffffffffffffffffffffffffffffffff16146121e9576121ad61214b565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016121e09190613fde565b60405180910390fd5b565b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc9282826040516122709291906146cf565b60405180910390a15050565b5f6122878484611cbd565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461230857818110156122f9578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016122f0939291906146f6565b60405180910390fd5b61230784848484035f612627565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361237e575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016123759190613fde565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123ee575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016123e59190613fde565b60405180910390fd5b6123f98383836127f6565b505050565b5f6124076111f8565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461245157612446815f612596565b612450815f6121eb565b5b61245c826001612596565b6124678260016121eb565b61247082613566565b5050565b8060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab82826040516124f99291906146cf565b60405180910390a15050565b8060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507ff7f8b40d08076851dfb7cfd6c584ae9a829a570f264abee45e0d7ca342ae8dc8828260405161258a9291906146cf565b60405180910390a15050565b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7828260405161261b9291906146cf565b60405180910390a15050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612697575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161268e9190613fde565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612707575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016126fe9190613fde565b60405180910390fd5b8160025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156127f0578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516127e79190613edc565b60405180910390a35b50505050565b5f3390505f3290505f43905060125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561288c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288390614775565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061290d575060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b61294c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294390614775565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806129b157508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80612a03575060125f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b612a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3990614775565b60405180910390fd5b600760189054906101000a900460ff1680612aa3575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b80612af4575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b612b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2a906147dd565b60405180910390fd5b5f600760149054906101000a900460ff168015612b5d5750600760179054906101000a900460ff16155b8015612c01575060145f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612bff575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b905080156131f857612c116111f8565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614158015612c7f5750612c4f6111f8565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015612cb757505f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015612cf1575061dead73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b156131f757600760159054906101000a900460ff1615612f1d577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612db357507f000000000000000000000000513c958143abd5d2ddb2bdda58e849efdf6f0d2f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b15612f1c57600382612dc591906147fb565b60165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054108015612e585750600382612e1891906147fb565b60165f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054105b612e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8e90614878565b60405180910390fd5b8160165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160165f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5b60155f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612fba575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561306157600b54851115613004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ffb906148e0565b60405180910390fd5b600d546130108761105a565b8661301b91906148fe565b111561305c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130539061497b565b60405180910390fd5b6131f6565b60155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156130fe575060145f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561314d57600c54851115613148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313f906149e3565b60405180910390fd5b6131f5565b60145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166131f457600d546131a78761105a565b866131b291906148fe565b11156131f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ea9061497b565b60405180910390fd5b5b5b5b5b5b5f600760169054906101000a900460ff1680156132225750600760179054906101000a900460ff16155b80156132c6575060135f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806132c4575060135f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b905080156134bc575f60155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561332657505f601054115b1561334c5760646010548861333b9190614155565b61334591906141c3565b9050613498565b60155f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156133a357505f600f54115b156133c9576064600f54886133b89190614155565b6133c291906141c3565b9050613497565b60155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015613467575060155f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561347457505f601154115b15613496576064601154886134899190614155565b61349391906141c3565b90505b5b5b5f8111156134ba5780876134ac91906147fb565b96506134b9893083613627565b5b505b5f6134c63061105a565b90505f600e548210159050828015613525575060155f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561352e5750805b1561354f57600a5485111561354e5761354682613843565b84600a819055505b5b61355a8a8a8a613627565b50505050505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613677578060035f82825461366b91906148fe565b92505081905550613747565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613701578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016136f8939291906146f6565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361378e578060035f82825403925050819055506137d9565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516138369190613edc565b60405180910390a3505050565b6001600760176101000a81548160ff0219169083151502179055505f80600267ffffffffffffffff81111561387b5761387a614a01565b5b6040519080825280602002602001820160405280156138a95781602001602082028036833780820191505090505b50905030815f815181106138c0576138bf6140fb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613963573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139879190614a42565b8160018151811061399b5761399a6140fb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f6014600e546139e59190614155565b9050808411156139f3578093505b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947855f8530426040518663ffffffff1660e01b8152600401613a54959493929190614b5d565b5f604051808303815f87803b158015613a6b575f80fd5b505af1158015613a7d573d5f803e3d5ffd5b505050505f4790505f600582613a9391906141c3565b90505f8183613aa291906147fb565b905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051613ae9906144de565b5f6040518083038185875af1925050503d805f8114613b23576040519150601f19603f3d011682016040523d82523d5f602084013e613b28565b606091505b50508096505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051613b73906144de565b5f6040518083038185875af1925050503d805f8114613bad576040519150601f19603f3d011682016040523d82523d5f602084013e613bb2565b606091505b5050809650505050505050505f600760176101000a81548160ff02191690831515021790555050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f613c1d82613bdb565b613c278185613be5565b9350613c37818560208601613bf5565b613c4081613c03565b840191505092915050565b5f6020820190508181035f830152613c638184613c13565b905092915050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613c9c82613c73565b9050919050565b613cac81613c92565b8114613cb6575f80fd5b50565b5f81359050613cc781613ca3565b92915050565b5f819050919050565b613cdf81613ccd565b8114613ce9575f80fd5b50565b5f81359050613cfa81613cd6565b92915050565b5f8060408385031215613d1657613d15613c6b565b5b5f613d2385828601613cb9565b9250506020613d3485828601613cec565b9150509250929050565b5f8115159050919050565b613d5281613d3e565b82525050565b5f602082019050613d6b5f830184613d49565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112613d9257613d91613d71565b5b8235905067ffffffffffffffff811115613daf57613dae613d75565b5b602083019150836020820283011115613dcb57613dca613d79565b5b9250929050565b613ddb81613d3e565b8114613de5575f80fd5b50565b5f81359050613df681613dd2565b92915050565b5f805f60408486031215613e1357613e12613c6b565b5b5f84013567ffffffffffffffff811115613e3057613e2f613c6f565b5b613e3c86828701613d7d565b93509350506020613e4f86828701613de8565b9150509250925092565b5f819050919050565b5f613e7c613e77613e7284613c73565b613e59565b613c73565b9050919050565b5f613e8d82613e62565b9050919050565b5f613e9e82613e83565b9050919050565b613eae81613e94565b82525050565b5f602082019050613ec75f830184613ea5565b92915050565b613ed681613ccd565b82525050565b5f602082019050613eef5f830184613ecd565b92915050565b5f805f60608486031215613f0c57613f0b613c6b565b5b5f613f1986828701613cb9565b9350506020613f2a86828701613cb9565b9250506040613f3b86828701613cec565b9150509250925092565b5f60ff82169050919050565b613f5a81613f45565b82525050565b5f602082019050613f735f830184613f51565b92915050565b5f60208284031215613f8e57613f8d613c6b565b5b5f613f9b84828501613cb9565b91505092915050565b5f60208284031215613fb957613fb8613c6b565b5b5f613fc684828501613de8565b91505092915050565b613fd881613c92565b82525050565b5f602082019050613ff15f830184613fcf565b92915050565b5f6020828403121561400c5761400b613c6b565b5b5f61401984828501613cec565b91505092915050565b5f806040838503121561403857614037613c6b565b5b5f61404585828601613cb9565b925050602061405685828601613de8565b9150509250929050565b5f806040838503121561407657614075613c6b565b5b5f61408385828601613cb9565b925050602061409485828601613cb9565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806140e257607f821691505b6020821081036140f5576140f461409e565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61415f82613ccd565b915061416a83613ccd565b925082820261417881613ccd565b9150828204841483151761418f5761418e614128565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6141cd82613ccd565b91506141d883613ccd565b9250826141e8576141e7614196565b5b828204905092915050565b7f416d6f756e74546f6f4c6f7700000000000000000000000000000000000000005f82015250565b5f614227600c83613be5565b9150614232826141f3565b602082019050919050565b5f6020820190508181035f8301526142548161421b565b9050919050565b7f41646472657373205a65726f00000000000000000000000000000000000000005f82015250565b5f61428f600c83613be5565b915061429a8261425b565b602082019050919050565b5f6020820190508181035f8301526142bc81614283565b9050919050565b5f6040820190506142d65f830185613fcf565b6142e36020830184613fcf565b9392505050565b7f466565546f6f48696768000000000000000000000000000000000000000000005f82015250565b5f61431e600a83613be5565b9150614329826142ea565b602082019050919050565b5f6020820190508181035f83015261434b81614312565b9050919050565b5f6040820190506143655f830185613ecd565b6143726020830184613ecd565b9392505050565b7f414d4d416c7265616479536574000000000000000000000000000000000000005f82015250565b5f6143ad600d83613be5565b91506143b882614379565b602082019050919050565b5f6020820190508181035f8301526143da816143a1565b9050919050565b7f416d6f756e74546f6f48696768000000000000000000000000000000000000005f82015250565b5f614415600d83613be5565b9150614420826143e1565b602082019050919050565b5f6020820190508181035f83015261444281614409565b9050919050565b7f4e6f4e6174697665546f6b656e730000000000000000000000000000000000005f82015250565b5f61447d600e83613be5565b915061448882614449565b602082019050919050565b5f6020820190508181035f8301526144aa81614471565b9050919050565b5f81905092915050565b50565b5f6144c95f836144b1565b91506144d4826144bb565b5f82019050919050565b5f6144e8826144be565b9150819050919050565b7f4661696c6564546f57697468647261774e6174697665546f6b656e73000000005f82015250565b5f614526601c83613be5565b9150614531826144f2565b602082019050919050565b5f6020820190508181035f8301526145538161451a565b9050919050565b5f8151905061456881613cd6565b92915050565b5f6020828403121561458357614582613c6b565b5b5f6145908482850161455a565b91505092915050565b7f4e6f546f6b656e730000000000000000000000000000000000000000000000005f82015250565b5f6145cd600883613be5565b91506145d882614599565b602082019050919050565b5f6020820190508181035f8301526145fa816145c1565b9050919050565b5f6040820190506146145f830185613fcf565b6146216020830184613ecd565b9392505050565b5f8151905061463681613dd2565b92915050565b5f6020828403121561465157614650613c6b565b5b5f61465e84828501614628565b91505092915050565b7f416c7265616479204c61756e63686564000000000000000000000000000000005f82015250565b5f61469b601083613be5565b91506146a682614667565b602082019050919050565b5f6020820190508181035f8301526146c88161468f565b9050919050565b5f6040820190506146e25f830185613fcf565b6146ef6020830184613d49565b9392505050565b5f6060820190506147095f830186613fcf565b6147166020830185613ecd565b6147236040830184613ecd565b949350505050565b7f426f7444657465637465640000000000000000000000000000000000000000005f82015250565b5f61475f600b83613be5565b915061476a8261472b565b602082019050919050565b5f6020820190508181035f83015261478c81614753565b9050919050565b7f4e6f744c61756e636865640000000000000000000000000000000000000000005f82015250565b5f6147c7600b83613be5565b91506147d282614793565b602082019050919050565b5f6020820190508181035f8301526147f4816147bb565b9050919050565b5f61480582613ccd565b915061481083613ccd565b925082820390508181111561482857614827614128565b5b92915050565b7f5472616e7366657244656c6179000000000000000000000000000000000000005f82015250565b5f614862600d83613be5565b915061486d8261482e565b602082019050919050565b5f6020820190508181035f83015261488f81614856565b9050919050565b7f4d6178427579416d6f756e7445786365656400000000000000000000000000005f82015250565b5f6148ca601283613be5565b91506148d582614896565b602082019050919050565b5f6020820190508181035f8301526148f7816148be565b9050919050565b5f61490882613ccd565b915061491383613ccd565b925082820190508082111561492b5761492a614128565b5b92915050565b7f4d617857616c6c6574416d6f756e7445786365656400000000000000000000005f82015250565b5f614965601583613be5565b915061497082614931565b602082019050919050565b5f6020820190508181035f83015261499281614959565b9050919050565b7f4d617853656c6c416d6f756e74457863656564000000000000000000000000005f82015250565b5f6149cd601383613be5565b91506149d882614999565b602082019050919050565b5f6020820190508181035f8301526149fa816149c1565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f81519050614a3c81613ca3565b92915050565b5f60208284031215614a5757614a56613c6b565b5b5f614a6484828501614a2e565b91505092915050565b5f819050919050565b5f614a90614a8b614a8684614a6d565b613e59565b613ccd565b9050919050565b614aa081614a76565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614ad881613c92565b82525050565b5f614ae98383614acf565b60208301905092915050565b5f602082019050919050565b5f614b0b82614aa6565b614b158185614ab0565b9350614b2083614ac0565b805f5b83811015614b50578151614b378882614ade565b9750614b4283614af5565b925050600181019050614b23565b5085935050505092915050565b5f60a082019050614b705f830188613ecd565b614b7d6020830187614a97565b8181036040830152614b8f8186614b01565b9050614b9e6060830185613fcf565b614bab6080830184613ecd565b969550505050505056fea2646970667358221220a038e8869df2517e8cbad2f3446525d2a6a2fc32d395188f28690e91f2b1c47a64736f6c63430008190033

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.