ETH Price: $1,908.42 (+4.21%)
 

Overview

Max Total Supply

1,430,000,000 Charm

Holders

1,317

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

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
shanghai EvmVersion
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.19;

// oz imports
import { ERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";

// local imports
import { IUniswapV2Router02 } from "./interfaces/IUniswapV2Router02.sol";
import { IUniswapV2Factory } from "./interfaces/IUniswapV2Factory.sol";

/**
 * @title CharmToken
 * @notice ERC-20 contract for $Charm token. This contract does contain a taxing mechanism on buys, sells, & transfers.
 */
contract CharmToken is ERC20, Ownable {

    // ---------------
    // State Variables
    // ---------------

    /// @notice Amount of accumulated $Charm royalties needed to distribute royalties.
    uint256 public swapTokensAtAmount;

    /// @notice If true, `account` is excluded from fees (aka whitelisted).
    mapping(address account => bool) public isExcludedFromFees;

    /// @notice If true, `pair` is a verified pair/pool.
    mapping(address pair => bool) public automatedMarketMakerPairs;

    /// @notice Stores the contract reference to the local Uniswap V2 Router contract.
    IUniswapV2Router02 public uniswapV2Router;
    
    /// @notice Stores the address to the Charm/WETH Uniswap pair.
    address public uniswapV2Pair;

    /// @notice Stores the address of a tax beneficiary.
    address public taxReceiver1;

    /// @notice Stores the address of a tax beneficiary.
    address public taxReceiver2;

    /// @notice Stores the address of a tax beneficiary.
    address public taxReceiver3;

    /// @notice Stores the address of a tax beneficiary.
    address public taxReceiver4;

    /// @notice Stores the address of a tax beneficiary.
    address public taxReceiver5;

    /// @notice Stores the address of a tax beneficiary.
    address public taxReceiver6;

    /// @notice Stores the address of a tax beneficiary.
    address public taxReceiver7;

    /// @notice Stores the address of a tax beneficiary.
    address public taxReceiver8;

    /// @notice Fee allocation for `taxReceiver1`.
    uint8 public fee1;

    /// @notice Fee allocation for `taxReceiver2`.
    uint8 public fee2;

    /// @notice Fee allocation for `taxReceiver3`.
    uint8 public fee3;

    /// @notice Fee allocation for `taxReceiver4`.
    uint8 public fee4;

    /// @notice Fee allocation for `taxReceiver5`.
    uint8 public fee5;

    /// @notice Fee allocation for `taxReceiver6`.
    uint8 public fee6;

    /// @notice Fee allocation for `taxReceiver7`.
    uint8 public fee7;

    /// @notice Fee allocation for `taxReceiver8`.
    uint8 public fee8;

    /// @notice Total fee taken. `fee1` + `fee2` + `fee3` + `fee4` + `fee5` + `fee6` + `fee7` + `fee8`.
    uint8 public totalFees;

    /// @notice Used to prevent re-entrancy during royalty distribution.
    bool private swapping;

    /// @notice If true, a `totalFee` fee is taken from traders.
    bool public feesEnabled;

    /// @notice Maximum amount of tokens allowed in a tx.
    uint256 public maxTxAmount;

    /// @notice Max amount to sell on royalty handling.
    uint256 public swapTokensUpperLimit;


    // ------
    // Events
    // ------

    /**
     * @notice This event is emitted when `excludeFromFees` is executed.
     * @param account Address that was (or was not) excluded from fees.
     * @param isExcluded If true, `account` is excluded from fees. Otherwise, false.
     */
    event ExcludedFromFees(address indexed account, bool isExcluded);

    /**
     * @notice This event is emitted when `automatedMarketMakerPairs` is modified.
     * @param pair Pair contract address.
     * @param value If true, `pair` is a verified pair address or pool. Otherwise, false.
     */
    event SetAutomatedMarketMakerPair(address indexed pair, bool value);

    /**
     * @notice This event is emitted when `updateFees` is executed.
     */
    event FeesUpdated(uint256 totalFee, uint8 fee1, uint8 fee2, uint8 fee3, uint8 fee4, uint8 fee5, uint8 fee6, uint8 fee7, uint8 fee8);

    /**
     * @notice This event is emitted when a tax receiver address is updated.
     */
    event TaxReceiverAddressUpdated(uint8 id, address newAccount);

    /**
     * @notice This event is emitted when fees are distributed.
     */
    event FeesDistributed(uint256 totalAmountETH);


    // ------
    // Errors
    // ------

    /**
     * @notice This error is emitted from an invalid address(0) input.
     */
    error ZeroAddress();


    // ---------
    // Modifiers
    // ---------

    modifier lockSwap() {
        swapping = true;
        _;
        swapping = false;
    }


    // -----------
    // Constructor
    // -----------

    /**
     * @notice This initializes CharmToken.
     * @param _admin Initial default admin address.
     * @param _router Local Uniswap v2 router address.
     */
    constructor(address _admin, address _router) ERC20("Charm", "Charm") Ownable(_admin) {
        taxReceiver1 = 0x7382aa07a9C825f96CeAA794183cdEA72F000Ca8;
        taxReceiver2 = 0x7382aa07a9C825f96CeAA794183cdEA72F000Ca8;
        taxReceiver3 = 0x7382aa07a9C825f96CeAA794183cdEA72F000Ca8;
        taxReceiver4 = 0x7382aa07a9C825f96CeAA794183cdEA72F000Ca8;
        taxReceiver5 = 0x7382aa07a9C825f96CeAA794183cdEA72F000Ca8;
        taxReceiver6 = 0x7382aa07a9C825f96CeAA794183cdEA72F000Ca8;
        taxReceiver7 = 0x7382aa07a9C825f96CeAA794183cdEA72F000Ca8;
        taxReceiver8 = 0x7382aa07a9C825f96CeAA794183cdEA72F000Ca8;

        fee1 = 3;
        fee2 = 2;
        fee3 = 1;
        fee4 = 1;
        fee5 = 1;
        fee6 = 1;
        fee7 = 1;
        fee8 = 1;

        totalFees = fee1 + fee2 + fee3 + fee4 + fee5 + fee6 + fee7 + fee8;
        feesEnabled = true;

        isExcludedFromFees[0x7382aa07a9C825f96CeAA794183cdEA72F000Ca8] = true;
        isExcludedFromFees[address(this)] = true;
        isExcludedFromFees[_admin] = true;
        isExcludedFromFees[address(0)] = true;

        if (_router != address(0)) {
            uniswapV2Router = IUniswapV2Router02(_router);
            uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
            _setAutomatedMarketMakerPair(uniswapV2Pair, true);
        }

        swapTokensAtAmount   =  1_000_000 ether; // $100 at init price ($0.0001) .00003
        swapTokensUpperLimit = 10_000_000 ether; // $1000 at init price ($0.0001)

        uint256 supply = 1_430_000_000 ether;
        maxTxAmount    = supply; // MAX by default
        
        _mint(_admin, supply);
    }


    // -------
    // Methods
    // -------

    /// @dev Allows address(this) to receive ETH.
    receive() external payable {}

    function toggleFees() external onlyOwner {
        feesEnabled = !feesEnabled;
    }
    
    function manualSwapAndSend() external {
        require(!swapping, "royalty dist in progress");

        uint256 amount = balanceOf(address(this));
        require(amount != 0, "insufficient balance");

        _handleRoyalties(amount);
    }

    function manualSend() external {
        require(address(this).balance != 0, "insufficient balance");
        _distributeETH();
    }

    function extractTokens(address _token) external onlyOwner {
        uint256 bal = IERC20(_token).balanceOf(address(this));
        require(bal != 0, "insufficient balance");
        IERC20(_token).transfer(msg.sender, bal);
    }

    /**
     * @notice This method allows a permissioned admin to update the fees.
     * @dev If fees are being set to 0 -> It's preferred to just disable feesEnabled.
     *      Otherwise, make sure ETH balance in contract is 0 first.
     */
    function updateFees(uint8 _fee1, uint8 _fee2, uint8 _fee3, uint8 _fee4, uint8 _fee5, uint8 _fee6, uint8 _fee7, uint8 _fee8) external onlyOwner {
        totalFees = _fee1 + _fee2 + _fee3 + _fee4 + _fee5 + _fee6 + _fee7 + _fee8;

        require(totalFees <= 20, "sum of fees cannot exceed 20");
        
        fee1 = _fee1;
        fee2 = _fee2;
        fee3 = _fee3;
        fee4 = _fee4;
        fee5 = _fee5;
        fee6 = _fee6;
        fee7 = _fee7;
        fee8 = _fee8;

        emit FeesUpdated(totalFees, _fee1, _fee2, _fee3, _fee4, _fee5, _fee6, _fee7, _fee8);
    }

    function updateTaxReceiver1(address _account) external onlyOwner {
        require(taxReceiver1 != _account, "value already set");
        if (_account == address(0)) revert ZeroAddress();

        emit TaxReceiverAddressUpdated(1, _account);

        taxReceiver1 = _account;
        _excludeFromFees(taxReceiver1, true);
    }

    function updateTaxReceiver2(address _account) external onlyOwner {
        require(taxReceiver2 != _account, "value already set");
        if (_account == address(0)) revert ZeroAddress();

        emit TaxReceiverAddressUpdated(2, _account);
        
        taxReceiver2 = _account;
        _excludeFromFees(taxReceiver2, true);
    }

    function updateTaxReceiver3(address _account) external onlyOwner {
        require(taxReceiver3 != _account, "value already set");
        if (_account == address(0)) revert ZeroAddress();

        emit TaxReceiverAddressUpdated(3, _account);
        
        taxReceiver3 = _account;
        _excludeFromFees(taxReceiver3, true);
    }

    function updateTaxReceiver4(address _account) external onlyOwner {
        require(taxReceiver4 != _account, "value already set");
        if (_account == address(0)) revert ZeroAddress();

        emit TaxReceiverAddressUpdated(4, _account);
        
        taxReceiver4 = _account;
        _excludeFromFees(taxReceiver4, true);
    }

    function updateTaxReceiver5(address _account) external onlyOwner {
        require(taxReceiver5 != _account, "value already set");
        if (_account == address(0)) revert ZeroAddress();

        emit TaxReceiverAddressUpdated(5, _account);
        
        taxReceiver5 = _account;
        _excludeFromFees(taxReceiver5, true);
    }

    function updateTaxReceiver6(address _account) external onlyOwner {
        require(taxReceiver6 != _account, "value already set");
        if (_account == address(0)) revert ZeroAddress();

        emit TaxReceiverAddressUpdated(6, _account);
        
        taxReceiver6 = _account;
        _excludeFromFees(taxReceiver6, true);
    }

    function updateTaxReceiver7(address _account) external onlyOwner {
        require(taxReceiver7 != _account, "value already set");
        if (_account == address(0)) revert ZeroAddress();

        emit TaxReceiverAddressUpdated(7, _account);
        
        taxReceiver7 = _account;
        _excludeFromFees(taxReceiver7, true);
    }

    function updateTaxReceiver8(address _account) external onlyOwner {
        require(taxReceiver8 != _account, "value already set");
        if (_account == address(0)) revert ZeroAddress();

        emit TaxReceiverAddressUpdated(8, _account);
        
        taxReceiver8 = _account;
        _excludeFromFees(taxReceiver8, true);
    }

    function setMaxTxAmount(uint256 _maxTxAmount) external onlyOwner {
        maxTxAmount = _maxTxAmount;
    }

    /**
     * @notice This method allows a permissioned admin to update the `uniswapV2Pair` var.
     * @dev Used in the event the pool has to be created post deployment.
     * @param pair Pair Address -> Should be Charm/WETH.
     */
    function setUniswapV2Pair(address pair) external onlyOwner {
        if (pair == address(0)) revert ZeroAddress();
        uniswapV2Pair = pair;
        _setAutomatedMarketMakerPair(pair, true);
    }

    /**
     * @notice This method allows a permissioned admin to set a new automated market maker pair.
     * @param pair Pair contract address.
     * @param value If true, `pair` is a verified pair address or pool. Otherwise, false.
     */
    function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        if (pair == address(0)) revert ZeroAddress();
        _setAutomatedMarketMakerPair(pair, value);
    }

    /**
     * @notice This method allows a permissioned admin to modify whitelisted addresses.
     * @dev Whitelisted addresses are excluded from fees.
     * @param account Address that is (or is not) excluded from fees.
     * @param excluded If true, `account` is excluded from fees. Otherwise, false.
     */
    function excludeFromFees(address account, bool excluded) external onlyOwner {
        _excludeFromFees(account, excluded);
    }

    /**
     * @notice This method allows a permissioned admin to set the new royalty balance threshold to trigger distribution.
     * @param swapAmount New amount of tokens to accumulate before distributing.
     */
    function setSwapTokensAtAmount(uint256 swapAmount) onlyOwner external {
        swapTokensAtAmount = swapAmount;
    }

    /**
     * @notice This method allows a permissioned admin to set the upper limit of royalty balance that can be distributed.
     * @param upperLimit The max amount of royalties that can be sold on sell/transfer.
     */
    function setSwapTokensUpperLimit(uint256 upperLimit) onlyOwner external {
        require(upperLimit >= swapTokensAtAmount, "must be >= swapTokensAtAmount");
        swapTokensUpperLimit = upperLimit;
    }

    
    // ----------------
    // Internal Methods
    // ----------------

    /**
     * @notice Transfers an `amount` amount of tokens from `from` to `to`.
     * @dev This overrides `_update` from ERC20.`
     *      Unless `from` or `to` is excluded, there will be a tax on the transfer.
     * @param from Address balance decreasing.
     * @param to Address balance increasing.
     * @param amount Amount of tokens being transferred.
     */
    function _update(address from, address to, uint256 amount) internal override {

        // note: if automatedMarketMakerPairs[from] == true -> BUY
        // note: if automatedMarketMakerPairs[to] == true   -> SELL

        bool excludedAccount = isExcludedFromFees[from] || isExcludedFromFees[to];
        bool toOrFromPair = automatedMarketMakerPairs[from] || automatedMarketMakerPairs[to];

        // if not whitelisted, handle royalties and check for limits
        if (!excludedAccount) {

            // if buy or sell, check maxTx amount
            if (toOrFromPair) {
                require(amount <= maxTxAmount, "Max Tx Amount exceeded");
            }

            // if sell, distribute royalties and perform swap & distributions
            if (automatedMarketMakerPairs[to]) {
            
                // take contract balance of royalty tokens
                uint256 contractTokenBalance = balanceOf(address(this));

                // if the contract balance is greater than swapTokensAtAmount, we swap
                bool canSwap = contractTokenBalance >= swapTokensAtAmount;
                
                if (!swapping && canSwap) {
                    // if contract balance is greater than swapTokensUpperLimit, set to swapTokensUpperLimit
                    if (contractTokenBalance > swapTokensUpperLimit) {
                        contractTokenBalance = swapTokensUpperLimit;
                    }
                    _handleRoyalties(contractTokenBalance);
                }
            }
        }

        bool takeFee = !swapping && !excludedAccount && feesEnabled && toOrFromPair;

        // `takeFee` == true if no distribution && non-WL && fees enabled
        if(takeFee) {
            uint256 fees;

            fees = (amount * totalFees) / 100;        
            amount -= fees;

            super._update(from, address(this), fees);
        }

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

    function _handleRoyalties(uint256 amount) internal {
        _swapTokensForETH(amount);
        if (address(this).balance > 0) {
            _distributeETH();
        }
    }

    /**
     * @notice This internal method takes `tokenAmount` of tokens and swaps it for ETH.
     * @param tokenAmount Amount of $Charm tokens being swapped/sold for ETH.
     */
    function _swapTokensForETH(uint256 tokenAmount) internal lockSwap {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETH(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp + 300
        );
    }

    function _distributeETH() internal {
        uint256 amount = address(this).balance;
        bool sent;

        (sent,) = taxReceiver1.call{value: amount * fee1 / totalFees}("");
        require(sent, "Failed to send Ether to recipient 1");

        (sent,) = taxReceiver2.call{value: amount * fee2 / totalFees}("");
        require(sent, "Failed to send Ether to recipient 2");

        (sent,) = taxReceiver3.call{value: amount * fee3 / totalFees}("");
        require(sent, "Failed to send Ether to recipient 3");

        (sent,) = taxReceiver4.call{value: amount * fee4 / totalFees}("");
        require(sent, "Failed to send Ether to recipient 4");

        (sent,) = taxReceiver5.call{value: amount * fee5 / totalFees}("");
        require(sent, "Failed to send Ether to recipient 5");

        (sent,) = taxReceiver6.call{value: amount * fee6 / totalFees}("");
        require(sent, "Failed to send Ether to recipient 6");

        (sent,) = taxReceiver7.call{value: amount * fee7 / totalFees}("");
        require(sent, "Failed to send Ether to recipient 7");

        (sent,) = taxReceiver8.call{value: amount * fee8 / totalFees}("");
        require(sent, "Failed to send Ether to recipient 8");

        emit FeesDistributed(amount);
    }

    /**
     * @notice This internal method updates the `automatedMarketMakerPairs` mapping.
     * @param pair Pair contract address.
     * @param value If true, address is set as an AMM pair. Otherwise, false.
     */
    function _setAutomatedMarketMakerPair(address pair, bool value) internal {
        require(automatedMarketMakerPairs[pair] != value, "Already set");

        automatedMarketMakerPairs[pair] = value;
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    /**
     * @notice This method allows a permissioned admin to modify whitelisted addresses.
     * @dev Whitelisted addresses are excluded from fees.
     * @param account Address that is (or is not) excluded from fees.
     * @param excluded If true, `account` is excluded from fees. Otherwise, false.
     */
    function _excludeFromFees(address account, bool excluded) internal {
        if (isExcludedFromFees[account] != excluded) {
            isExcludedFromFees[account] = excluded;
            emit ExcludedFromFees(account, excluded);
        }
    }

    /**
     * @dev Extends the Ownable::_transferOwnership function to allow the parent contract to
     * exclude the new owner from fees.
     */
    function _transferOwnership(address newOwner) internal override {
        _excludeFromFees(newOwner, true);
        super._transferOwnership(newOwner);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.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 ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address 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}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

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

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

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

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

        emit Transfer(from, to, value);
    }

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

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

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

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

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

// 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);
    }
}

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;
}

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;
}

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

