ETH Price: $2,730.23 (-7.62%)
 

Overview

Max Total Supply

1,000,000,000 test

Holders

5

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
Token

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IUniswapV2Router02} from "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import {IUniswapV2Factory} from "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";

contract Token is ERC20, Ownable {
    uint256 public immutable MAX_SUPPLY;
    address public immutable pair;
    address public Tax_1_Wallet;
    address public Tax_2_Wallet;
    address public Admin_Wallet;

    IUniswapV2Router02 private constant _router =
        IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

    address private immutable _weth;

    uint256 public startBlock;
    uint256 public startBlockTime;
    
    uint256 public feeBps;

    event SetFee(uint256 newValue, uint256 oldValue);

    error FeeTooHigh();

    mapping(address account => bool) public isExcludedFromFees;
    mapping(address account => bool) public isExcludedFromMaxWallet;
    mapping(address origin => mapping(uint256 blockNumber => uint256 txCount))
        public maxBuyTxsPerBlockPerOrigin;
    uint256 private _maxBuyTxsPerBlockPerOrigin = 10;
    mapping(uint256 blockNumber => uint256 txCount) public maxBuyTxsPerBlock;
    uint256 private _maxBuyTxsPerBlock = 100;

    constructor() ERC20("TEST", "test") Ownable(msg.sender) {
        MAX_SUPPLY = 1000_000_000 ether;
        _weth = _router.WETH();

        Tax_1_Wallet = 0x492A84Ff94aD19f8D055c945432FdCFaEe340456; //45
        Tax_2_Wallet = 0x492A84Ff94aD19f8D055c945432FdCFaEe340456; //45
        Admin_Wallet = 0x492A84Ff94aD19f8D055c945432FdCFaEe340456; //10

        pair = IUniswapV2Factory(_router.factory()).createPair(
            address(this),
            _weth
        );

        feeBps = 500;

        isExcludedFromFees[msg.sender] = true;
        isExcludedFromFees[address(this)] = true;
        isExcludedFromFees[pair] = true;
        isExcludedFromFees[Tax_1_Wallet] = true;
        isExcludedFromFees[Tax_2_Wallet] = true;
        isExcludedFromFees[Admin_Wallet] = true;
        isExcludedFromMaxWallet[msg.sender] = true;
        isExcludedFromMaxWallet[address(this)] = true;
        isExcludedFromMaxWallet[pair] = true;
        isExcludedFromMaxWallet[Tax_1_Wallet] = true;
        isExcludedFromMaxWallet[Tax_2_Wallet] = true;
        isExcludedFromMaxWallet[Admin_Wallet] = true;

        _mint(msg.sender, MAX_SUPPLY);
        _approve(msg.sender, address(_router), type(uint256).max);
        _approve(address(this), address(_router), type(uint256).max);
    }

    receive() external payable {}

    fallback() external payable {}

    function enableTrading() external onlyOwner {
        require(startBlock == 0, "trading-already-enabled");
        startBlock = block.number;
        startBlockTime = block.timestamp;
    }

    function setExcludedFromFees(
        address account,
        bool excluded
    ) external onlyOwner {
        isExcludedFromFees[account] = excluded;
    }

    function setExcludedFromMaxWallet(
        address account,
        bool excluded
    ) external onlyOwner {
        isExcludedFromMaxWallet[account] = excluded;
    }

    function feesAndMaxWallet()
        external
        view
        returns (uint256 _feeBps, uint256 _maxWallet)
    {
        return _feesAndMaxWallet();
    }

    function _feesAndMaxWallet()
        internal
        view
        returns (uint256 _feeBps, uint256 _maxWallet)
    {
        if (startBlockTime == 0) {
            return (0, 0);
        }
        uint256 _diffSeconds = block.timestamp - startBlockTime;

        if (_diffSeconds < 3600) {
            // 1 min
            if (_diffSeconds < 60) {
                _feeBps = 4000; // 40%
                _maxWallet = MAX_SUPPLY / 666; // 0.15%
                return (_feeBps, _maxWallet);
            }
            // 2-5 min
            if (_diffSeconds < 300) {
                _feeBps = 3000; // 30%
                _maxWallet = MAX_SUPPLY / 500; // 0.2%
                return (_feeBps, _maxWallet);
            }
            // 6-8 min
            if (_diffSeconds < 480) {
                _feeBps = 2500; // 25%
                _maxWallet = MAX_SUPPLY / 500; // 0.2%
                return (_feeBps, _maxWallet);
            }
            // 9-12 min
            if (_diffSeconds < 720) {
                _feeBps = 2000; // 20%
                _maxWallet = MAX_SUPPLY / 400; // 0.25%
                return (_feeBps, _maxWallet);
            }

            if (_diffSeconds < 900) {
                // 12-15 min
                _feeBps = 1000; // 10%
                _maxWallet = MAX_SUPPLY / 333; // 0.3%
                return (_feeBps, _maxWallet);
            }

            _feeBps = 500; // 5%
            _maxWallet = MAX_SUPPLY / 200; // 0.5%
            return (_feeBps, _maxWallet);
        }

        _maxWallet = MAX_SUPPLY; // no limit
        return (feeBps, _maxWallet);
    }

    function _update(
        address from,
        address to,
        uint256 value
    ) internal override {
        (uint256 _feeBps, uint256 _maxWallet) = _feesAndMaxWallet();

        bool isBuy = from == pair;
        if (isBuy || to == pair) {
            require(
                startBlock > 0 || isExcludedFromFees[to],
                "trading-not-enabled"
            );

            if (_feeBps != 0) {
                if (isBuy && !isExcludedFromFees[to]) {
                    if (
                        startBlockTime > 0 &&
                        block.timestamp - startBlockTime < 180
                    ) {
                        require(
                            maxBuyTxsPerBlockPerOrigin[tx.origin][
                                block.number
                            ] < _maxBuyTxsPerBlockPerOrigin,
                            "max-buy-txs-per-block-per-origin-exceeded"
                        );
                        maxBuyTxsPerBlockPerOrigin[tx.origin][block.number]++;

                        require(
                            maxBuyTxsPerBlock[block.number] <
                                _maxBuyTxsPerBlock,
                            "max-buy-txs-per-block-exceeded"
                        );
                        maxBuyTxsPerBlock[block.number]++;
                    }

                    uint256 fee = (value * _feeBps) / 10000;
                    value -= fee;
                    super._update(from, address(this), fee);
                }

                if (!isBuy && !isExcludedFromFees[from]) {
                    uint256 fee = (value * _feeBps) / 10000;
                    value -= fee;
                    super._update(from, address(this), fee);
                    _swapTokensForEth();
                }
            } else {
                // sell any remaining tokens after cap is reached
                if (!isBuy && !isExcludedFromFees[from]) {
                    _swapTokensForEth();
                }
            }
        }

        require(
            isExcludedFromMaxWallet[to] || value + balanceOf(to) <= _maxWallet,
            "max-wallet-size-exceeded"
        );
        super._update(from, to, value);
    }

    function _swapTokensForEth() internal {
        bool success;
        uint256 startDiff = block.timestamp - startBlockTime;
        if (startDiff < 300) {
            return;
        }

        uint256 _tokenAmount = balanceOf(address(this));

        if (_tokenAmount == 0) {
            return;
        }

        address[] memory _path = new address[](2);
        _path[0] = _weth;
        _path[1] = address(this);

        // sell max 1 eth worth of tokens
        uint256 _maxTokenAmount = _router.getAmountsOut(1 ether, _path)[1];

        if (_tokenAmount > _maxTokenAmount) {
            _tokenAmount = _maxTokenAmount;
        }

        _path[0] = address(this);
        _path[1] = _weth;

        _router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            _tokenAmount,
            0,
            _path,
            address(this),
            block.timestamp
        );

        uint256 ethBalance = address(this).balance;

        uint256 ethForTax1 = (ethBalance * 45) / 100;
        uint256 ethForTax2 = (ethBalance * 45) / 100;
        uint256 ethForAdmin = (ethBalance * 10) / 100;

        (success, ) = address(Tax_1_Wallet).call{value: ethForTax1}("");
        (success, ) = address(Tax_2_Wallet).call{value: ethForTax2}("");
        (success, ) = address(Admin_Wallet).call{value: ethForAdmin}("");
    }

    function SetTaxWallets(address _Tax1Wallet, address _Tax2Wallet, address _AdminWallet) external onlyOwner {
        Tax_1_Wallet = _Tax1Wallet;
        Tax_2_Wallet = _Tax2Wallet;
        Admin_Wallet = _AdminWallet;
    }

    function ReduceFee(uint256 _fee) external onlyOwner {
        if (block.number == startBlock){
            feeBps = _fee;
        } else {
            require(_fee <= feeBps, FeeTooHigh());
            uint256 oldValue = feeBps;
            feeBps = _fee;
            emit SetFee(_fee, oldValue);
        }
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.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);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC-20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 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 ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-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 ERC-1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 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);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.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 ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * Both 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}.
     *
     * Skips emitting an {Approval} event indicating an allowance update. This is not
     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
     *
     * 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:
     *
     * ```solidity
     * 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);
            }
        }
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC-20 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);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
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);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

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

Settings
{
  "evmVersion": "paris",
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"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":[],"name":"FeeTooHigh","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":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":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"SetFee","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"Admin_Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"ReduceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_Tax1Wallet","type":"address"},{"internalType":"address","name":"_Tax2Wallet","type":"address"},{"internalType":"address","name":"_AdminWallet","type":"address"}],"name":"SetTaxWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Tax_1_Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Tax_2_Wallet","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesAndMaxWallet","outputs":[{"internalType":"uint256","name":"_feeBps","type":"uint256"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"maxBuyTxsPerBlock","outputs":[{"internalType":"uint256","name":"txCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"origin","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"maxBuyTxsPerBlockPerOrigin","outputs":[{"internalType":"uint256","name":"txCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludedFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlockTime","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":[{"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"},{"stateMutability":"payable","type":"receive"}]

60e0604052600a600f55606460115534801561001a57600080fd5b50336040518060400160405280600481526020017f54455354000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f746573740000000000000000000000000000000000000000000000000000000081525081600390816100979190611d5f565b5080600490816100a79190611d5f565b505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361011c5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101139190611e72565b60405180910390fd5b61012b816109c460201b60201c565b506b033b2e3c9fd0803ce800000060808181525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561019f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c39190611ecd565b73ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505073492a84ff94ad19f8d055c945432fdcfaee340456600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073492a84ff94ad19f8d055c945432fdcfaee340456600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073492a84ff94ad19f8d055c945432fdcfaee340456600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103789190611ecd565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060c0516040518363ffffffff1660e01b81526004016103b4929190611efa565b6020604051808303816000875af11580156103d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f79190611ecd565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506101f4600b819055506001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c600060a05173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d600060a05173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061093533608051610a8a60201b60201c565b61097a33737a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610b1260201b60201c565b6109bf30737a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610b1260201b60201c565b6126be565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610afc5760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610af39190611e72565b60405180910390fd5b610b0e60008383610b2a60201b60201c565b5050565b610b25838383600161107160201b60201c565b505050565b600080610b3b61124860201b60201c565b91509150600060a05173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161490508080610bad575060a05173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610fa85760006009541180610c0c5750600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4290611f80565b60405180910390fd5b60008314610f3a57808015610caa5750600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610e8c576000600a54118015610cce575060b4600a5442610ccc9190611fcf565b105b15610e4e57600f54600e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060004381526020019081526020016000205410610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e90612075565b60405180910390fd5b600e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060004381526020019081526020016000206000815480929190610dc890612095565b9190505550601154601060004381526020019081526020016000205410610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90612129565b60405180910390fd5b601060004381526020019081526020016000206000815480929190610e4890612095565b91905055505b60006127108486610e5f9190612149565b610e6991906121ba565b90508085610e779190611fcf565b9450610e8a87308361136b60201b60201c565b505b80158015610ee45750600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610f355760006127108486610efa9190612149565b610f0491906121ba565b90508085610f129190611fcf565b9450610f2587308361136b60201b60201c565b610f3361159060201b60201c565b505b610fa7565b80158015610f925750600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610fa657610fa561159060201b60201c565b5b5b5b600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061101957508161100b86611ac760201b60201c565b8561101691906121eb565b11155b611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f9061226b565b60405180910390fd5b61106986868661136b60201b60201c565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036110e35760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016110da9190611e72565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036111555760006040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161114c9190611e72565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015611242578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611239919061229a565b60405180910390a35b50505050565b6000806000600a54036112615760008091509150611367565b6000600a54426112719190611fcf565b9050610e1081101561135b57603c8110156112a357610fa0925061029a60805161129b91906121ba565b915050611367565b61012c8110156112ca57610bb892506101f46080516112c291906121ba565b915050611367565b6101e08110156112f1576109c492506101f46080516112e991906121ba565b915050611367565b6102d0811015611318576107d0925061019060805161131091906121ba565b915050611367565b61038481101561133f576103e8925061014d60805161133791906121ba565b915050611367565b6101f4925060c860805161135391906121ba565b915050611367565b6080519150600b549250505b9091565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113bd5780600260008282546113b191906121eb565b92505081905550611490565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611449578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611440939291906122b5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114d95780600260008282540392505081905550611526565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611583919061229a565b60405180910390a3505050565b600080600a54426115a19190611fcf565b905061012c8110156115b4575050611ac5565b60006115c530611ac760201b60201c565b9050600081036115d757505050611ac5565b6000600267ffffffffffffffff8111156115f4576115f3611b1a565b5b6040519080825280602002602001820160405280156116225781602001602082028036833780820191505090505b50905060c0518160008151811061163c5761163b6122ec565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050308160018151811061168b5761168a6122ec565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f670de0b6b3a7640000846040518363ffffffff1660e01b815260040161171e929190612414565b600060405180830381865afa15801561173b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611764919061259a565b600181518110611777576117766122ec565b5b602002602001015190508083111561178d578092505b30826000815181106117a2576117a16122ec565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060c051826001815181106117f3576117f26122ec565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b815260040161188395949392919061261e565b600060405180830381600087803b15801561189d57600080fd5b505af11580156118b1573d6000803e3d6000fd5b50505050600047905060006064602d836118cb9190612149565b6118d591906121ba565b905060006064602d846118e89190612149565b6118f291906121ba565b905060006064600a856119059190612149565b61190f91906121ba565b9050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683604051611957906126a9565b60006040518083038185875af1925050503d8060008114611994576040519150601f19603f3d011682016040523d82523d6000602084013e611999565b606091505b505080995050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516119e5906126a9565b60006040518083038185875af1925050503d8060008114611a22576040519150601f19603f3d011682016040523d82523d6000602084013e611a27565b606091505b505080995050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051611a73906126a9565b60006040518083038185875af1925050503d8060008114611ab0576040519150601f19603f3d011682016040523d82523d6000602084013e611ab5565b606091505b5050809950505050505050505050505b565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611b9057607f821691505b602082108103611ba357611ba2611b49565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611c0b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611bce565b611c158683611bce565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000611c5c611c57611c5284611c2d565b611c37565b611c2d565b9050919050565b6000819050919050565b611c7683611c41565b611c8a611c8282611c63565b848454611bdb565b825550505050565b600090565b611c9f611c92565b611caa818484611c6d565b505050565b5b81811015611cce57611cc3600082611c97565b600181019050611cb0565b5050565b601f821115611d1357611ce481611ba9565b611ced84611bbe565b81016020851015611cfc578190505b611d10611d0885611bbe565b830182611caf565b50505b505050565b600082821c905092915050565b6000611d3660001984600802611d18565b1980831691505092915050565b6000611d4f8383611d25565b9150826002028217905092915050565b611d6882611b0f565b67ffffffffffffffff811115611d8157611d80611b1a565b5b611d8b8254611b78565b611d96828285611cd2565b600060209050601f831160018114611dc95760008415611db7578287015190505b611dc18582611d43565b865550611e29565b601f198416611dd786611ba9565b60005b82811015611dff57848901518255600182019150602085019450602081019050611dda565b86831015611e1c5784890151611e18601f891682611d25565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e5c82611e31565b9050919050565b611e6c81611e51565b82525050565b6000602082019050611e876000830184611e63565b92915050565b6000604051905090565b600080fd5b600080fd5b611eaa81611e51565b8114611eb557600080fd5b50565b600081519050611ec781611ea1565b92915050565b600060208284031215611ee357611ee2611e97565b5b6000611ef184828501611eb8565b91505092915050565b6000604082019050611f0f6000830185611e63565b611f1c6020830184611e63565b9392505050565b600082825260208201905092915050565b7f74726164696e672d6e6f742d656e61626c656400000000000000000000000000600082015250565b6000611f6a601383611f23565b9150611f7582611f34565b602082019050919050565b60006020820190508181036000830152611f9981611f5d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611fda82611c2d565b9150611fe583611c2d565b9250828203905081811115611ffd57611ffc611fa0565b5b92915050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d7065722d6f726967696e60008201527f2d65786365656465640000000000000000000000000000000000000000000000602082015250565b600061205f602983611f23565b915061206a82612003565b604082019050919050565b6000602082019050818103600083015261208e81612052565b9050919050565b60006120a082611c2d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036120d2576120d1611fa0565b5b600182019050919050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d65786365656465640000600082015250565b6000612113601e83611f23565b915061211e826120dd565b602082019050919050565b6000602082019050818103600083015261214281612106565b9050919050565b600061215482611c2d565b915061215f83611c2d565b925082820261216d81611c2d565b9150828204841483151761218457612183611fa0565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006121c582611c2d565b91506121d083611c2d565b9250826121e0576121df61218b565b5b828204905092915050565b60006121f682611c2d565b915061220183611c2d565b925082820190508082111561221957612218611fa0565b5b92915050565b7f6d61782d77616c6c65742d73697a652d65786365656465640000000000000000600082015250565b6000612255601883611f23565b91506122608261221f565b602082019050919050565b6000602082019050818103600083015261228481612248565b9050919050565b61229481611c2d565b82525050565b60006020820190506122af600083018461228b565b92915050565b60006060820190506122ca6000830186611e63565b6122d7602083018561228b565b6122e4604083018461228b565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061234061233b6123368461231b565b611c37565b611c2d565b9050919050565b61235081612325565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61238b81611e51565b82525050565b600061239d8383612382565b60208301905092915050565b6000602082019050919050565b60006123c182612356565b6123cb8185612361565b93506123d683612372565b8060005b838110156124075781516123ee8882612391565b97506123f9836123a9565b9250506001810190506123da565b5085935050505092915050565b60006040820190506124296000830185612347565b818103602083015261243b81846123b6565b90509392505050565b600080fd5b6000601f19601f8301169050919050565b61246382612449565b810181811067ffffffffffffffff8211171561248257612481611b1a565b5b80604052505050565b6000612495611e8d565b90506124a1828261245a565b919050565b600067ffffffffffffffff8211156124c1576124c0611b1a565b5b602082029050602081019050919050565b600080fd5b6124e081611c2d565b81146124eb57600080fd5b50565b6000815190506124fd816124d7565b92915050565b6000612516612511846124a6565b61248b565b90508083825260208201905060208402830185811115612539576125386124d2565b5b835b81811015612562578061254e88826124ee565b84526020840193505060208101905061253b565b5050509392505050565b600082601f83011261258157612580612444565b5b8151612591848260208601612503565b91505092915050565b6000602082840312156125b0576125af611e97565b5b600082015167ffffffffffffffff8111156125ce576125cd611e9c565b5b6125da8482850161256c565b91505092915050565b6000819050919050565b60006126086126036125fe846125e3565b611c37565b611c2d565b9050919050565b612618816125ed565b82525050565b600060a082019050612633600083018861228b565b612640602083018761260f565b818103604083015261265281866123b6565b90506126616060830185611e63565b61266e608083018461228b565b9695505050505050565b600081905092915050565b50565b6000612693600083612678565b915061269e82612683565b600082019050919050565b60006126b482612686565b9150819050919050565b60805160a05160c051612ecc61273360003960008181611d4d0152611f22015260008181610c3a0152818161155101526115a90152600081816108dd015281816111ba015281816111ff0152818161124401528181611289015281816112ce01528181611308015261133b0152612ecc6000f3fe6080604052600436106101d15760003560e01c8063590ffdce116100f757806395d89b4111610095578063b3e94ef011610064578063b3e94ef014610695578063d9b321b8146106be578063dd62ed3e146106e9578063f2fde38b14610726576101d2565b806395d89b41146105d6578063a25ba18314610601578063a8aa1b311461062d578063a9059cbb14610658576101d2565b8063715018a6116100d1578063715018a61461055457806376b2fa711461056b5780638a8c523c146105945780638da5cb5b146105ab576101d2565b8063590ffdce146104b15780636dd3d39f146104da57806370a0823114610517576101d2565b806323b872dd1161016f57806332cb6b0c1161013e57806332cb6b0c146103f5578063412201041461042057806348cd4cb1146104495780634fbee19314610474576101d2565b806323b872dd1461033757806324a9d853146103745780632fb53e0d1461039f578063313ce567146103ca576101d2565b80630fe3fe7d116101ab5780630fe3fe7d1461026757806318160ddd146102a45780631b4ef23c146102cf57806321b02486146102fa576101d2565b806306fdde03146101d4578063095ea7b3146101ff5780630c18d4ce1461023c576101d2565b5b005b3480156101e057600080fd5b506101e961074f565b6040516101f691906122b9565b60405180910390f35b34801561020b57600080fd5b5061022660048036038101906102219190612383565b6107e1565b60405161023391906123de565b60405180910390f35b34801561024857600080fd5b50610251610804565b60405161025e9190612408565b60405180910390f35b34801561027357600080fd5b5061028e60048036038101906102899190612383565b61080a565b60405161029b9190612408565b60405180910390f35b3480156102b057600080fd5b506102b961082f565b6040516102c69190612408565b60405180910390f35b3480156102db57600080fd5b506102e4610839565b6040516102f19190612432565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c919061244d565b61085f565b60405161032e9190612408565b60405180910390f35b34801561034357600080fd5b5061035e6004803603810190610359919061247a565b610877565b60405161036b91906123de565b60405180910390f35b34801561038057600080fd5b506103896108a6565b6040516103969190612408565b60405180910390f35b3480156103ab57600080fd5b506103b46108ac565b6040516103c19190612432565b60405180910390f35b3480156103d657600080fd5b506103df6108d2565b6040516103ec91906124e9565b60405180910390f35b34801561040157600080fd5b5061040a6108db565b6040516104179190612408565b60405180910390f35b34801561042c57600080fd5b5061044760048036038101906104429190612530565b6108ff565b005b34801561045557600080fd5b5061045e610962565b60405161046b9190612408565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190612570565b610968565b6040516104a891906123de565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190612530565b610988565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190612570565b6109eb565b60405161050e91906123de565b60405180910390f35b34801561052357600080fd5b5061053e60048036038101906105399190612570565b610a0b565b60405161054b9190612408565b60405180910390f35b34801561056057600080fd5b50610569610a53565b005b34801561057757600080fd5b50610592600480360381019061058d919061244d565b610a67565b005b3480156105a057600080fd5b506105a9610b0c565b005b3480156105b757600080fd5b506105c0610b69565b6040516105cd9190612432565b60405180910390f35b3480156105e257600080fd5b506105eb610b93565b6040516105f891906122b9565b60405180910390f35b34801561060d57600080fd5b50610616610c25565b60405161062492919061259d565b60405180910390f35b34801561063957600080fd5b50610642610c38565b60405161064f9190612432565b60405180910390f35b34801561066457600080fd5b5061067f600480360381019061067a9190612383565b610c5c565b60405161068c91906123de565b60405180910390f35b3480156106a157600080fd5b506106bc60048036038101906106b791906125c6565b610c7f565b005b3480156106ca57600080fd5b506106d3610d4f565b6040516106e09190612432565b60405180910390f35b3480156106f557600080fd5b50610710600480360381019061070b9190612619565b610d75565b60405161071d9190612408565b60405180910390f35b34801561073257600080fd5b5061074d60048036038101906107489190612570565b610dfc565b005b60606003805461075e90612688565b80601f016020809104026020016040519081016040528092919081815260200182805461078a90612688565b80156107d75780601f106107ac576101008083540402835291602001916107d7565b820191906000526020600020905b8154815290600101906020018083116107ba57829003601f168201915b5050505050905090565b6000806107ec610e82565b90506107f9818585610e8a565b600191505092915050565b600a5481565b600e602052816000526040600020602052806000526040600020600091509150505481565b6000600254905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60106020528060005260406000206000915090505481565b600080610882610e82565b905061088f858285610e9c565b61089a858585610f31565b60019150509392505050565b600b5481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006012905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b610907611025565b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60095481565b600c6020528060005260406000206000915054906101000a900460ff1681565b610990611025565b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600d6020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a5b611025565b610a6560006110ac565b565b610a6f611025565b6009544303610a845780600b81905550610b09565b600b54811115610ac0576040517fcd4e616700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600b54905081600b819055507f032dc6a2d839eb179729a55633fdf1c41a1fc4739394154117005db2b354b9b58282604051610aff92919061259d565b60405180910390a1505b50565b610b14611025565b600060095414610b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5090612705565b60405180910390fd5b4360098190555042600a81905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ba290612688565b80601f0160208091040260200160405190810160405280929190818152602001828054610bce90612688565b8015610c1b5780601f10610bf057610100808354040283529160200191610c1b565b820191906000526020600020905b815481529060010190602001808311610bfe57829003601f168201915b5050505050905090565b600080610c30611172565b915091509091565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080610c67610e82565b9050610c74818585610f31565b600191505092915050565b610c87611025565b82600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610e04611025565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e765760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610e6d9190612432565b60405180910390fd5b610e7f816110ac565b50565b600033905090565b610e978383836001611367565b505050565b6000610ea88484610d75565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610f2b5781811015610f1b578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610f1293929190612725565b60405180910390fd5b610f2a84848484036000611367565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fa35760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610f9a9190612432565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110155760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161100c9190612432565b60405180910390fd5b61102083838361153e565b505050565b61102d610e82565b73ffffffffffffffffffffffffffffffffffffffff1661104b610b69565b73ffffffffffffffffffffffffffffffffffffffff16146110aa5761106e610e82565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016110a19190612432565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000806000600a540361118b5760008091509150611363565b6000600a544261119b919061278b565b9050610e1081101561133957603c8110156111eb57610fa0925061029a7f00000000000000000000000000000000000000000000000000000000000000006111e391906127ee565b915050611363565b61012c81101561123057610bb892506101f47f000000000000000000000000000000000000000000000000000000000000000061122891906127ee565b915050611363565b6101e0811015611275576109c492506101f47f000000000000000000000000000000000000000000000000000000000000000061126d91906127ee565b915050611363565b6102d08110156112ba576107d092506101907f00000000000000000000000000000000000000000000000000000000000000006112b291906127ee565b915050611363565b6103848110156112ff576103e8925061014d7f00000000000000000000000000000000000000000000000000000000000000006112f791906127ee565b915050611363565b6101f4925060c87f000000000000000000000000000000000000000000000000000000000000000061133191906127ee565b915050611363565b7f00000000000000000000000000000000000000000000000000000000000000009150600b549250505b9091565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036113d95760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016113d09190612432565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361144b5760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016114429190612432565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015611538578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161152f9190612408565b60405180910390a35b50505050565b600080611549611172565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905080806115f757507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b156119da57600060095411806116565750600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168c9061286b565b60405180910390fd5b60008314611972578080156116f45750600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156118d0576000600a54118015611718575060b4600a5442611716919061278b565b105b1561189857600f54600e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600043815260200190815260200160002054106117b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a8906128fd565b60405180910390fd5b600e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600043815260200190815260200160002060008154809291906118129061291d565b919050555060115460106000438152602001908152602001600020541061186e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611865906129b1565b60405180910390fd5b6010600043815260200190815260200160002060008154809291906118929061291d565b91905055505b600061271084866118a991906129d1565b6118b391906127ee565b905080856118c1919061278b565b94506118ce873083611a97565b505b801580156119285750600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561196d576000612710848661193e91906129d1565b61194891906127ee565b90508085611956919061278b565b9450611963873083611a97565b61196b611cbc565b505b6119d9565b801580156119ca5750600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156119d8576119d7611cbc565b5b5b5b600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611a45575081611a3786610a0b565b85611a429190612a13565b11155b611a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7b90612a93565b60405180910390fd5b611a8f868686611a97565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ae9578060026000828254611add9190612a13565b92505081905550611bbc565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611b75578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611b6c93929190612725565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c055780600260008282540392505081905550611c52565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611caf9190612408565b60405180910390a3505050565b600080600a5442611ccd919061278b565b905061012c811015611ce0575050612227565b6000611ceb30610a0b565b905060008103611cfd57505050612227565b6000600267ffffffffffffffff811115611d1a57611d19612ab3565b5b604051908082528060200260200182016040528015611d485781602001602082028036833780820191505090505b5090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611d8057611d7f612ae2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110611dcf57611dce612ae2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f670de0b6b3a7640000846040518363ffffffff1660e01b8152600401611e62929190612c14565b600060405180830381865afa158015611e7f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ea89190612d72565b600181518110611ebb57611eba612ae2565b5b6020026020010151905080831115611ed1578092505b3082600081518110611ee657611ee5612ae2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000082600181518110611f5557611f54612ae2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b8152600401611fe5959493929190612df6565b600060405180830381600087803b158015611fff57600080fd5b505af1158015612013573d6000803e3d6000fd5b50505050600047905060006064602d8361202d91906129d1565b61203791906127ee565b905060006064602d8461204a91906129d1565b61205491906127ee565b905060006064600a8561206791906129d1565b61207191906127ee565b9050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516120b990612e81565b60006040518083038185875af1925050503d80600081146120f6576040519150601f19603f3d011682016040523d82523d6000602084013e6120fb565b606091505b505080995050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161214790612e81565b60006040518083038185875af1925050503d8060008114612184576040519150601f19603f3d011682016040523d82523d6000602084013e612189565b606091505b505080995050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16816040516121d590612e81565b60006040518083038185875af1925050503d8060008114612212576040519150601f19603f3d011682016040523d82523d6000602084013e612217565b606091505b5050809950505050505050505050505b565b600081519050919050565b600082825260208201905092915050565b60005b83811015612263578082015181840152602081019050612248565b60008484015250505050565b6000601f19601f8301169050919050565b600061228b82612229565b6122958185612234565b93506122a5818560208601612245565b6122ae8161226f565b840191505092915050565b600060208201905081810360008301526122d38184612280565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061231a826122ef565b9050919050565b61232a8161230f565b811461233557600080fd5b50565b60008135905061234781612321565b92915050565b6000819050919050565b6123608161234d565b811461236b57600080fd5b50565b60008135905061237d81612357565b92915050565b6000806040838503121561239a576123996122e5565b5b60006123a885828601612338565b92505060206123b98582860161236e565b9150509250929050565b60008115159050919050565b6123d8816123c3565b82525050565b60006020820190506123f360008301846123cf565b92915050565b6124028161234d565b82525050565b600060208201905061241d60008301846123f9565b92915050565b61242c8161230f565b82525050565b60006020820190506124476000830184612423565b92915050565b600060208284031215612463576124626122e5565b5b60006124718482850161236e565b91505092915050565b600080600060608486031215612493576124926122e5565b5b60006124a186828701612338565b93505060206124b286828701612338565b92505060406124c38682870161236e565b9150509250925092565b600060ff82169050919050565b6124e3816124cd565b82525050565b60006020820190506124fe60008301846124da565b92915050565b61250d816123c3565b811461251857600080fd5b50565b60008135905061252a81612504565b92915050565b60008060408385031215612547576125466122e5565b5b600061255585828601612338565b92505060206125668582860161251b565b9150509250929050565b600060208284031215612586576125856122e5565b5b600061259484828501612338565b91505092915050565b60006040820190506125b260008301856123f9565b6125bf60208301846123f9565b9392505050565b6000806000606084860312156125df576125de6122e5565b5b60006125ed86828701612338565b93505060206125fe86828701612338565b925050604061260f86828701612338565b9150509250925092565b600080604083850312156126305761262f6122e5565b5b600061263e85828601612338565b925050602061264f85828601612338565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806126a057607f821691505b6020821081036126b3576126b2612659565b5b50919050565b7f74726164696e672d616c72656164792d656e61626c6564000000000000000000600082015250565b60006126ef601783612234565b91506126fa826126b9565b602082019050919050565b6000602082019050818103600083015261271e816126e2565b9050919050565b600060608201905061273a6000830186612423565b61274760208301856123f9565b61275460408301846123f9565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127968261234d565b91506127a18361234d565b92508282039050818111156127b9576127b861275c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127f98261234d565b91506128048361234d565b925082612814576128136127bf565b5b828204905092915050565b7f74726164696e672d6e6f742d656e61626c656400000000000000000000000000600082015250565b6000612855601383612234565b91506128608261281f565b602082019050919050565b6000602082019050818103600083015261288481612848565b9050919050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d7065722d6f726967696e60008201527f2d65786365656465640000000000000000000000000000000000000000000000602082015250565b60006128e7602983612234565b91506128f28261288b565b604082019050919050565b60006020820190508181036000830152612916816128da565b9050919050565b60006129288261234d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361295a5761295961275c565b5b600182019050919050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d65786365656465640000600082015250565b600061299b601e83612234565b91506129a682612965565b602082019050919050565b600060208201905081810360008301526129ca8161298e565b9050919050565b60006129dc8261234d565b91506129e78361234d565b92508282026129f58161234d565b91508282048414831517612a0c57612a0b61275c565b5b5092915050565b6000612a1e8261234d565b9150612a298361234d565b9250828201905080821115612a4157612a4061275c565b5b92915050565b7f6d61782d77616c6c65742d73697a652d65786365656465640000000000000000600082015250565b6000612a7d601883612234565b9150612a8882612a47565b602082019050919050565b60006020820190508181036000830152612aac81612a70565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b6000612b40612b3b612b3684612b11565b612b1b565b61234d565b9050919050565b612b5081612b25565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612b8b8161230f565b82525050565b6000612b9d8383612b82565b60208301905092915050565b6000602082019050919050565b6000612bc182612b56565b612bcb8185612b61565b9350612bd683612b72565b8060005b83811015612c07578151612bee8882612b91565b9750612bf983612ba9565b925050600181019050612bda565b5085935050505092915050565b6000604082019050612c296000830185612b47565b8181036020830152612c3b8184612bb6565b90509392505050565b600080fd5b612c528261226f565b810181811067ffffffffffffffff82111715612c7157612c70612ab3565b5b80604052505050565b6000612c846122db565b9050612c908282612c49565b919050565b600067ffffffffffffffff821115612cb057612caf612ab3565b5b602082029050602081019050919050565b600080fd5b600081519050612cd581612357565b92915050565b6000612cee612ce984612c95565b612c7a565b90508083825260208201905060208402830185811115612d1157612d10612cc1565b5b835b81811015612d3a5780612d268882612cc6565b845260208401935050602081019050612d13565b5050509392505050565b600082601f830112612d5957612d58612c44565b5b8151612d69848260208601612cdb565b91505092915050565b600060208284031215612d8857612d876122e5565b5b600082015167ffffffffffffffff811115612da657612da56122ea565b5b612db284828501612d44565b91505092915050565b6000819050919050565b6000612de0612ddb612dd684612dbb565b612b1b565b61234d565b9050919050565b612df081612dc5565b82525050565b600060a082019050612e0b60008301886123f9565b612e186020830187612de7565b8181036040830152612e2a8186612bb6565b9050612e396060830185612423565b612e4660808301846123f9565b9695505050505050565b600081905092915050565b50565b6000612e6b600083612e50565b9150612e7682612e5b565b600082019050919050565b6000612e8c82612e5e565b915081905091905056fea26469706673582212201d0ccf2070cee7bf133c1177136769826c4a80d91e0aa93f28e379e3d1dbe47e64736f6c634300081c0033

Deployed Bytecode

0x6080604052600436106101d15760003560e01c8063590ffdce116100f757806395d89b4111610095578063b3e94ef011610064578063b3e94ef014610695578063d9b321b8146106be578063dd62ed3e146106e9578063f2fde38b14610726576101d2565b806395d89b41146105d6578063a25ba18314610601578063a8aa1b311461062d578063a9059cbb14610658576101d2565b8063715018a6116100d1578063715018a61461055457806376b2fa711461056b5780638a8c523c146105945780638da5cb5b146105ab576101d2565b8063590ffdce146104b15780636dd3d39f146104da57806370a0823114610517576101d2565b806323b872dd1161016f57806332cb6b0c1161013e57806332cb6b0c146103f5578063412201041461042057806348cd4cb1146104495780634fbee19314610474576101d2565b806323b872dd1461033757806324a9d853146103745780632fb53e0d1461039f578063313ce567146103ca576101d2565b80630fe3fe7d116101ab5780630fe3fe7d1461026757806318160ddd146102a45780631b4ef23c146102cf57806321b02486146102fa576101d2565b806306fdde03146101d4578063095ea7b3146101ff5780630c18d4ce1461023c576101d2565b5b005b3480156101e057600080fd5b506101e961074f565b6040516101f691906122b9565b60405180910390f35b34801561020b57600080fd5b5061022660048036038101906102219190612383565b6107e1565b60405161023391906123de565b60405180910390f35b34801561024857600080fd5b50610251610804565b60405161025e9190612408565b60405180910390f35b34801561027357600080fd5b5061028e60048036038101906102899190612383565b61080a565b60405161029b9190612408565b60405180910390f35b3480156102b057600080fd5b506102b961082f565b6040516102c69190612408565b60405180910390f35b3480156102db57600080fd5b506102e4610839565b6040516102f19190612432565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c919061244d565b61085f565b60405161032e9190612408565b60405180910390f35b34801561034357600080fd5b5061035e6004803603810190610359919061247a565b610877565b60405161036b91906123de565b60405180910390f35b34801561038057600080fd5b506103896108a6565b6040516103969190612408565b60405180910390f35b3480156103ab57600080fd5b506103b46108ac565b6040516103c19190612432565b60405180910390f35b3480156103d657600080fd5b506103df6108d2565b6040516103ec91906124e9565b60405180910390f35b34801561040157600080fd5b5061040a6108db565b6040516104179190612408565b60405180910390f35b34801561042c57600080fd5b5061044760048036038101906104429190612530565b6108ff565b005b34801561045557600080fd5b5061045e610962565b60405161046b9190612408565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190612570565b610968565b6040516104a891906123de565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190612530565b610988565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190612570565b6109eb565b60405161050e91906123de565b60405180910390f35b34801561052357600080fd5b5061053e60048036038101906105399190612570565b610a0b565b60405161054b9190612408565b60405180910390f35b34801561056057600080fd5b50610569610a53565b005b34801561057757600080fd5b50610592600480360381019061058d919061244d565b610a67565b005b3480156105a057600080fd5b506105a9610b0c565b005b3480156105b757600080fd5b506105c0610b69565b6040516105cd9190612432565b60405180910390f35b3480156105e257600080fd5b506105eb610b93565b6040516105f891906122b9565b60405180910390f35b34801561060d57600080fd5b50610616610c25565b60405161062492919061259d565b60405180910390f35b34801561063957600080fd5b50610642610c38565b60405161064f9190612432565b60405180910390f35b34801561066457600080fd5b5061067f600480360381019061067a9190612383565b610c5c565b60405161068c91906123de565b60405180910390f35b3480156106a157600080fd5b506106bc60048036038101906106b791906125c6565b610c7f565b005b3480156106ca57600080fd5b506106d3610d4f565b6040516106e09190612432565b60405180910390f35b3480156106f557600080fd5b50610710600480360381019061070b9190612619565b610d75565b60405161071d9190612408565b60405180910390f35b34801561073257600080fd5b5061074d60048036038101906107489190612570565b610dfc565b005b60606003805461075e90612688565b80601f016020809104026020016040519081016040528092919081815260200182805461078a90612688565b80156107d75780601f106107ac576101008083540402835291602001916107d7565b820191906000526020600020905b8154815290600101906020018083116107ba57829003601f168201915b5050505050905090565b6000806107ec610e82565b90506107f9818585610e8a565b600191505092915050565b600a5481565b600e602052816000526040600020602052806000526040600020600091509150505481565b6000600254905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60106020528060005260406000206000915090505481565b600080610882610e82565b905061088f858285610e9c565b61089a858585610f31565b60019150509392505050565b600b5481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006012905090565b7f0000000000000000000000000000000000000000033b2e3c9fd0803ce800000081565b610907611025565b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60095481565b600c6020528060005260406000206000915054906101000a900460ff1681565b610990611025565b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600d6020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a5b611025565b610a6560006110ac565b565b610a6f611025565b6009544303610a845780600b81905550610b09565b600b54811115610ac0576040517fcd4e616700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600b54905081600b819055507f032dc6a2d839eb179729a55633fdf1c41a1fc4739394154117005db2b354b9b58282604051610aff92919061259d565b60405180910390a1505b50565b610b14611025565b600060095414610b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5090612705565b60405180910390fd5b4360098190555042600a81905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ba290612688565b80601f0160208091040260200160405190810160405280929190818152602001828054610bce90612688565b8015610c1b5780601f10610bf057610100808354040283529160200191610c1b565b820191906000526020600020905b815481529060010190602001808311610bfe57829003601f168201915b5050505050905090565b600080610c30611172565b915091509091565b7f0000000000000000000000004f13d1c601501436634e065bdd96db35be4060ea81565b600080610c67610e82565b9050610c74818585610f31565b600191505092915050565b610c87611025565b82600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610e04611025565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e765760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610e6d9190612432565b60405180910390fd5b610e7f816110ac565b50565b600033905090565b610e978383836001611367565b505050565b6000610ea88484610d75565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610f2b5781811015610f1b578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610f1293929190612725565b60405180910390fd5b610f2a84848484036000611367565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fa35760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610f9a9190612432565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110155760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161100c9190612432565b60405180910390fd5b61102083838361153e565b505050565b61102d610e82565b73ffffffffffffffffffffffffffffffffffffffff1661104b610b69565b73ffffffffffffffffffffffffffffffffffffffff16146110aa5761106e610e82565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016110a19190612432565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000806000600a540361118b5760008091509150611363565b6000600a544261119b919061278b565b9050610e1081101561133957603c8110156111eb57610fa0925061029a7f0000000000000000000000000000000000000000033b2e3c9fd0803ce80000006111e391906127ee565b915050611363565b61012c81101561123057610bb892506101f47f0000000000000000000000000000000000000000033b2e3c9fd0803ce800000061122891906127ee565b915050611363565b6101e0811015611275576109c492506101f47f0000000000000000000000000000000000000000033b2e3c9fd0803ce800000061126d91906127ee565b915050611363565b6102d08110156112ba576107d092506101907f0000000000000000000000000000000000000000033b2e3c9fd0803ce80000006112b291906127ee565b915050611363565b6103848110156112ff576103e8925061014d7f0000000000000000000000000000000000000000033b2e3c9fd0803ce80000006112f791906127ee565b915050611363565b6101f4925060c87f0000000000000000000000000000000000000000033b2e3c9fd0803ce800000061133191906127ee565b915050611363565b7f0000000000000000000000000000000000000000033b2e3c9fd0803ce80000009150600b549250505b9091565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036113d95760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016113d09190612432565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361144b5760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016114429190612432565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015611538578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161152f9190612408565b60405180910390a35b50505050565b600080611549611172565b9150915060007f0000000000000000000000004f13d1c601501436634e065bdd96db35be4060ea73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905080806115f757507f0000000000000000000000004f13d1c601501436634e065bdd96db35be4060ea73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b156119da57600060095411806116565750600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168c9061286b565b60405180910390fd5b60008314611972578080156116f45750600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156118d0576000600a54118015611718575060b4600a5442611716919061278b565b105b1561189857600f54600e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600043815260200190815260200160002054106117b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a8906128fd565b60405180910390fd5b600e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600043815260200190815260200160002060008154809291906118129061291d565b919050555060115460106000438152602001908152602001600020541061186e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611865906129b1565b60405180910390fd5b6010600043815260200190815260200160002060008154809291906118929061291d565b91905055505b600061271084866118a991906129d1565b6118b391906127ee565b905080856118c1919061278b565b94506118ce873083611a97565b505b801580156119285750600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561196d576000612710848661193e91906129d1565b61194891906127ee565b90508085611956919061278b565b9450611963873083611a97565b61196b611cbc565b505b6119d9565b801580156119ca5750600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156119d8576119d7611cbc565b5b5b5b600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611a45575081611a3786610a0b565b85611a429190612a13565b11155b611a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7b90612a93565b60405180910390fd5b611a8f868686611a97565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ae9578060026000828254611add9190612a13565b92505081905550611bbc565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611b75578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611b6c93929190612725565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c055780600260008282540392505081905550611c52565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611caf9190612408565b60405180910390a3505050565b600080600a5442611ccd919061278b565b905061012c811015611ce0575050612227565b6000611ceb30610a0b565b905060008103611cfd57505050612227565b6000600267ffffffffffffffff811115611d1a57611d19612ab3565b5b604051908082528060200260200182016040528015611d485781602001602082028036833780820191505090505b5090507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600081518110611d8057611d7f612ae2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110611dcf57611dce612ae2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f670de0b6b3a7640000846040518363ffffffff1660e01b8152600401611e62929190612c14565b600060405180830381865afa158015611e7f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ea89190612d72565b600181518110611ebb57611eba612ae2565b5b6020026020010151905080831115611ed1578092505b3082600081518110611ee657611ee5612ae2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc282600181518110611f5557611f54612ae2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b8152600401611fe5959493929190612df6565b600060405180830381600087803b158015611fff57600080fd5b505af1158015612013573d6000803e3d6000fd5b50505050600047905060006064602d8361202d91906129d1565b61203791906127ee565b905060006064602d8461204a91906129d1565b61205491906127ee565b905060006064600a8561206791906129d1565b61207191906127ee565b9050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516120b990612e81565b60006040518083038185875af1925050503d80600081146120f6576040519150601f19603f3d011682016040523d82523d6000602084013e6120fb565b606091505b505080995050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161214790612e81565b60006040518083038185875af1925050503d8060008114612184576040519150601f19603f3d011682016040523d82523d6000602084013e612189565b606091505b505080995050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16816040516121d590612e81565b60006040518083038185875af1925050503d8060008114612212576040519150601f19603f3d011682016040523d82523d6000602084013e612217565b606091505b5050809950505050505050505050505b565b600081519050919050565b600082825260208201905092915050565b60005b83811015612263578082015181840152602081019050612248565b60008484015250505050565b6000601f19601f8301169050919050565b600061228b82612229565b6122958185612234565b93506122a5818560208601612245565b6122ae8161226f565b840191505092915050565b600060208201905081810360008301526122d38184612280565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061231a826122ef565b9050919050565b61232a8161230f565b811461233557600080fd5b50565b60008135905061234781612321565b92915050565b6000819050919050565b6123608161234d565b811461236b57600080fd5b50565b60008135905061237d81612357565b92915050565b6000806040838503121561239a576123996122e5565b5b60006123a885828601612338565b92505060206123b98582860161236e565b9150509250929050565b60008115159050919050565b6123d8816123c3565b82525050565b60006020820190506123f360008301846123cf565b92915050565b6124028161234d565b82525050565b600060208201905061241d60008301846123f9565b92915050565b61242c8161230f565b82525050565b60006020820190506124476000830184612423565b92915050565b600060208284031215612463576124626122e5565b5b60006124718482850161236e565b91505092915050565b600080600060608486031215612493576124926122e5565b5b60006124a186828701612338565b93505060206124b286828701612338565b92505060406124c38682870161236e565b9150509250925092565b600060ff82169050919050565b6124e3816124cd565b82525050565b60006020820190506124fe60008301846124da565b92915050565b61250d816123c3565b811461251857600080fd5b50565b60008135905061252a81612504565b92915050565b60008060408385031215612547576125466122e5565b5b600061255585828601612338565b92505060206125668582860161251b565b9150509250929050565b600060208284031215612586576125856122e5565b5b600061259484828501612338565b91505092915050565b60006040820190506125b260008301856123f9565b6125bf60208301846123f9565b9392505050565b6000806000606084860312156125df576125de6122e5565b5b60006125ed86828701612338565b93505060206125fe86828701612338565b925050604061260f86828701612338565b9150509250925092565b600080604083850312156126305761262f6122e5565b5b600061263e85828601612338565b925050602061264f85828601612338565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806126a057607f821691505b6020821081036126b3576126b2612659565b5b50919050565b7f74726164696e672d616c72656164792d656e61626c6564000000000000000000600082015250565b60006126ef601783612234565b91506126fa826126b9565b602082019050919050565b6000602082019050818103600083015261271e816126e2565b9050919050565b600060608201905061273a6000830186612423565b61274760208301856123f9565b61275460408301846123f9565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127968261234d565b91506127a18361234d565b92508282039050818111156127b9576127b861275c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127f98261234d565b91506128048361234d565b925082612814576128136127bf565b5b828204905092915050565b7f74726164696e672d6e6f742d656e61626c656400000000000000000000000000600082015250565b6000612855601383612234565b91506128608261281f565b602082019050919050565b6000602082019050818103600083015261288481612848565b9050919050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d7065722d6f726967696e60008201527f2d65786365656465640000000000000000000000000000000000000000000000602082015250565b60006128e7602983612234565b91506128f28261288b565b604082019050919050565b60006020820190508181036000830152612916816128da565b9050919050565b60006129288261234d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361295a5761295961275c565b5b600182019050919050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d65786365656465640000600082015250565b600061299b601e83612234565b91506129a682612965565b602082019050919050565b600060208201905081810360008301526129ca8161298e565b9050919050565b60006129dc8261234d565b91506129e78361234d565b92508282026129f58161234d565b91508282048414831517612a0c57612a0b61275c565b5b5092915050565b6000612a1e8261234d565b9150612a298361234d565b9250828201905080821115612a4157612a4061275c565b5b92915050565b7f6d61782d77616c6c65742d73697a652d65786365656465640000000000000000600082015250565b6000612a7d601883612234565b9150612a8882612a47565b602082019050919050565b60006020820190508181036000830152612aac81612a70565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b6000612b40612b3b612b3684612b11565b612b1b565b61234d565b9050919050565b612b5081612b25565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612b8b8161230f565b82525050565b6000612b9d8383612b82565b60208301905092915050565b6000602082019050919050565b6000612bc182612b56565b612bcb8185612b61565b9350612bd683612b72565b8060005b83811015612c07578151612bee8882612b91565b9750612bf983612ba9565b925050600181019050612bda565b5085935050505092915050565b6000604082019050612c296000830185612b47565b8181036020830152612c3b8184612bb6565b90509392505050565b600080fd5b612c528261226f565b810181811067ffffffffffffffff82111715612c7157612c70612ab3565b5b80604052505050565b6000612c846122db565b9050612c908282612c49565b919050565b600067ffffffffffffffff821115612cb057612caf612ab3565b5b602082029050602081019050919050565b600080fd5b600081519050612cd581612357565b92915050565b6000612cee612ce984612c95565b612c7a565b90508083825260208201905060208402830185811115612d1157612d10612cc1565b5b835b81811015612d3a5780612d268882612cc6565b845260208401935050602081019050612d13565b5050509392505050565b600082601f830112612d5957612d58612c44565b5b8151612d69848260208601612cdb565b91505092915050565b600060208284031215612d8857612d876122e5565b5b600082015167ffffffffffffffff811115612da657612da56122ea565b5b612db284828501612d44565b91505092915050565b6000819050919050565b6000612de0612ddb612dd684612dbb565b612b1b565b61234d565b9050919050565b612df081612dc5565b82525050565b600060a082019050612e0b60008301886123f9565b612e186020830187612de7565b8181036040830152612e2a8186612bb6565b9050612e396060830185612423565b612e4660808301846123f9565b9695505050505050565b600081905092915050565b50565b6000612e6b600083612e50565b9150612e7682612e5b565b600082019050919050565b6000612e8c82612e5e565b915081905091905056fea26469706673582212201d0ccf2070cee7bf133c1177136769826c4a80d91e0aa93f28e379e3d1dbe47e64736f6c634300081c0033

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.