pragma solidity ^0.8.20;

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

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

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

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

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

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

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.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 ERC20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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);
}

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "shanghai",
  "viaIR": false
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ZeroAddress","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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalAmountETH","type":"uint256"}],"name":"FeesDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalFee","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"fee1","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"fee2","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"fee3","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"fee4","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"fee5","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"fee6","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"fee7","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"fee8","type":"uint8"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"id","type":"uint8"},{"indexed":false,"internalType":"address","name":"newAccount","type":"address"}],"name":"TaxReceiverAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"pair","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"extractTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee1","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee2","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee3","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee4","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee5","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee6","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee7","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee8","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSwapAndSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"swapAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"upperLimit","type":"uint256"}],"name":"setSwapTokensUpperLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"setUniswapV2Pair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensUpperLimit","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":"taxReceiver1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxReceiver2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxReceiver3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxReceiver4","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxReceiver5","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxReceiver6","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxReceiver7","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxReceiver8","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_fee1","type":"uint8"},{"internalType":"uint8","name":"_fee2","type":"uint8"},{"internalType":"uint8","name":"_fee3","type":"uint8"},{"internalType":"uint8","name":"_fee4","type":"uint8"},{"internalType":"uint8","name":"_fee5","type":"uint8"},{"internalType":"uint8","name":"_fee6","type":"uint8"},{"internalType":"uint8","name":"_fee7","type":"uint8"},{"internalType":"uint8","name":"_fee8","type":"uint8"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"updateTaxReceiver1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"updateTaxReceiver2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"updateTaxReceiver3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"updateTaxReceiver4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"updateTaxReceiver5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"updateTaxReceiver6","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"updateTaxReceiver7","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"updateTaxReceiver8","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801562000010575f80fd5b50604051620083743803806200837483398181016040528101906200003691906200212b565b816040518060400160405280600581526020017f436861726d0000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f436861726d0000000000000000000000000000000000000000000000000000008152508160039081620000b49190620023d4565b508060049081620000c69190620023d4565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200013c575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620001339190620024c9565b60405180910390fd5b6200014d8162000a1c60201b60201c565b50737382aa07a9c825f96ceaa794183cdea72f000ca8600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737382aa07a9c825f96ceaa794183cdea72f000ca8600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737382aa07a9c825f96ceaa794183cdea72f000ca8600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737382aa07a9c825f96ceaa794183cdea72f000ca8600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737382aa07a9c825f96ceaa794183cdea72f000ca8600f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737382aa07a9c825f96ceaa794183cdea72f000ca860105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737382aa07a9c825f96ceaa794183cdea72f000ca860115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737382aa07a9c825f96ceaa794183cdea72f000ca860125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003601260146101000a81548160ff021916908360ff1602179055506002601260156101000a81548160ff021916908360ff1602179055506001601260166101000a81548160ff021916908360ff1602179055506001601260176101000a81548160ff021916908360ff1602179055506001601260186101000a81548160ff021916908360ff1602179055506001601260196101000a81548160ff021916908360ff16021790555060016012601a6101000a81548160ff021916908360ff16021790555060016012601b6101000a81548160ff021916908360ff1602179055506012601b9054906101000a900460ff166012601a9054906101000a900460ff16601260199054906101000a900460ff16601260189054906101000a900460ff16601260179054906101000a900460ff16601260169054906101000a900460ff16601260159054906101000a900460ff16601260149054906101000a900460ff166200055a91906200251d565b6200056691906200251d565b6200057291906200251d565b6200057e91906200251d565b6200058a91906200251d565b6200059691906200251d565b620005a291906200251d565b6012601c6101000a81548160ff021916908360ff16021790555060016012601e6101000a81548160ff021916908315150217905550600160075f737382aa07a9c825f96ceaa794183cdea72f000ca873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160075f8073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614620009c7578060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200081e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000844919062002558565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620008cb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620008f1919062002558565b6040518363ffffffff1660e01b81526004016200091092919062002588565b6020604051808303815f875af11580156200092d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000953919062002558565b600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620009c6600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600162000a4360201b60201c565b5b69d3c21bcecceda10000006006819055506a084595161401484a0000006014819055505f6b049ede47552cb7615600000090508060138190555062000a13838262000b7d60201b60201c565b5050506200309a565b62000a2f81600162000c0760201b60201c565b62000a408162000d0560201b60201c565b50565b80151560085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615150362000ad5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000acc9062002611565b60405180910390fd5b8060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab8260405162000b7191906200264d565b60405180910390a25050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000bf0575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040162000be79190620024c9565b60405180910390fd5b62000c035f838362000dc860201b60201c565b5050565b80151560075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615151462000d01578060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f3499bfcf9673677ba552f3fe2ea274ec7e6246da31c3c87e115b45a9b0db2efb8260405162000cf891906200264d565b60405180910390a25b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168062000e65575060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b90505f60085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168062000f04575060085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b9050816200101157801562000f5c5760135483111562000f5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f5290620026b6565b60405180910390fd5b5b60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161562001010575f62000fbe30620010cb60201b60201c565b90505f60065482101590506012601d9054906101000a900460ff1615801562000fe45750805b156200100d5760145482111562000ffb5760145491505b6200100c826200111060201b60201c565b5b50505b5b5f6012601d9054906101000a900460ff161580156200102e575082155b80156200104757506012601e9054906101000a900460ff165b8015620010515750815b90508015620010b0575f60646012601c9054906101000a900460ff1660ff16866200107d9190620026d6565b6200108991906200274d565b9050808562001099919062002784565b9450620010ae8730836200113e60201b60201c565b505b620010c38686866200113e60201b60201c565b505050505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b62001121816200136260201b60201c565b5f4711156200113b576200113a6200160d60201b60201c565b5b50565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362001192578060025f828254620011859190620027be565b9250508190555062001263565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156200121e578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401620012159392919062002809565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620012ac578060025f8282540392505081905550620012f6565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162001355919062002844565b60405180910390a3505050565b60016012601d6101000a81548160ff0219169083151502179055505f600267ffffffffffffffff8111156200139c576200139b6200217a565b5b604051908082528060200260200182016040528015620013cb5781602001602082028036833780820191505090505b50905030815f81518110620013e557620013e46200285f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200148a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620014b0919062002558565b81600181518110620014c757620014c66200285f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050620015353060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168462001ec760201b60201c565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318cbafe5835f843061012c42620015869190620027be565b6040518663ffffffff1660e01b8152600401620015a895949392919062002994565b5f604051808303815f875af1158015620015c4573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190620015ee919062002b64565b50505f6012601d6101000a81548160ff02191690831515021790555050565b5f4790505f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260149054906101000a900460ff1660ff16846200167d9190620026d6565b6200168991906200274d565b604051620016979062002be4565b5f6040518083038185875af1925050503d805f8114620016d3576040519150601f19603f3d011682016040523d82523d5f602084013e620016d8565b606091505b5050809150508062001721576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620017189062002c6e565b60405180910390fd5b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260159054906101000a900460ff1660ff16846200178c9190620026d6565b6200179891906200274d565b604051620017a69062002be4565b5f6040518083038185875af1925050503d805f8114620017e2576040519150601f19603f3d011682016040523d82523d5f602084013e620017e7565b606091505b5050809150508062001830576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620018279062002d02565b60405180910390fd5b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260169054906101000a900460ff1660ff16846200189b9190620026d6565b620018a791906200274d565b604051620018b59062002be4565b5f6040518083038185875af1925050503d805f8114620018f1576040519150601f19603f3d011682016040523d82523d5f602084013e620018f6565b606091505b505080915050806200193f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620019369062002d96565b60405180910390fd5b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260179054906101000a900460ff1660ff1684620019aa9190620026d6565b620019b691906200274d565b604051620019c49062002be4565b5f6040518083038185875af1925050503d805f811462001a00576040519150601f19603f3d011682016040523d82523d5f602084013e62001a05565b606091505b5050809150508062001a4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001a459062002e2a565b60405180910390fd5b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260189054906101000a900460ff1660ff168462001ab99190620026d6565b62001ac591906200274d565b60405162001ad39062002be4565b5f6040518083038185875af1925050503d805f811462001b0f576040519150601f19603f3d011682016040523d82523d5f602084013e62001b14565b606091505b5050809150508062001b5d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001b549062002ebe565b60405180910390fd5b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260199054906101000a900460ff1660ff168462001bc89190620026d6565b62001bd491906200274d565b60405162001be29062002be4565b5f6040518083038185875af1925050503d805f811462001c1e576040519150601f19603f3d011682016040523d82523d5f602084013e62001c23565b606091505b5050809150508062001c6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001c639062002f52565b60405180910390fd5b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff166012601a9054906101000a900460ff1660ff168462001cd79190620026d6565b62001ce391906200274d565b60405162001cf19062002be4565b5f6040518083038185875af1925050503d805f811462001d2d576040519150601f19603f3d011682016040523d82523d5f602084013e62001d32565b606091505b5050809150508062001d7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001d729062002fe6565b60405180910390fd5b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff166012601b9054906101000a900460ff1660ff168462001de69190620026d6565b62001df291906200274d565b60405162001e009062002be4565b5f6040518083038185875af1925050503d805f811462001e3c576040519150601f19603f3d011682016040523d82523d5f602084013e62001e41565b606091505b5050809150508062001e8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001e81906200307a565b60405180910390fd5b7f8959421a1320789a49eeec01a4750caf8a30733c3db14f000d84484df89300f98260405162001ebb919062002844565b60405180910390a15050565b62001edc838383600162001ee160201b60201c565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160362001f54575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040162001f4b9190620024c9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362001fc7575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040162001fbe9190620024c9565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015620020b3578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051620020aa919062002844565b60405180910390a35b50505050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620020f582620020ca565b9050919050565b6200210781620020e9565b811462002112575f80fd5b50565b5f815190506200212581620020fc565b92915050565b5f8060408385031215620021445762002143620020c2565b5b5f620021538582860162002115565b9250506020620021668582860162002115565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620021ec57607f821691505b602082108103620022025762002201620021a7565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620022667fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262002229565b62002272868362002229565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620022bc620022b6620022b0846200228a565b62002293565b6200228a565b9050919050565b5f819050919050565b620022d7836200229c565b620022ef620022e682620022c3565b84845462002235565b825550505050565b5f90565b62002305620022f7565b62002312818484620022cc565b505050565b5b8181101562002339576200232d5f82620022fb565b60018101905062002318565b5050565b601f8211156200238857620023528162002208565b6200235d846200221a565b810160208510156200236d578190505b620023856200237c856200221a565b83018262002317565b50505b505050565b5f82821c905092915050565b5f620023aa5f19846008026200238d565b1980831691505092915050565b5f620023c4838362002399565b9150826002028217905092915050565b620023df8262002170565b67ffffffffffffffff811115620023fb57620023fa6200217a565b5b620024078254620021d4565b620024148282856200233d565b5f60209050601f8311600181146200244a575f841562002435578287015190505b620024418582620023b7565b865550620024b0565b601f1984166200245a8662002208565b5f5b8281101562002483578489015182556001820191506020850194506020810190506200245c565b86831015620024a357848901516200249f601f89168262002399565b8355505b6001600288020188555050505b505050505050565b620024c381620020e9565b82525050565b5f602082019050620024de5f830184620024b8565b92915050565b5f60ff82169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6200252982620024e4565b91506200253683620024e4565b9250828201905060ff811115620025525762002551620024f0565b5b92915050565b5f6020828403121562002570576200256f620020c2565b5b5f6200257f8482850162002115565b91505092915050565b5f6040820190506200259d5f830185620024b8565b620025ac6020830184620024b8565b9392505050565b5f82825260208201905092915050565b7f416c7265616479207365740000000000000000000000000000000000000000005f82015250565b5f620025f9600b83620025b3565b91506200260682620025c3565b602082019050919050565b5f6020820190508181035f8301526200262a81620025eb565b9050919050565b5f8115159050919050565b620026478162002631565b82525050565b5f602082019050620026625f8301846200263c565b92915050565b7f4d617820547820416d6f756e74206578636565646564000000000000000000005f82015250565b5f6200269e601683620025b3565b9150620026ab8262002668565b602082019050919050565b5f6020820190508181035f830152620026cf8162002690565b9050919050565b5f620026e2826200228a565b9150620026ef836200228a565b9250828202620026ff816200228a565b91508282048414831517620027195762002718620024f0565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f62002759826200228a565b915062002766836200228a565b92508262002779576200277862002720565b5b828204905092915050565b5f62002790826200228a565b91506200279d836200228a565b9250828203905081811115620027b857620027b7620024f0565b5b92915050565b5f620027ca826200228a565b9150620027d7836200228a565b9250828201905080821115620027f257620027f1620024f0565b5b92915050565b62002803816200228a565b82525050565b5f6060820190506200281e5f830186620024b8565b6200282d6020830185620027f8565b6200283c6040830184620027f8565b949350505050565b5f602082019050620028595f830184620027f8565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f620028b5620028af620028a9846200288c565b62002293565b6200228a565b9050919050565b620028c78162002895565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6200290181620020e9565b82525050565b5f620029148383620028f6565b60208301905092915050565b5f602082019050919050565b5f6200293882620028cd565b620029448185620028d7565b93506200295183620028e7565b805f5b83811015620029875781516200296b888262002907565b9750620029788362002920565b92505060018101905062002954565b5085935050505092915050565b5f60a082019050620029a95f830188620027f8565b620029b86020830187620028bc565b8181036040830152620029cc81866200292c565b9050620029dd6060830185620024b8565b620029ec6080830184620027f8565b9695505050505050565b5f80fd5b5f601f19601f8301169050919050565b62002a1582620029fa565b810181811067ffffffffffffffff8211171562002a375762002a366200217a565b5b80604052505050565b5f62002a4b620020b9565b905062002a59828262002a0a565b919050565b5f67ffffffffffffffff82111562002a7b5762002a7a6200217a565b5b602082029050602081019050919050565b5f80fd5b62002a9b816200228a565b811462002aa6575f80fd5b50565b5f8151905062002ab98162002a90565b92915050565b5f62002ad562002acf8462002a5e565b62002a40565b9050808382526020820190506020840283018581111562002afb5762002afa62002a8c565b5b835b8181101562002b28578062002b13888262002aa9565b84526020840193505060208101905062002afd565b5050509392505050565b5f82601f83011262002b495762002b48620029f6565b5b815162002b5b84826020860162002abf565b91505092915050565b5f6020828403121562002b7c5762002b7b620020c2565b5b5f82015167ffffffffffffffff81111562002b9c5762002b9b620020c6565b5b62002baa8482850162002b32565b91505092915050565b5f81905092915050565b50565b5f62002bcd5f8362002bb3565b915062002bda8262002bbd565b5f82019050919050565b5f62002bf08262002bc0565b9150819050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420310000000000000000000000000000000000000000000000000000000000602082015250565b5f62002c56602383620025b3565b915062002c638262002bfa565b604082019050919050565b5f6020820190508181035f83015262002c878162002c48565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420320000000000000000000000000000000000000000000000000000000000602082015250565b5f62002cea602383620025b3565b915062002cf78262002c8e565b604082019050919050565b5f6020820190508181035f83015262002d1b8162002cdc565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420330000000000000000000000000000000000000000000000000000000000602082015250565b5f62002d7e602383620025b3565b915062002d8b8262002d22565b604082019050919050565b5f6020820190508181035f83015262002daf8162002d70565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420340000000000000000000000000000000000000000000000000000000000602082015250565b5f62002e12602383620025b3565b915062002e1f8262002db6565b604082019050919050565b5f6020820190508181035f83015262002e438162002e04565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420350000000000000000000000000000000000000000000000000000000000602082015250565b5f62002ea6602383620025b3565b915062002eb38262002e4a565b604082019050919050565b5f6020820190508181035f83015262002ed78162002e98565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420360000000000000000000000000000000000000000000000000000000000602082015250565b5f62002f3a602383620025b3565b915062002f478262002ede565b604082019050919050565b5f6020820190508181035f83015262002f6b8162002f2c565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420370000000000000000000000000000000000000000000000000000000000602082015250565b5f62002fce602383620025b3565b915062002fdb8262002f72565b604082019050919050565b5f6020820190508181035f83015262002fff8162002fc0565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420380000000000000000000000000000000000000000000000000000000000602082015250565b5f62003062602383620025b3565b91506200306f8262003006565b604082019050919050565b5f6020820190508181035f830152620030938162003054565b9050919050565b6152cc80620030a85f395ff3fe60806040526004361061036d575f3560e01c80638c0b5e22116101c5578063be3bcffd116100f6578063e2f4560511610094578063ec28438a1161006e578063ec28438a14610c26578063f2fde38b14610c4e578063f429389014610c76578063fa1440fe14610c8c57610374565b8063e2f4560514610baa578063e4d645e014610bd4578063e87ea0df14610bfe57610374565b8063c6098256116100d0578063c609825614610b04578063d7c185a714610b2e578063dd62ed3e14610b58578063ddf5451214610b9457610374565b8063be3bcffd14610a88578063c024666814610ab2578063c5b81fd214610ada57610374565b8063a29a608911610163578063a9059cbb1161013d578063a9059cbb146109c0578063afa4f3b2146109fc578063afcff2e814610a24578063b62496f514610a4c57610374565b8063a29a608914610946578063a504b43b1461096e578063a64e4f8a1461099657610374565b80639a7a23d61161019f5780639a7a23d6146108a45780639d14d2a8146108cc5780639f111538146108f4578063a0b6c0511461091e57610374565b80638c0b5e22146108265780638da5cb5b1461085057806395d89b411461087a57610374565b8063313ce5671161029f5780634fbee1931161023d57806370a082311161021757806370a0823114610780578063715018a6146107bc578063744a85a4146107d257806385d30fc8146107fc57610374565b80634fbee193146106f05780635b7cc4b61461072c5780636ea192191461075657610374565b80633fbac287116102795780633fbac2871461064857806341f67dce1461067257806349bd5a5e1461069c5780634a6f25b4146106c657610374565b8063313ce567146105de57806339f73a48146106085780633ee0ce021461063257610374565b8063142c27a31161030c57806318160ddd116102e657806318160ddd146105265780632200f2b61461055057806323b872dd1461057a5780632a929042146105b657610374565b8063142c27a3146104aa57806316784a13146104d25780631694505e146104fc57610374565b8063095ea7b311610348578063095ea7b3146103f457806311d1109c1461043057806312ee72191461045857806313114a9d1461048057610374565b8062ae3a401461037857806306fdde03146103a257806307ebd12f146103cc57610374565b3661037457005b5f80fd5b348015610383575f80fd5b5061038c610cb4565b6040516103999190613ce2565b60405180910390f35b3480156103ad575f80fd5b506103b6610cd9565b6040516103c39190613d85565b60405180910390f35b3480156103d7575f80fd5b506103f260048036038101906103ed9190613de0565b610d69565b005b3480156103ff575f80fd5b5061041a60048036038101906104159190613e3e565b610eae565b6040516104279190613e96565b60405180910390f35b34801561043b575f80fd5b5061045660048036038101906104519190613de0565b610ed0565b005b348015610463575f80fd5b5061047e60048036038101906104799190613eaf565b611075565b005b34801561048b575f80fd5b506104946110cc565b6040516104a19190613ef5565b60405180910390f35b3480156104b5575f80fd5b506104d060048036038101906104cb9190613de0565b6110df565b005b3480156104dd575f80fd5b506104e6611284565b6040516104f39190613ce2565b60405180910390f35b348015610507575f80fd5b506105106112a9565b60405161051d9190613f69565b60405180910390f35b348015610531575f80fd5b5061053a6112ce565b6040516105479190613f91565b60405180910390f35b34801561055b575f80fd5b506105646112d7565b6040516105719190613ce2565b60405180910390f35b348015610585575f80fd5b506105a0600480360381019061059b9190613faa565b6112fc565b6040516105ad9190613e96565b60405180910390f35b3480156105c1575f80fd5b506105dc60048036038101906105d79190613de0565b61132a565b005b3480156105e9575f80fd5b506105f26114cf565b6040516105ff9190613ef5565b60405180910390f35b348015610613575f80fd5b5061061c6114d7565b6040516106299190613ef5565b60405180910390f35b34801561063d575f80fd5b506106466114ea565b005b348015610653575f80fd5b5061065c611594565b6040516106699190613ce2565b60405180910390f35b34801561067d575f80fd5b506106866115b9565b6040516106939190613ef5565b60405180910390f35b3480156106a7575f80fd5b506106b06115cc565b6040516106bd9190613ce2565b60405180910390f35b3480156106d1575f80fd5b506106da6115f1565b6040516106e79190613ef5565b60405180910390f35b3480156106fb575f80fd5b5061071660048036038101906107119190613de0565b611604565b6040516107239190613e96565b60405180910390f35b348015610737575f80fd5b50610740611621565b60405161074d9190613ef5565b60405180910390f35b348015610761575f80fd5b5061076a611634565b6040516107779190613ce2565b60405180910390f35b34801561078b575f80fd5b506107a660048036038101906107a19190613de0565b611659565b6040516107b39190613f91565b60405180910390f35b3480156107c7575f80fd5b506107d061169e565b005b3480156107dd575f80fd5b506107e66116b1565b6040516107f39190613ef5565b60405180910390f35b348015610807575f80fd5b506108106116c4565b60405161081d9190613ef5565b60405180910390f35b348015610831575f80fd5b5061083a6116d7565b6040516108479190613f91565b60405180910390f35b34801561085b575f80fd5b506108646116dd565b6040516108719190613ce2565b60405180910390f35b348015610885575f80fd5b5061088e611705565b60405161089b9190613d85565b60405180910390f35b3480156108af575f80fd5b506108ca60048036038101906108c59190614024565b611795565b005b3480156108d7575f80fd5b506108f260048036038101906108ed9190613de0565b611810565b005b3480156108ff575f80fd5b506109086119b5565b6040516109159190613ce2565b60405180910390f35b348015610929575f80fd5b50610944600480360381019061093f9190613de0565b6119da565b005b348015610951575f80fd5b5061096c60048036038101906109679190613de0565b611b7f565b005b348015610979575f80fd5b50610994600480360381019061098f9190613de0565b611c3a565b005b3480156109a1575f80fd5b506109aa611ddf565b6040516109b79190613e96565b60405180910390f35b3480156109cb575f80fd5b506109e660048036038101906109e19190613e3e565b611df2565b6040516109f39190613e96565b60405180910390f35b348015610a07575f80fd5b50610a226004803603810190610a1d9190613eaf565b611e14565b005b348015610a2f575f80fd5b50610a4a6004803603810190610a459190613de0565b611e26565b005b348015610a57575f80fd5b50610a726004803603810190610a6d9190613de0565b611fcb565b604051610a7f9190613e96565b60405180910390f35b348015610a93575f80fd5b50610a9c611fe8565b604051610aa99190613ef5565b60405180910390f35b348015610abd575f80fd5b50610ad86004803603810190610ad39190614024565b611ffb565b005b348015610ae5575f80fd5b50610aee612011565b604051610afb9190613f91565b60405180910390f35b348015610b0f575f80fd5b50610b18612017565b604051610b259190613ef5565b60405180910390f35b348015610b39575f80fd5b50610b4261202a565b604051610b4f9190613ce2565b60405180910390f35b348015610b63575f80fd5b50610b7e6004803603810190610b799190614062565b61204f565b604051610b8b9190613f91565b60405180910390f35b348015610b9f575f80fd5b50610ba86120d1565b005b348015610bb5575f80fd5b50610bbe612105565b604051610bcb9190613f91565b60405180910390f35b348015610bdf575f80fd5b50610be861210b565b604051610bf59190613ce2565b60405180910390f35b348015610c09575f80fd5b50610c246004803603810190610c1f91906140ca565b612130565b005b348015610c31575f80fd5b50610c4c6004803603810190610c479190613eaf565b61232e565b005b348015610c59575f80fd5b50610c746004803603810190610c6f9190613de0565b612340565b005b348015610c81575f80fd5b50610c8a6123c4565b005b348015610c97575f80fd5b50610cb26004803603810190610cad9190613de0565b612410565b005b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054610ce8906141a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d14906141a8565b8015610d5f5780601f10610d3657610100808354040283529160200191610d5f565b820191905f5260205f20905b815481529060010190602001808311610d4257829003601f168201915b5050505050905090565b610d716125b5565b5f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dab9190613ce2565b602060405180830381865afa158015610dc6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dea91906141ec565b90505f8103610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590614261565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610e6992919061427f565b6020604051808303815f875af1158015610e85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ea991906142ba565b505050565b5f80610eb861263c565b9050610ec5818585612643565b600191505092915050565b610ed86125b5565b8073ffffffffffffffffffffffffffffffffffffffff1660115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5e9061432f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fcc576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa6f2d065982c5698464d7b42f4b490e46e65d37063ebc45e357f2654e24f7185600782604051610ffe929190614386565b60405180910390a18060115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061107260115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612655565b50565b61107d6125b5565b6006548110156110c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b9906143f7565b60405180910390fd5b8060148190555050565b6012601c9054906101000a900460ff1681565b6110e76125b5565b8073ffffffffffffffffffffffffffffffffffffffff1660105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d9061432f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111db576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa6f2d065982c5698464d7b42f4b490e46e65d37063ebc45e357f2654e24f718560068260405161120d92919061444e565b60405180910390a18060105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061128160105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612655565b50565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600254905090565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8061130661263c565b9050611313858285612750565b61131e8585856127e2565b60019150509392505050565b6113326125b5565b8073ffffffffffffffffffffffffffffffffffffffff16600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b89061432f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611426576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa6f2d065982c5698464d7b42f4b490e46e65d37063ebc45e357f2654e24f71856002826040516114589291906144ae565b60405180910390a180600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506114cc600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612655565b50565b5f6012905090565b601260159054906101000a900460ff1681565b6012601d9054906101000a900460ff161561153a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115319061451f565b60405180910390fd5b5f61154430611659565b90505f8103611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f90614261565b60405180910390fd5b611591816128d2565b50565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6012601b9054906101000a900460ff1681565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260179054906101000a900460ff1681565b6007602052805f5260405f205f915054906101000a900460ff1681565b601260189054906101000a900460ff1681565b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6116a66125b5565b6116af5f6128ef565b565b6012601a9054906101000a900460ff1681565b601260169054906101000a900460ff1681565b60135481565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611714906141a8565b80601f0160208091040260200160405190810160405280929190818152602001828054611740906141a8565b801561178b5780601f106117625761010080835404028352916020019161178b565b820191905f5260205f20905b81548152906001019060200180831161176e57829003601f168201915b5050505050905090565b61179d6125b5565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611802576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61180c8282612906565b5050565b6118186125b5565b8073ffffffffffffffffffffffffffffffffffffffff16600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036118a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189e9061432f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361190c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa6f2d065982c5698464d7b42f4b490e46e65d37063ebc45e357f2654e24f718560038260405161193e929190614576565b60405180910390a180600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506119b2600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612655565b50565b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6119e26125b5565b8073ffffffffffffffffffffffffffffffffffffffff16600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a689061432f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ad6576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa6f2d065982c5698464d7b42f4b490e46e65d37063ebc45e357f2654e24f7185600182604051611b089291906145d6565b60405180910390a180600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b7c600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612655565b50565b611b876125b5565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bec576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611c37816001612906565b50565b611c426125b5565b8073ffffffffffffffffffffffffffffffffffffffff16600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc89061432f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d36576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa6f2d065982c5698464d7b42f4b490e46e65d37063ebc45e357f2654e24f7185600482604051611d68929190614636565b60405180910390a180600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611ddc600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612655565b50565b6012601e9054906101000a900460ff1681565b5f80611dfc61263c565b9050611e098185856127e2565b600191505092915050565b611e1c6125b5565b8060068190555050565b611e2e6125b5565b8073ffffffffffffffffffffffffffffffffffffffff16600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb49061432f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f22576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa6f2d065982c5698464d7b42f4b490e46e65d37063ebc45e357f2654e24f7185600582604051611f54929190614696565b60405180910390a180600f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611fc8600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612655565b50565b6008602052805f5260405f205f915054906101000a900460ff1681565b601260199054906101000a900460ff1681565b6120036125b5565b61200d8282612655565b5050565b60145481565b601260149054906101000a900460ff1681565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6120d96125b5565b6012601e9054906101000a900460ff16156012601e6101000a81548160ff021916908315150217905550565b60065481565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121386125b5565b80828486888a8c8e61214a91906146ea565b61215491906146ea565b61215e91906146ea565b61216891906146ea565b61217291906146ea565b61217c91906146ea565b61218691906146ea565b6012601c6101000a81548160ff021916908360ff16021790555060146012601c9054906101000a900460ff1660ff1611156121f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ed90614768565b60405180910390fd5b87601260146101000a81548160ff021916908360ff16021790555086601260156101000a81548160ff021916908360ff16021790555085601260166101000a81548160ff021916908360ff16021790555084601260176101000a81548160ff021916908360ff16021790555083601260186101000a81548160ff021916908360ff16021790555082601260196101000a81548160ff021916908360ff160217905550816012601a6101000a81548160ff021916908360ff160217905550806012601b6101000a81548160ff021916908360ff1602179055507f9123046ae47a3e0006e64aba69bbd3ba1fedf437941cf1436169d87f2b5869b76012601c9054906101000a900460ff16898989898989898960405161231c999897969594939291906147b6565b60405180910390a15050505050505050565b6123366125b5565b8060138190555050565b6123486125b5565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123b8575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016123af9190613ce2565b60405180910390fd5b6123c1816128ef565b50565b5f4703612406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fd90614261565b60405180910390fd5b61240e612a3b565b565b6124186125b5565b8073ffffffffffffffffffffffffffffffffffffffff1660125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036124a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249e9061432f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361250c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa6f2d065982c5698464d7b42f4b490e46e65d37063ebc45e357f2654e24f718560088260405161253e92919061487a565b60405180910390a18060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506125b260125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612655565b50565b6125bd61263c565b73ffffffffffffffffffffffffffffffffffffffff166125db6116dd565b73ffffffffffffffffffffffffffffffffffffffff161461263a576125fe61263c565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016126319190613ce2565b60405180910390fd5b565b5f33905090565b612650838383600161329b565b505050565b80151560075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615151461274c578060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f3499bfcf9673677ba552f3fe2ea274ec7e6246da31c3c87e115b45a9b0db2efb826040516127439190613e96565b60405180910390a25b5050565b5f61275b848461204f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146127dc57818110156127cd578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016127c4939291906148a1565b60405180910390fd5b6127db84848484035f61329b565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612852575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016128499190613ce2565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128c2575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016128b99190613ce2565b60405180910390fd5b6128cd83838361346a565b505050565b6128db81613738565b5f4711156128ec576128eb612a3b565b5b50565b6128fa816001612655565b612903816139c7565b50565b80151560085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503612995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298c90614920565b60405180910390fd5b8060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab82604051612a2f9190613e96565b60405180910390a25050565b5f4790505f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260149054906101000a900460ff1660ff1684612aa9919061493e565b612ab391906149ac565b604051612abf90614a09565b5f6040518083038185875af1925050503d805f8114612af9576040519150601f19603f3d011682016040523d82523d5f602084013e612afe565b606091505b50508091505080612b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3b90614a8d565b60405180910390fd5b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260159054906101000a900460ff1660ff1684612bad919061493e565b612bb791906149ac565b604051612bc390614a09565b5f6040518083038185875af1925050503d805f8114612bfd576040519150601f19603f3d011682016040523d82523d5f602084013e612c02565b606091505b50508091505080612c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3f90614b1b565b60405180910390fd5b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260169054906101000a900460ff1660ff1684612cb1919061493e565b612cbb91906149ac565b604051612cc790614a09565b5f6040518083038185875af1925050503d805f8114612d01576040519150601f19603f3d011682016040523d82523d5f602084013e612d06565b606091505b50508091505080612d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4390614ba9565b60405180910390fd5b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260179054906101000a900460ff1660ff1684612db5919061493e565b612dbf91906149ac565b604051612dcb90614a09565b5f6040518083038185875af1925050503d805f8114612e05576040519150601f19603f3d011682016040523d82523d5f602084013e612e0a565b606091505b50508091505080612e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4790614c37565b60405180910390fd5b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260189054906101000a900460ff1660ff1684612eb9919061493e565b612ec391906149ac565b604051612ecf90614a09565b5f6040518083038185875af1925050503d805f8114612f09576040519150601f19603f3d011682016040523d82523d5f602084013e612f0e565b606091505b50508091505080612f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4b90614cc5565b60405180910390fd5b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260199054906101000a900460ff1660ff1684612fbd919061493e565b612fc791906149ac565b604051612fd390614a09565b5f6040518083038185875af1925050503d805f811461300d576040519150601f19603f3d011682016040523d82523d5f602084013e613012565b606091505b50508091505080613058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304f90614d53565b60405180910390fd5b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff166012601a9054906101000a900460ff1660ff16846130c1919061493e565b6130cb91906149ac565b6040516130d790614a09565b5f6040518083038185875af1925050503d805f8114613111576040519150601f19603f3d011682016040523d82523d5f602084013e613116565b606091505b5050809150508061315c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315390614de1565b60405180910390fd5b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff166012601b9054906101000a900460ff1660ff16846131c5919061493e565b6131cf91906149ac565b6040516131db90614a09565b5f6040518083038185875af1925050503d805f8114613215576040519150601f19603f3d011682016040523d82523d5f602084013e61321a565b606091505b50508091505080613260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325790614e6f565b60405180910390fd5b7f8959421a1320789a49eeec01a4750caf8a30733c3db14f000d84484df89300f98260405161328f9190613f91565b60405180910390a15050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361330b575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016133029190613ce2565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361337b575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016133729190613ce2565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015613464578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161345b9190613f91565b60405180910390a35b50505050565b5f60075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680613506575060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b90505f60085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806135a4575060085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b9050816136985780156135f7576013548311156135f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ed90614ed7565b60405180910390fd5b5b60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615613697575f61365030611659565b90505f60065482101590506012601d9054906101000a900460ff161580156136755750805b156136945760145482111561368a5760145491505b613693826128d2565b5b50505b5b5f6012601d9054906101000a900460ff161580156136b4575082155b80156136cc57506012601e9054906101000a900460ff165b80156136d55750815b90508015613725575f60646012601c9054906101000a900460ff1660ff16866136fe919061493e565b61370891906149ac565b905080856137169190614ef5565b9450613723873083613a8a565b505b613730868686613a8a565b505050505050565b60016012601d6101000a81548160ff0219169083151502179055505f600267ffffffffffffffff81111561376f5761376e614f28565b5b60405190808252806020026020018201604052801561379d5781602001602082028036833780820191505090505b50905030815f815181106137b4576137b3614f55565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613858573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061387c9190614f96565b816001815181106138905761388f614f55565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506138f63060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612643565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318cbafe5835f843061012c426139459190614fc1565b6040518663ffffffff1660e01b81526004016139659594939291906150e4565b5f604051808303815f875af1158015613980573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906139a8919061524f565b50505f6012601d6101000a81548160ff02191690831515021790555050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613ada578060025f828254613ace9190614fc1565b92505081905550613ba8565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613b63578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401613b5a939291906148a1565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613bef578060025f8282540392505081905550613c39565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613c969190613f91565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613ccc82613ca3565b9050919050565b613cdc81613cc2565b82525050565b5f602082019050613cf55f830184613cd3565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613d32578082015181840152602081019050613d17565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613d5782613cfb565b613d618185613d05565b9350613d71818560208601613d15565b613d7a81613d3d565b840191505092915050565b5f6020820190508181035f830152613d9d8184613d4d565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b613dbf81613cc2565b8114613dc9575f80fd5b50565b5f81359050613dda81613db6565b92915050565b5f60208284031215613df557613df4613dae565b5b5f613e0284828501613dcc565b91505092915050565b5f819050919050565b613e1d81613e0b565b8114613e27575f80fd5b50565b5f81359050613e3881613e14565b92915050565b5f8060408385031215613e5457613e53613dae565b5b5f613e6185828601613dcc565b9250506020613e7285828601613e2a565b9150509250929050565b5f8115159050919050565b613e9081613e7c565b82525050565b5f602082019050613ea95f830184613e87565b92915050565b5f60208284031215613ec457613ec3613dae565b5b5f613ed184828501613e2a565b91505092915050565b5f60ff82169050919050565b613eef81613eda565b82525050565b5f602082019050613f085f830184613ee6565b92915050565b5f819050919050565b5f613f31613f2c613f2784613ca3565b613f0e565b613ca3565b9050919050565b5f613f4282613f17565b9050919050565b5f613f5382613f38565b9050919050565b613f6381613f49565b82525050565b5f602082019050613f7c5f830184613f5a565b92915050565b613f8b81613e0b565b82525050565b5f602082019050613fa45f830184613f82565b92915050565b5f805f60608486031215613fc157613fc0613dae565b5b5f613fce86828701613dcc565b9350506020613fdf86828701613dcc565b9250506040613ff086828701613e2a565b9150509250925092565b61400381613e7c565b811461400d575f80fd5b50565b5f8135905061401e81613ffa565b92915050565b5f806040838503121561403a57614039613dae565b5b5f61404785828601613dcc565b925050602061405885828601614010565b9150509250929050565b5f806040838503121561407857614077613dae565b5b5f61408585828601613dcc565b925050602061409685828601613dcc565b9150509250929050565b6140a981613eda565b81146140b3575f80fd5b50565b5f813590506140c4816140a0565b92915050565b5f805f805f805f80610100898b0312156140e7576140e6613dae565b5b5f6140f48b828c016140b6565b98505060206141058b828c016140b6565b97505060406141168b828c016140b6565b96505060606141278b828c016140b6565b95505060806141388b828c016140b6565b94505060a06141498b828c016140b6565b93505060c061415a8b828c016140b6565b92505060e061416b8b828c016140b6565b9150509295985092959890939650565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806141bf57607f821691505b6020821081036141d2576141d161417b565b5b50919050565b5f815190506141e681613e14565b92915050565b5f6020828403121561420157614200613dae565b5b5f61420e848285016141d8565b91505092915050565b7f696e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f61424b601483613d05565b915061425682614217565b602082019050919050565b5f6020820190508181035f8301526142788161423f565b9050919050565b5f6040820190506142925f830185613cd3565b61429f6020830184613f82565b9392505050565b5f815190506142b481613ffa565b92915050565b5f602082840312156142cf576142ce613dae565b5b5f6142dc848285016142a6565b91505092915050565b7f76616c756520616c7265616479207365740000000000000000000000000000005f82015250565b5f614319601183613d05565b9150614324826142e5565b602082019050919050565b5f6020820190508181035f8301526143468161430d565b9050919050565b5f819050919050565b5f61437061436b6143668461434d565b613f0e565b613eda565b9050919050565b61438081614356565b82525050565b5f6040820190506143995f830185614377565b6143a66020830184613cd3565b9392505050565b7f6d757374206265203e3d2073776170546f6b656e734174416d6f756e740000005f82015250565b5f6143e1601d83613d05565b91506143ec826143ad565b602082019050919050565b5f6020820190508181035f83015261440e816143d5565b9050919050565b5f819050919050565b5f61443861443361442e84614415565b613f0e565b613eda565b9050919050565b6144488161441e565b82525050565b5f6040820190506144615f83018561443f565b61446e6020830184613cd3565b9392505050565b5f819050919050565b5f61449861449361448e84614475565b613f0e565b613eda565b9050919050565b6144a88161447e565b82525050565b5f6040820190506144c15f83018561449f565b6144ce6020830184613cd3565b9392505050565b7f726f79616c7479206469737420696e2070726f677265737300000000000000005f82015250565b5f614509601883613d05565b9150614514826144d5565b602082019050919050565b5f6020820190508181035f830152614536816144fd565b9050919050565b5f819050919050565b5f61456061455b6145568461453d565b613f0e565b613eda565b9050919050565b61457081614546565b82525050565b5f6040820190506145895f830185614567565b6145966020830184613cd3565b9392505050565b5f819050919050565b5f6145c06145bb6145b68461459d565b613f0e565b613eda565b9050919050565b6145d0816145a6565b82525050565b5f6040820190506145e95f8301856145c7565b6145f66020830184613cd3565b9392505050565b5f819050919050565b5f61462061461b614616846145fd565b613f0e565b613eda565b9050919050565b61463081614606565b82525050565b5f6040820190506146495f830185614627565b6146566020830184613cd3565b9392505050565b5f819050919050565b5f61468061467b6146768461465d565b613f0e565b613eda565b9050919050565b61469081614666565b82525050565b5f6040820190506146a95f830185614687565b6146b66020830184613cd3565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6146f482613eda565b91506146ff83613eda565b9250828201905060ff811115614718576147176146bd565b5b92915050565b7f73756d206f6620666565732063616e6e6f7420657863656564203230000000005f82015250565b5f614752601c83613d05565b915061475d8261471e565b602082019050919050565b5f6020820190508181035f83015261477f81614746565b9050919050565b5f6147a061479b61479684613eda565b613f0e565b613e0b565b9050919050565b6147b081614786565b82525050565b5f610120820190506147ca5f83018c6147a7565b6147d7602083018b613ee6565b6147e4604083018a613ee6565b6147f16060830189613ee6565b6147fe6080830188613ee6565b61480b60a0830187613ee6565b61481860c0830186613ee6565b61482560e0830185613ee6565b614833610100830184613ee6565b9a9950505050505050505050565b5f819050919050565b5f61486461485f61485a84614841565b613f0e565b613eda565b9050919050565b6148748161484a565b82525050565b5f60408201905061488d5f83018561486b565b61489a6020830184613cd3565b9392505050565b5f6060820190506148b45f830186613cd3565b6148c16020830185613f82565b6148ce6040830184613f82565b949350505050565b7f416c7265616479207365740000000000000000000000000000000000000000005f82015250565b5f61490a600b83613d05565b9150614915826148d6565b602082019050919050565b5f6020820190508181035f830152614937816148fe565b9050919050565b5f61494882613e0b565b915061495383613e0b565b925082820261496181613e0b565b91508282048414831517614978576149776146bd565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6149b682613e0b565b91506149c183613e0b565b9250826149d1576149d061497f565b5b828204905092915050565b5f81905092915050565b50565b5f6149f45f836149dc565b91506149ff826149e6565b5f82019050919050565b5f614a13826149e9565b9150819050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420310000000000000000000000000000000000000000000000000000000000602082015250565b5f614a77602383613d05565b9150614a8282614a1d565b604082019050919050565b5f6020820190508181035f830152614aa481614a6b565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420320000000000000000000000000000000000000000000000000000000000602082015250565b5f614b05602383613d05565b9150614b1082614aab565b604082019050919050565b5f6020820190508181035f830152614b3281614af9565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420330000000000000000000000000000000000000000000000000000000000602082015250565b5f614b93602383613d05565b9150614b9e82614b39565b604082019050919050565b5f6020820190508181035f830152614bc081614b87565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420340000000000000000000000000000000000000000000000000000000000602082015250565b5f614c21602383613d05565b9150614c2c82614bc7565b604082019050919050565b5f6020820190508181035f830152614c4e81614c15565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420350000000000000000000000000000000000000000000000000000000000602082015250565b5f614caf602383613d05565b9150614cba82614c55565b604082019050919050565b5f6020820190508181035f830152614cdc81614ca3565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420360000000000000000000000000000000000000000000000000000000000602082015250565b5f614d3d602383613d05565b9150614d4882614ce3565b604082019050919050565b5f6020820190508181035f830152614d6a81614d31565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420370000000000000000000000000000000000000000000000000000000000602082015250565b5f614dcb602383613d05565b9150614dd682614d71565b604082019050919050565b5f6020820190508181035f830152614df881614dbf565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420380000000000000000000000000000000000000000000000000000000000602082015250565b5f614e59602383613d05565b9150614e6482614dff565b604082019050919050565b5f6020820190508181035f830152614e8681614e4d565b9050919050565b7f4d617820547820416d6f756e74206578636565646564000000000000000000005f82015250565b5f614ec1601683613d05565b9150614ecc82614e8d565b602082019050919050565b5f6020820190508181035f830152614eee81614eb5565b9050919050565b5f614eff82613e0b565b9150614f0a83613e0b565b9250828203905081811115614f2257614f216146bd565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050614f9081613db6565b92915050565b5f60208284031215614fab57614faa613dae565b5b5f614fb884828501614f82565b91505092915050565b5f614fcb82613e0b565b9150614fd683613e0b565b9250828201905080821115614fee57614fed6146bd565b5b92915050565b5f819050919050565b5f61501761501261500d84614ff4565b613f0e565b613e0b565b9050919050565b61502781614ffd565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61505f81613cc2565b82525050565b5f6150708383615056565b60208301905092915050565b5f602082019050919050565b5f6150928261502d565b61509c8185615037565b93506150a783615047565b805f5b838110156150d75781516150be8882615065565b97506150c98361507c565b9250506001810190506150aa565b5085935050505092915050565b5f60a0820190506150f75f830188613f82565b615104602083018761501e565b81810360408301526151168186615088565b90506151256060830185613cd3565b6151326080830184613f82565b9695505050505050565b5f80fd5b61514982613d3d565b810181811067ffffffffffffffff8211171561516857615167614f28565b5b80604052505050565b5f61517a613da5565b90506151868282615140565b919050565b5f67ffffffffffffffff8211156151a5576151a4614f28565b5b602082029050602081019050919050565b5f80fd5b5f6151cc6151c78461518b565b615171565b905080838252602082019050602084028301858111156151ef576151ee6151b6565b5b835b81811015615218578061520488826141d8565b8452602084019350506020810190506151f1565b5050509392505050565b5f82601f8301126152365761523561513c565b5b81516152468482602086016151ba565b91505092915050565b5f6020828403121561526457615263613dae565b5b5f82015167ffffffffffffffff81111561528157615280613db2565b5b61528d84828501615222565b9150509291505056fea2646970667358221220a217a513b8ffa780804bf0dbd40620560ee3fcedf6dc39c521f5d19422665c2b64736f6c63430008140033000000000000000000000000d56acc36ec1f83d0801493f399b66c2ebbcfba7b0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

Deployed Bytecode

0x60806040526004361061036d575f3560e01c80638c0b5e22116101c5578063be3bcffd116100f6578063e2f4560511610094578063ec28438a1161006e578063ec28438a14610c26578063f2fde38b14610c4e578063f429389014610c76578063fa1440fe14610c8c57610374565b8063e2f4560514610baa578063e4d645e014610bd4578063e87ea0df14610bfe57610374565b8063c6098256116100d0578063c609825614610b04578063d7c185a714610b2e578063dd62ed3e14610b58578063ddf5451214610b9457610374565b8063be3bcffd14610a88578063c024666814610ab2578063c5b81fd214610ada57610374565b8063a29a608911610163578063a9059cbb1161013d578063a9059cbb146109c0578063afa4f3b2146109fc578063afcff2e814610a24578063b62496f514610a4c57610374565b8063a29a608914610946578063a504b43b1461096e578063a64e4f8a1461099657610374565b80639a7a23d61161019f5780639a7a23d6146108a45780639d14d2a8146108cc5780639f111538146108f4578063a0b6c0511461091e57610374565b80638c0b5e22146108265780638da5cb5b1461085057806395d89b411461087a57610374565b8063313ce5671161029f5780634fbee1931161023d57806370a082311161021757806370a0823114610780578063715018a6146107bc578063744a85a4146107d257806385d30fc8146107fc57610374565b80634fbee193146106f05780635b7cc4b61461072c5780636ea192191461075657610374565b80633fbac287116102795780633fbac2871461064857806341f67dce1461067257806349bd5a5e1461069c5780634a6f25b4146106c657610374565b8063313ce567146105de57806339f73a48146106085780633ee0ce021461063257610374565b8063142c27a31161030c57806318160ddd116102e657806318160ddd146105265780632200f2b61461055057806323b872dd1461057a5780632a929042146105b657610374565b8063142c27a3146104aa57806316784a13146104d25780631694505e146104fc57610374565b8063095ea7b311610348578063095ea7b3146103f457806311d1109c1461043057806312ee72191461045857806313114a9d1461048057610374565b8062ae3a401461037857806306fdde03146103a257806307ebd12f146103cc57610374565b3661037457005b5f80fd5b348015610383575f80fd5b5061038c610cb4565b6040516103999190613ce2565b60405180910390f35b3480156103ad575f80fd5b506103b6610cd9565b6040516103c39190613d85565b60405180910390f35b3480156103d7575f80fd5b506103f260048036038101906103ed9190613de0565b610d69565b005b3480156103ff575f80fd5b5061041a60048036038101906104159190613e3e565b610eae565b6040516104279190613e96565b60405180910390f35b34801561043b575f80fd5b5061045660048036038101906104519190613de0565b610ed0565b005b348015610463575f80fd5b5061047e60048036038101906104799190613eaf565b611075565b005b34801561048b575f80fd5b506104946110cc565b6040516104a19190613ef5565b60405180910390f35b3480156104b5575f80fd5b506104d060048036038101906104cb9190613de0565b6110df565b005b3480156104dd575f80fd5b506104e6611284565b6040516104f39190613ce2565b60405180910390f35b348015610507575f80fd5b506105106112a9565b60405161051d9190613f69565b60405180910390f35b348015610531575f80fd5b5061053a6112ce565b6040516105479190613f91565b60405180910390f35b34801561055b575f80fd5b506105646112d7565b6040516105719190613ce2565b60405180910390f35b348015610585575f80fd5b506105a0600480360381019061059b9190613faa565b6112fc565b6040516105ad9190613e96565b60405180910390f35b3480156105c1575f80fd5b506105dc60048036038101906105d79190613de0565b61132a565b005b3480156105e9575f80fd5b506105f26114cf565b6040516105ff9190613ef5565b60405180910390f35b348015610613575f80fd5b5061061c6114d7565b6040516106299190613ef5565b60405180910390f35b34801561063d575f80fd5b506106466114ea565b005b348015610653575f80fd5b5061065c611594565b6040516106699190613ce2565b60405180910390f35b34801561067d575f80fd5b506106866115b9565b6040516106939190613ef5565b60405180910390f35b3480156106a7575f80fd5b506106b06115cc565b6040516106bd9190613ce2565b60405180910390f35b3480156106d1575f80fd5b506106da6115f1565b6040516106e79190613ef5565b60405180910390f35b3480156106fb575f80fd5b5061071660048036038101906107119190613de0565b611604565b6040516107239190613e96565b60405180910390f35b348015610737575f80fd5b50610740611621565b60405161074d9190613ef5565b60405180910390f35b348015610761575f80fd5b5061076a611634565b6040516107779190613ce2565b60405180910390f35b34801561078b575f80fd5b506107a660048036038101906107a19190613de0565b611659565b6040516107b39190613f91565b60405180910390f35b3480156107c7575f80fd5b506107d061169e565b005b3480156107dd575f80fd5b506107e66116b1565b6040516107f39190613ef5565b60405180910390f35b348015610807575f80fd5b506108106116c4565b60405161081d9190613ef5565b60405180910390f35b348015610831575f80fd5b5061083a6116d7565b6040516108479190613f91565b60405180910390f35b34801561085b575f80fd5b506108646116dd565b6040516108719190613ce2565b60405180910390f35b348015610885575f80fd5b5061088e611705565b60405161089b9190613d85565b60405180910390f35b3480156108af575f80fd5b506108ca60048036038101906108c59190614024565b611795565b005b3480156108d7575f80fd5b506108f260048036038101906108ed9190613de0565b611810565b005b3480156108ff575f80fd5b506109086119b5565b6040516109159190613ce2565b60405180910390f35b348015610929575f80fd5b50610944600480360381019061093f9190613de0565b6119da565b005b348015610951575f80fd5b5061096c60048036038101906109679190613de0565b611b7f565b005b348015610979575f80fd5b50610994600480360381019061098f9190613de0565b611c3a565b005b3480156109a1575f80fd5b506109aa611ddf565b6040516109b79190613e96565b60405180910390f35b3480156109cb575f80fd5b506109e660048036038101906109e19190613e3e565b611df2565b6040516109f39190613e96565b60405180910390f35b348015610a07575f80fd5b50610a226004803603810190610a1d9190613eaf565b611e14565b005b348015610a2f575f80fd5b50610a4a6004803603810190610a459190613de0565b611e26565b005b348015610a57575f80fd5b50610a726004803603810190610a6d9190613de0565b611fcb565b604051610a7f9190613e96565b60405180910390f35b348015610a93575f80fd5b50610a9c611fe8565b604051610aa99190613ef5565b60405180910390f35b348015610abd575f80fd5b50610ad86004803603810190610ad39190614024565b611ffb565b005b348015610ae5575f80fd5b50610aee612011565b604051610afb9190613f91565b60405180910390f35b348015610b0f575f80fd5b50610b18612017565b604051610b259190613ef5565b60405180910390f35b348015610b39575f80fd5b50610b4261202a565b604051610b4f9190613ce2565b60405180910390f35b348015610b63575f80fd5b50610b7e6004803603810190610b799190614062565b61204f565b604051610b8b9190613f91565b60405180910390f35b348015610b9f575f80fd5b50610ba86120d1565b005b348015610bb5575f80fd5b50610bbe612105565b604051610bcb9190613f91565b60405180910390f35b348015610bdf575f80fd5b50610be861210b565b604051610bf59190613ce2565b60405180910390f35b348015610c09575f80fd5b50610c246004803603810190610c1f91906140ca565b612130565b005b348015610c31575f80fd5b50610c4c6004803603810190610c479190613eaf565b61232e565b005b348015610c59575f80fd5b50610c746004803603810190610c6f9190613de0565b612340565b005b348015610c81575f80fd5b50610c8a6123c4565b005b348015610c97575f80fd5b50610cb26004803603810190610cad9190613de0565b612410565b005b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054610ce8906141a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d14906141a8565b8015610d5f5780601f10610d3657610100808354040283529160200191610d5f565b820191905f5260205f20905b815481529060010190602001808311610d4257829003601f168201915b5050505050905090565b610d716125b5565b5f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dab9190613ce2565b602060405180830381865afa158015610dc6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dea91906141ec565b90505f8103610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590614261565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610e6992919061427f565b6020604051808303815f875af1158015610e85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ea991906142ba565b505050565b5f80610eb861263c565b9050610ec5818585612643565b600191505092915050565b610ed86125b5565b8073ffffffffffffffffffffffffffffffffffffffff1660115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5e9061432f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fcc576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa6f2d065982c5698464d7b42f4b490e46e65d37063ebc45e357f2654e24f7185600782604051610ffe929190614386565b60405180910390a18060115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061107260115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612655565b50565b61107d6125b5565b6006548110156110c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b9906143f7565b60405180910390fd5b8060148190555050565b6012601c9054906101000a900460ff1681565b6110e76125b5565b8073ffffffffffffffffffffffffffffffffffffffff1660105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d9061432f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111db576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa6f2d065982c5698464d7b42f4b490e46e65d37063ebc45e357f2654e24f718560068260405161120d92919061444e565b60405180910390a18060105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061128160105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612655565b50565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600254905090565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8061130661263c565b9050611313858285612750565b61131e8585856127e2565b60019150509392505050565b6113326125b5565b8073ffffffffffffffffffffffffffffffffffffffff16600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b89061432f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611426576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa6f2d065982c5698464d7b42f4b490e46e65d37063ebc45e357f2654e24f71856002826040516114589291906144ae565b60405180910390a180600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506114cc600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612655565b50565b5f6012905090565b601260159054906101000a900460ff1681565b6012601d9054906101000a900460ff161561153a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115319061451f565b60405180910390fd5b5f61154430611659565b90505f8103611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f90614261565b60405180910390fd5b611591816128d2565b50565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6012601b9054906101000a900460ff1681565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260179054906101000a900460ff1681565b6007602052805f5260405f205f915054906101000a900460ff1681565b601260189054906101000a900460ff1681565b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6116a66125b5565b6116af5f6128ef565b565b6012601a9054906101000a900460ff1681565b601260169054906101000a900460ff1681565b60135481565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611714906141a8565b80601f0160208091040260200160405190810160405280929190818152602001828054611740906141a8565b801561178b5780601f106117625761010080835404028352916020019161178b565b820191905f5260205f20905b81548152906001019060200180831161176e57829003601f168201915b5050505050905090565b61179d6125b5565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611802576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61180c8282612906565b5050565b6118186125b5565b8073ffffffffffffffffffffffffffffffffffffffff16600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036118a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189e9061432f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361190c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa6f2d065982c5698464d7b42f4b490e46e65d37063ebc45e357f2654e24f718560038260405161193e929190614576565b60405180910390a180600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506119b2600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612655565b50565b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6119e26125b5565b8073ffffffffffffffffffffffffffffffffffffffff16600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a689061432f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ad6576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa6f2d065982c5698464d7b42f4b490e46e65d37063ebc45e357f2654e24f7185600182604051611b089291906145d6565b60405180910390a180600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b7c600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612655565b50565b611b876125b5565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bec576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611c37816001612906565b50565b611c426125b5565b8073ffffffffffffffffffffffffffffffffffffffff16600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc89061432f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d36576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa6f2d065982c5698464d7b42f4b490e46e65d37063ebc45e357f2654e24f7185600482604051611d68929190614636565b60405180910390a180600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611ddc600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612655565b50565b6012601e9054906101000a900460ff1681565b5f80611dfc61263c565b9050611e098185856127e2565b600191505092915050565b611e1c6125b5565b8060068190555050565b611e2e6125b5565b8073ffffffffffffffffffffffffffffffffffffffff16600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb49061432f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f22576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa6f2d065982c5698464d7b42f4b490e46e65d37063ebc45e357f2654e24f7185600582604051611f54929190614696565b60405180910390a180600f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611fc8600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612655565b50565b6008602052805f5260405f205f915054906101000a900460ff1681565b601260199054906101000a900460ff1681565b6120036125b5565b61200d8282612655565b5050565b60145481565b601260149054906101000a900460ff1681565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6120d96125b5565b6012601e9054906101000a900460ff16156012601e6101000a81548160ff021916908315150217905550565b60065481565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121386125b5565b80828486888a8c8e61214a91906146ea565b61215491906146ea565b61215e91906146ea565b61216891906146ea565b61217291906146ea565b61217c91906146ea565b61218691906146ea565b6012601c6101000a81548160ff021916908360ff16021790555060146012601c9054906101000a900460ff1660ff1611156121f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ed90614768565b60405180910390fd5b87601260146101000a81548160ff021916908360ff16021790555086601260156101000a81548160ff021916908360ff16021790555085601260166101000a81548160ff021916908360ff16021790555084601260176101000a81548160ff021916908360ff16021790555083601260186101000a81548160ff021916908360ff16021790555082601260196101000a81548160ff021916908360ff160217905550816012601a6101000a81548160ff021916908360ff160217905550806012601b6101000a81548160ff021916908360ff1602179055507f9123046ae47a3e0006e64aba69bbd3ba1fedf437941cf1436169d87f2b5869b76012601c9054906101000a900460ff16898989898989898960405161231c999897969594939291906147b6565b60405180910390a15050505050505050565b6123366125b5565b8060138190555050565b6123486125b5565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123b8575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016123af9190613ce2565b60405180910390fd5b6123c1816128ef565b50565b5f4703612406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fd90614261565b60405180910390fd5b61240e612a3b565b565b6124186125b5565b8073ffffffffffffffffffffffffffffffffffffffff1660125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036124a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249e9061432f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361250c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fa6f2d065982c5698464d7b42f4b490e46e65d37063ebc45e357f2654e24f718560088260405161253e92919061487a565b60405180910390a18060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506125b260125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001612655565b50565b6125bd61263c565b73ffffffffffffffffffffffffffffffffffffffff166125db6116dd565b73ffffffffffffffffffffffffffffffffffffffff161461263a576125fe61263c565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016126319190613ce2565b60405180910390fd5b565b5f33905090565b612650838383600161329b565b505050565b80151560075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615151461274c578060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f3499bfcf9673677ba552f3fe2ea274ec7e6246da31c3c87e115b45a9b0db2efb826040516127439190613e96565b60405180910390a25b5050565b5f61275b848461204f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146127dc57818110156127cd578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016127c4939291906148a1565b60405180910390fd5b6127db84848484035f61329b565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612852575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016128499190613ce2565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128c2575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016128b99190613ce2565b60405180910390fd5b6128cd83838361346a565b505050565b6128db81613738565b5f4711156128ec576128eb612a3b565b5b50565b6128fa816001612655565b612903816139c7565b50565b80151560085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503612995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298c90614920565b60405180910390fd5b8060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab82604051612a2f9190613e96565b60405180910390a25050565b5f4790505f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260149054906101000a900460ff1660ff1684612aa9919061493e565b612ab391906149ac565b604051612abf90614a09565b5f6040518083038185875af1925050503d805f8114612af9576040519150601f19603f3d011682016040523d82523d5f602084013e612afe565b606091505b50508091505080612b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3b90614a8d565b60405180910390fd5b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260159054906101000a900460ff1660ff1684612bad919061493e565b612bb791906149ac565b604051612bc390614a09565b5f6040518083038185875af1925050503d805f8114612bfd576040519150601f19603f3d011682016040523d82523d5f602084013e612c02565b606091505b50508091505080612c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3f90614b1b565b60405180910390fd5b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260169054906101000a900460ff1660ff1684612cb1919061493e565b612cbb91906149ac565b604051612cc790614a09565b5f6040518083038185875af1925050503d805f8114612d01576040519150601f19603f3d011682016040523d82523d5f602084013e612d06565b606091505b50508091505080612d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4390614ba9565b60405180910390fd5b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260179054906101000a900460ff1660ff1684612db5919061493e565b612dbf91906149ac565b604051612dcb90614a09565b5f6040518083038185875af1925050503d805f8114612e05576040519150601f19603f3d011682016040523d82523d5f602084013e612e0a565b606091505b50508091505080612e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4790614c37565b60405180910390fd5b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260189054906101000a900460ff1660ff1684612eb9919061493e565b612ec391906149ac565b604051612ecf90614a09565b5f6040518083038185875af1925050503d805f8114612f09576040519150601f19603f3d011682016040523d82523d5f602084013e612f0e565b606091505b50508091505080612f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4b90614cc5565b60405180910390fd5b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff16601260199054906101000a900460ff1660ff1684612fbd919061493e565b612fc791906149ac565b604051612fd390614a09565b5f6040518083038185875af1925050503d805f811461300d576040519150601f19603f3d011682016040523d82523d5f602084013e613012565b606091505b50508091505080613058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304f90614d53565b60405180910390fd5b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff166012601a9054906101000a900460ff1660ff16846130c1919061493e565b6130cb91906149ac565b6040516130d790614a09565b5f6040518083038185875af1925050503d805f8114613111576040519150601f19603f3d011682016040523d82523d5f602084013e613116565b606091505b5050809150508061315c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315390614de1565b60405180910390fd5b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166012601c9054906101000a900460ff1660ff166012601b9054906101000a900460ff1660ff16846131c5919061493e565b6131cf91906149ac565b6040516131db90614a09565b5f6040518083038185875af1925050503d805f8114613215576040519150601f19603f3d011682016040523d82523d5f602084013e61321a565b606091505b50508091505080613260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325790614e6f565b60405180910390fd5b7f8959421a1320789a49eeec01a4750caf8a30733c3db14f000d84484df89300f98260405161328f9190613f91565b60405180910390a15050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361330b575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016133029190613ce2565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361337b575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016133729190613ce2565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015613464578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161345b9190613f91565b60405180910390a35b50505050565b5f60075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680613506575060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b90505f60085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806135a4575060085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b9050816136985780156135f7576013548311156135f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ed90614ed7565b60405180910390fd5b5b60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615613697575f61365030611659565b90505f60065482101590506012601d9054906101000a900460ff161580156136755750805b156136945760145482111561368a5760145491505b613693826128d2565b5b50505b5b5f6012601d9054906101000a900460ff161580156136b4575082155b80156136cc57506012601e9054906101000a900460ff165b80156136d55750815b90508015613725575f60646012601c9054906101000a900460ff1660ff16866136fe919061493e565b61370891906149ac565b905080856137169190614ef5565b9450613723873083613a8a565b505b613730868686613a8a565b505050505050565b60016012601d6101000a81548160ff0219169083151502179055505f600267ffffffffffffffff81111561376f5761376e614f28565b5b60405190808252806020026020018201604052801561379d5781602001602082028036833780820191505090505b50905030815f815181106137b4576137b3614f55565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613858573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061387c9190614f96565b816001815181106138905761388f614f55565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506138f63060095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612643565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318cbafe5835f843061012c426139459190614fc1565b6040518663ffffffff1660e01b81526004016139659594939291906150e4565b5f604051808303815f875af1158015613980573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906139a8919061524f565b50505f6012601d6101000a81548160ff02191690831515021790555050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613ada578060025f828254613ace9190614fc1565b92505081905550613ba8565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613b63578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401613b5a939291906148a1565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613bef578060025f8282540392505081905550613c39565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613c969190613f91565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613ccc82613ca3565b9050919050565b613cdc81613cc2565b82525050565b5f602082019050613cf55f830184613cd3565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613d32578082015181840152602081019050613d17565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613d5782613cfb565b613d618185613d05565b9350613d71818560208601613d15565b613d7a81613d3d565b840191505092915050565b5f6020820190508181035f830152613d9d8184613d4d565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b613dbf81613cc2565b8114613dc9575f80fd5b50565b5f81359050613dda81613db6565b92915050565b5f60208284031215613df557613df4613dae565b5b5f613e0284828501613dcc565b91505092915050565b5f819050919050565b613e1d81613e0b565b8114613e27575f80fd5b50565b5f81359050613e3881613e14565b92915050565b5f8060408385031215613e5457613e53613dae565b5b5f613e6185828601613dcc565b9250506020613e7285828601613e2a565b9150509250929050565b5f8115159050919050565b613e9081613e7c565b82525050565b5f602082019050613ea95f830184613e87565b92915050565b5f60208284031215613ec457613ec3613dae565b5b5f613ed184828501613e2a565b91505092915050565b5f60ff82169050919050565b613eef81613eda565b82525050565b5f602082019050613f085f830184613ee6565b92915050565b5f819050919050565b5f613f31613f2c613f2784613ca3565b613f0e565b613ca3565b9050919050565b5f613f4282613f17565b9050919050565b5f613f5382613f38565b9050919050565b613f6381613f49565b82525050565b5f602082019050613f7c5f830184613f5a565b92915050565b613f8b81613e0b565b82525050565b5f602082019050613fa45f830184613f82565b92915050565b5f805f60608486031215613fc157613fc0613dae565b5b5f613fce86828701613dcc565b9350506020613fdf86828701613dcc565b9250506040613ff086828701613e2a565b9150509250925092565b61400381613e7c565b811461400d575f80fd5b50565b5f8135905061401e81613ffa565b92915050565b5f806040838503121561403a57614039613dae565b5b5f61404785828601613dcc565b925050602061405885828601614010565b9150509250929050565b5f806040838503121561407857614077613dae565b5b5f61408585828601613dcc565b925050602061409685828601613dcc565b9150509250929050565b6140a981613eda565b81146140b3575f80fd5b50565b5f813590506140c4816140a0565b92915050565b5f805f805f805f80610100898b0312156140e7576140e6613dae565b5b5f6140f48b828c016140b6565b98505060206141058b828c016140b6565b97505060406141168b828c016140b6565b96505060606141278b828c016140b6565b95505060806141388b828c016140b6565b94505060a06141498b828c016140b6565b93505060c061415a8b828c016140b6565b92505060e061416b8b828c016140b6565b9150509295985092959890939650565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806141bf57607f821691505b6020821081036141d2576141d161417b565b5b50919050565b5f815190506141e681613e14565b92915050565b5f6020828403121561420157614200613dae565b5b5f61420e848285016141d8565b91505092915050565b7f696e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f61424b601483613d05565b915061425682614217565b602082019050919050565b5f6020820190508181035f8301526142788161423f565b9050919050565b5f6040820190506142925f830185613cd3565b61429f6020830184613f82565b9392505050565b5f815190506142b481613ffa565b92915050565b5f602082840312156142cf576142ce613dae565b5b5f6142dc848285016142a6565b91505092915050565b7f76616c756520616c7265616479207365740000000000000000000000000000005f82015250565b5f614319601183613d05565b9150614324826142e5565b602082019050919050565b5f6020820190508181035f8301526143468161430d565b9050919050565b5f819050919050565b5f61437061436b6143668461434d565b613f0e565b613eda565b9050919050565b61438081614356565b82525050565b5f6040820190506143995f830185614377565b6143a66020830184613cd3565b9392505050565b7f6d757374206265203e3d2073776170546f6b656e734174416d6f756e740000005f82015250565b5f6143e1601d83613d05565b91506143ec826143ad565b602082019050919050565b5f6020820190508181035f83015261440e816143d5565b9050919050565b5f819050919050565b5f61443861443361442e84614415565b613f0e565b613eda565b9050919050565b6144488161441e565b82525050565b5f6040820190506144615f83018561443f565b61446e6020830184613cd3565b9392505050565b5f819050919050565b5f61449861449361448e84614475565b613f0e565b613eda565b9050919050565b6144a88161447e565b82525050565b5f6040820190506144c15f83018561449f565b6144ce6020830184613cd3565b9392505050565b7f726f79616c7479206469737420696e2070726f677265737300000000000000005f82015250565b5f614509601883613d05565b9150614514826144d5565b602082019050919050565b5f6020820190508181035f830152614536816144fd565b9050919050565b5f819050919050565b5f61456061455b6145568461453d565b613f0e565b613eda565b9050919050565b61457081614546565b82525050565b5f6040820190506145895f830185614567565b6145966020830184613cd3565b9392505050565b5f819050919050565b5f6145c06145bb6145b68461459d565b613f0e565b613eda565b9050919050565b6145d0816145a6565b82525050565b5f6040820190506145e95f8301856145c7565b6145f66020830184613cd3565b9392505050565b5f819050919050565b5f61462061461b614616846145fd565b613f0e565b613eda565b9050919050565b61463081614606565b82525050565b5f6040820190506146495f830185614627565b6146566020830184613cd3565b9392505050565b5f819050919050565b5f61468061467b6146768461465d565b613f0e565b613eda565b9050919050565b61469081614666565b82525050565b5f6040820190506146a95f830185614687565b6146b66020830184613cd3565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6146f482613eda565b91506146ff83613eda565b9250828201905060ff811115614718576147176146bd565b5b92915050565b7f73756d206f6620666565732063616e6e6f7420657863656564203230000000005f82015250565b5f614752601c83613d05565b915061475d8261471e565b602082019050919050565b5f6020820190508181035f83015261477f81614746565b9050919050565b5f6147a061479b61479684613eda565b613f0e565b613e0b565b9050919050565b6147b081614786565b82525050565b5f610120820190506147ca5f83018c6147a7565b6147d7602083018b613ee6565b6147e4604083018a613ee6565b6147f16060830189613ee6565b6147fe6080830188613ee6565b61480b60a0830187613ee6565b61481860c0830186613ee6565b61482560e0830185613ee6565b614833610100830184613ee6565b9a9950505050505050505050565b5f819050919050565b5f61486461485f61485a84614841565b613f0e565b613eda565b9050919050565b6148748161484a565b82525050565b5f60408201905061488d5f83018561486b565b61489a6020830184613cd3565b9392505050565b5f6060820190506148b45f830186613cd3565b6148c16020830185613f82565b6148ce6040830184613f82565b949350505050565b7f416c7265616479207365740000000000000000000000000000000000000000005f82015250565b5f61490a600b83613d05565b9150614915826148d6565b602082019050919050565b5f6020820190508181035f830152614937816148fe565b9050919050565b5f61494882613e0b565b915061495383613e0b565b925082820261496181613e0b565b91508282048414831517614978576149776146bd565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6149b682613e0b565b91506149c183613e0b565b9250826149d1576149d061497f565b5b828204905092915050565b5f81905092915050565b50565b5f6149f45f836149dc565b91506149ff826149e6565b5f82019050919050565b5f614a13826149e9565b9150819050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420310000000000000000000000000000000000000000000000000000000000602082015250565b5f614a77602383613d05565b9150614a8282614a1d565b604082019050919050565b5f6020820190508181035f830152614aa481614a6b565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420320000000000000000000000000000000000000000000000000000000000602082015250565b5f614b05602383613d05565b9150614b1082614aab565b604082019050919050565b5f6020820190508181035f830152614b3281614af9565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420330000000000000000000000000000000000000000000000000000000000602082015250565b5f614b93602383613d05565b9150614b9e82614b39565b604082019050919050565b5f6020820190508181035f830152614bc081614b87565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420340000000000000000000000000000000000000000000000000000000000602082015250565b5f614c21602383613d05565b9150614c2c82614bc7565b604082019050919050565b5f6020820190508181035f830152614c4e81614c15565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420350000000000000000000000000000000000000000000000000000000000602082015250565b5f614caf602383613d05565b9150614cba82614c55565b604082019050919050565b5f6020820190508181035f830152614cdc81614ca3565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420360000000000000000000000000000000000000000000000000000000000602082015250565b5f614d3d602383613d05565b9150614d4882614ce3565b604082019050919050565b5f6020820190508181035f830152614d6a81614d31565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420370000000000000000000000000000000000000000000000000000000000602082015250565b5f614dcb602383613d05565b9150614dd682614d71565b604082019050919050565b5f6020820190508181035f830152614df881614dbf565b9050919050565b7f4661696c656420746f2073656e6420457468657220746f20726563697069656e5f8201527f7420380000000000000000000000000000000000000000000000000000000000602082015250565b5f614e59602383613d05565b9150614e6482614dff565b604082019050919050565b5f6020820190508181035f830152614e8681614e4d565b9050919050565b7f4d617820547820416d6f756e74206578636565646564000000000000000000005f82015250565b5f614ec1601683613d05565b9150614ecc82614e8d565b602082019050919050565b5f6020820190508181035f830152614eee81614eb5565b9050919050565b5f614eff82613e0b565b9150614f0a83613e0b565b9250828203905081811115614f2257614f216146bd565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050614f9081613db6565b92915050565b5f60208284031215614fab57614faa613dae565b5b5f614fb884828501614f82565b91505092915050565b5f614fcb82613e0b565b9150614fd683613e0b565b9250828201905080821115614fee57614fed6146bd565b5b92915050565b5f819050919050565b5f61501761501261500d84614ff4565b613f0e565b613e0b565b9050919050565b61502781614ffd565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61505f81613cc2565b82525050565b5f6150708383615056565b60208301905092915050565b5f602082019050919050565b5f6150928261502d565b61509c8185615037565b93506150a783615047565b805f5b838110156150d75781516150be8882615065565b97506150c98361507c565b9250506001810190506150aa565b5085935050505092915050565b5f60a0820190506150f75f830188613f82565b615104602083018761501e565b81810360408301526151168186615088565b90506151256060830185613cd3565b6151326080830184613f82565b9695505050505050565b5f80fd5b61514982613d3d565b810181811067ffffffffffffffff8211171561516857615167614f28565b5b80604052505050565b5f61517a613da5565b90506151868282615140565b919050565b5f67ffffffffffffffff8211156151a5576151a4614f28565b5b602082029050602081019050919050565b5f80fd5b5f6151cc6151c78461518b565b615171565b905080838252602082019050602084028301858111156151ef576151ee6151b6565b5b835b81811015615218578061520488826141d8565b8452602084019350506020810190506151f1565b5050509392505050565b5f82601f8301126152365761523561513c565b5b81516152468482602086016151ba565b91505092915050565b5f6020828403121561526457615263613dae565b5b5f82015167ffffffffffffffff81111561528157615280613db2565b5b61528d84828501615222565b9150509291505056fea2646970667358221220a217a513b8ffa780804bf0dbd40620560ee3fcedf6dc39c521f5d19422665c2b64736f6c63430008140033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000d56acc36ec1f83d0801493f399b66c2ebbcfba7b0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

-----Decoded View---------------
Arg [0] : _admin (address): 0xD56acC36Ec1f83d0801493F399b66C2EBBcfba7B
Arg [1] : _router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000d56acc36ec1f83d0801493f399b66c2ebbcfba7b
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d


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.