ETH Price: $3,871.74 (+0.91%)

Token

ERC-20: Fumog (FUMOG)
 

Overview

Max Total Supply

23,307.843668411 FUMOG

Holders

293

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 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:
QuantumWealthAcceleratorToken

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 3 : QWA.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
pragma experimental ABIEncoderV2;

import "../interface/IQWAFee.sol";
import "../interface/factory/IQWAFactory.sol";

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

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

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

/* pragma solidity ^0.8.0; */

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol)

/* pragma solidity ^0.8.0; */

/* import "../IERC20.sol"; */

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
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);
}

/**
 * @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}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * 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.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * 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 override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 value {ERC20} uses, unless this function is
     * 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 override returns (uint8) {
        return 18;
    }

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(
        address spender,
        uint256 amount
    ) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        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}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "ERC20: transfer amount exceeds allowance"
        );
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) public virtual returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] + addedValue
        );
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * 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.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` 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.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

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

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

    function WETH() external pure returns (address);

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

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

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

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

interface IUniswapV3Router {
    struct ExactInputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
        uint160 sqrtPriceLimitX96;
    }

    function exactInputSingle(
        ExactInputSingleParams calldata params
    ) external payable returns (uint256 amountOut);
}

interface IWETH {
    function deposit() external payable;

    function withdraw(uint) external;
}

/// @title   QuantumWealthAcceleratorToken
/// @notice  Quantum Wealth Accelerator Token
contract QuantumWealthAcceleratorToken is ERC20, Ownable {
    /// STATE VARIABLES ///

    /// @notice Address of UniswapV2Router
    IUniswapV2Router02 private immutable uniswapV2Router;
    /// @notice Address of UniswapV3Router
    address private immutable uniswapV3Router;

    /// @notice Address of QWN/ETH LP
    address public immutable uniswapV2Pair;
    /// @notice WETH address
    address private immutable WETH;
    /// @notice Backing token addresses
    address[] public backingTokens;
    /// @notice Backing token V3 pool fee to swap (if 0 - v2)
    uint24[] private backingTokensV3Fee;
    /// @notice QWN treasury
    address public treasury;
    /// @notice Address QWA Factory address
    address private QWAFactory;

    bool private swapping;

    uint256 private backingSwapping;

    /// @notice Current percent of supply to swap tokens at (i.e. 5 = 0.05%)
    uint256 private swapPercent;

    /// @notice Current total fees
    uint256 public totalFees;
    /// @notice Current backing fee
    uint256 public backingFee;
    /// @notice Current liquidity fee
    uint256 public liquidityFee;
    /// @notice 1% QWA fee
    uint256 public constant QWA_FEE = 100;
    /// @notice Current team fee
    uint256 public teamFee;

    /// @notice Current tokens going for backing
    uint256 public tokensForBacking;
    /// @notice Current tokens going for liquidity
    uint256 public tokensForLiquidity;
    /// @notice Current tokens going for tean
    uint256 public tokensForTeam;
    /// @notice Current tokens going towards fee
    uint256 public tokensForFee;

    /// MAPPINGS ///

    /// @dev Bool if address is excluded from fees
    mapping(address => bool) private _isExcludedFromFees;

    /// @notice Bool if address is AMM pair
    mapping(address => bool) public automatedMarketMakerPairs;

    /// EVENTS ///

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    /// CONSTRUCTOR ///

    /// @param _weth  Address of WETH
    constructor(
        address _qwaFactory,
        address _weth,
        address[] memory _backingTokens,
        uint24[] memory _backingTokensV3Fee,
        string memory _name,
        string memory _symbol
    ) ERC20(_name, _symbol) {
        QWAFactory = _qwaFactory;
        WETH = _weth;
        backingTokens = _backingTokens;
        backingTokensV3Fee = _backingTokensV3Fee;

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        uniswapV2Router = _uniswapV2Router;

        uniswapV3Router = 0xE592427A0AEce92De3Edee1F18E0157C05861564;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _weth);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        swapPercent = 25; // 0.25%

        backingFee = 200;
        liquidityFee = 100;
        teamFee = 100;
        totalFees = 500;

        // exclude from paying fees
        _isExcludedFromFees[_qwaFactory] = true;
        _isExcludedFromFees[address(this)] = true;

        /// Starting supply of 25,000
        _mint(_qwaFactory, 25000000000000);
    }

    /// RECEIVE ///

    receive() external payable {}

    /// AMM PAIR ///

    /// @notice       Sets if address is AMM pair
    /// @param pair   Address of pair
    /// @param value  Bool if AMM pair
    function setAutomatedMarketMakerPair(
        address pair,
        bool value
    ) public onlyOwner {
        require(pair != uniswapV2Pair);

        _setAutomatedMarketMakerPair(pair, value);
    }

    /// @dev Internal function to set `vlaue` of `pair`
    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    /// INTERNAL TRANSFER ///

    /// @dev Internal function to burn `amount` from `account`
    function _burnFrom(address account, uint256 amount) internal {
        uint256 decreasedAllowance_ = allowance(account, msg.sender) - amount;

        _approve(account, msg.sender, decreasedAllowance_);
        _burn(account, amount);
    }

    /// @dev Internal function to transfer - handles fee logic
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount();

        if (
            canSwap &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;

            swapBack();

            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // on buy or sell
            if (
                (automatedMarketMakerPairs[from] ||
                    automatedMarketMakerPairs[to]) && totalFees > 0
            ) {
                fees = (amount * totalFees) / 10000;
                if (IQWAFactory(QWAFactory).feeDiscount(tx.origin))
                    fees = (fees * 3) / 4;
                tokensForLiquidity += (fees * liquidityFee) / totalFees;
                tokensForTeam += (fees * teamFee) / totalFees;
                tokensForBacking += (fees * backingFee) / totalFees;
                tokensForFee += (fees * QWA_FEE) / totalFees;
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

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

    /// PRIVATE FUNCTIONS ///

    /// @dev PRIVATE function to swap `ethTokenAmount` for ETH
    /// @dev Invoked in `swapBack()`
    function swapTokens(
        uint256 ethTokenAmount,
        uint256 totalTokensToSwap
    ) private returns (uint256 ethBalance_, uint256 ethForBacking_) {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;

        _approve(address(this), address(uniswapV2Router), ethTokenAmount + 1);

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

        ethBalance_ = address(this).balance;

        ethForBacking_ =
            (ethBalance_ * tokensForBacking) /
            (totalTokensToSwap - tokensForLiquidity / 2);

        address backingToken = backingTokens[backingSwapping];

        if (backingToken == WETH) {
            IWETH(WETH).deposit{value: ethForBacking_}();
            IERC20(WETH).transfer(treasury, ethForBacking_);
        } else {
            if (backingTokensV3Fee[backingSwapping] == 0) {
                path[0] = WETH;
                path[1] = backingToken;

                uniswapV2Router
                    .swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: ethForBacking_
                }(0, path, treasury, block.timestamp);
            } else {
                IUniswapV3Router.ExactInputSingleParams
                    memory params = IUniswapV3Router.ExactInputSingleParams({
                        tokenIn: WETH,
                        tokenOut: backingToken,
                        fee: backingTokensV3Fee[backingSwapping],
                        recipient: treasury,
                        deadline: block.timestamp,
                        amountIn: ethForBacking_,
                        amountOutMinimum: 0,
                        sqrtPriceLimitX96: 0
                    });

                IUniswapV3Router(uniswapV3Router).exactInputSingle{
                    value: ethForBacking_
                }(params);
            }
        }

        if (backingSwapping == backingTokens.length - 1) backingSwapping = 0;
        else ++backingSwapping;
    }

    /// @dev PRIVATE function to add `tokenAmount` and `ethAmount` to LP
    /// @dev Invoked in `swapBack()`
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            treasury,
            block.timestamp
        );
    }

    /// @dev PRIVATE function to transfer fees properly
    /// @dev Invoked in `_transfer()`
    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity +
            tokensForBacking +
            tokensForTeam +
            tokensForFee;
        bool success;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        uint256 liquidityTokens = (contractBalance * tokensForLiquidity) /
            totalTokensToSwap /
            2;

        uint256 amountToSwapForETH = contractBalance - liquidityTokens;

        (uint256 ethBalance, uint256 ethForBacking) = swapTokens(
            amountToSwapForETH,
            totalTokensToSwap
        );

        uint256 ethForTeam = (ethBalance * tokensForTeam) /
            (totalTokensToSwap - tokensForLiquidity / 2);

        uint256 ethForFee = (ethBalance * tokensForFee) /
            (totalTokensToSwap - tokensForLiquidity / 2);

        uint256 ethForLiquidity = ethBalance -
            ethForTeam -
            ethForFee -
            ethForBacking;

        tokensForLiquidity = 0;
        tokensForBacking = 0;
        tokensForTeam = 0;
        tokensForFee = 0;

        (success, ) = address(owner()).call{value: ethForTeam}("");

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                amountToSwapForETH,
                ethForLiquidity,
                tokensForLiquidity
            );
        }

        address feeAddress = IQWAFactory(QWAFactory).feeAddress();
        (success, ) = address(feeAddress).call{value: address(this).balance}(
            ""
        );
        IQWAFee(feeAddress).convertFees();
    }

    /// VIEW FUNCTION ///

    /// @notice Returns decimals for QWA (9)
    function decimals() public view virtual override returns (uint8) {
        return 9;
    }

    /// @notice Returns if address is excluded from fees
    function isExcludedFromFees(address account) external view returns (bool) {
        return _isExcludedFromFees[account];
    }

    /// @notice Returns at what percent of supply to swap tokens at
    function swapTokensAtAmount() public view returns (uint256 amount_) {
        amount_ = (totalSupply() * swapPercent) / 10000;
    }

    /// TREASURY FUNCTION ///

    /// @notice         Mint QWA (Only by treasury)
    /// @param account  Address to mint QWA to
    /// @param amount   Amount to mint
    function mint(address account, uint256 amount) external {
        require(msg.sender == treasury);
        _mint(account, amount);
    }

    /// USER FUNCTIONS ///

    /// @notice         Burn QWA
    /// @param account  Address to burn QWA from
    /// @param amount   Amount to QWA to burn
    function burnFrom(address account, uint256 amount) external {
        _burnFrom(account, amount);
    }

    /// @notice         Burn QWA
    /// @param amount   Amount to QWA to burn
    function burn(uint256 amount) external {
        _burn(msg.sender, amount);
    }

    /// OWNER FUNCTIONS ///

    /// @notice Set address of treasury
    function setTreasury(address _treasury) external onlyOwner {
        require(treasury == address(0));
        treasury = _treasury;
        excludeFromFees(_treasury, true);
    }

    /// @notice Update percent of supply to swap tokens at
    function updateSwapTokensAtPercent(uint256 newPercent) external onlyOwner {
        require(newPercent >= 1);
        require(newPercent <= 50);
        swapPercent = newPercent;
    }

    /// @notice Update fees
    function updateFees(
        uint256 _backingFee,
        uint256 _liquidityFee,
        uint256 _teamFee
    ) external onlyOwner {
        backingFee = _backingFee;
        liquidityFee = _liquidityFee;
        teamFee = _teamFee;
        totalFees = backingFee + liquidityFee + teamFee + QWA_FEE;
        require(teamFee <= 100, "Team fee <= 1%");
        require(totalFees <= 500);
    }

    /// @notice Set if an address is excluded from fees
    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }
}

File 2 of 3 : IQWAFactory.sol
// SPDX-License-Identifier: AGPL-3.0
pragma solidity 0.8.19;

interface IQWAFactory {
    function WETH() external view returns (address);
    function QWN() external view returns (address);
    function sQWN() external view returns (address);
    function QWNStaking() external view returns (address);
    function feeAddress() external view returns (address);
    function feeDiscount(address _user) external view returns (bool);
}

File 3 of 3 : IQWAFee.sol
pragma solidity 0.8.19;

interface IQWAFee {
    function convertFees() external;
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_qwaFactory","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address[]","name":"_backingTokens","type":"address[]"},{"internalType":"uint24[]","name":"_backingTokensV3Fee","type":"uint24[]"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"ExcludeFromFees","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":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"QWA_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"backingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"backingTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForBacking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTeam","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_backingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_teamFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"updateSwapTokensAtPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101006040523480156200001257600080fd5b506040516200561938038062005619833981810160405281019062000038919062000c32565b818181600390816200004b919062000f95565b5080600490816200005d919062000f95565b5050506200008062000074620003f660201b60201c565b620003fe60201b60201c565b85600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508473ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff168152505083600690805190602001906200010d929190620006e7565b5082600790805190602001906200012692919062000776565b506000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505073e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000208573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022e91906200107c565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630886040518363ffffffff1660e01b81526004016200026a929190620010bf565b6020604051808303816000875af11580156200028a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b091906200107c565b73ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050620002f860c0516001620004c460201b60201c565b6019600b8190555060c8600d819055506064600e819055506064600f819055506101f4600c819055506001601460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003e9876516bcc41e90006200056560201b60201c565b5050505050505062001207565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620005d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005ce906200114d565b60405180910390fd5b620005eb60008383620006dd60201b60201c565b8060026000828254620005ff91906200119e565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200065691906200119e565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620006bd9190620011ea565b60405180910390a3620006d960008383620006e260201b60201c565b5050565b505050565b505050565b82805482825590600052602060002090810192821562000763579160200282015b82811115620007625782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000708565b5b5090506200077291906200082a565b5090565b82805482825590600052602060002090600901600a90048101928215620008175791602002820160005b83821115620007e457835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302620007a0565b8015620008155782816101000a81549062ffffff0219169055600301602081600201049283019260010302620007e4565b505b5090506200082691906200082a565b5090565b5b80821115620008455760008160009055506001016200082b565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200088a826200085d565b9050919050565b6200089c816200087d565b8114620008a857600080fd5b50565b600081519050620008bc8162000891565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200091282620008c7565b810181811067ffffffffffffffff82111715620009345762000933620008d8565b5b80604052505050565b60006200094962000849565b905062000957828262000907565b919050565b600067ffffffffffffffff8211156200097a5762000979620008d8565b5b602082029050602081019050919050565b600080fd5b6000620009a7620009a1846200095c565b6200093d565b90508083825260208201905060208402830185811115620009cd57620009cc6200098b565b5b835b81811015620009fa5780620009e58882620008ab565b845260208401935050602081019050620009cf565b5050509392505050565b600082601f83011262000a1c5762000a1b620008c2565b5b815162000a2e84826020860162000990565b91505092915050565b600067ffffffffffffffff82111562000a555762000a54620008d8565b5b602082029050602081019050919050565b600062ffffff82169050919050565b62000a808162000a66565b811462000a8c57600080fd5b50565b60008151905062000aa08162000a75565b92915050565b600062000abd62000ab78462000a37565b6200093d565b9050808382526020820190506020840283018581111562000ae35762000ae26200098b565b5b835b8181101562000b10578062000afb888262000a8f565b84526020840193505060208101905062000ae5565b5050509392505050565b600082601f83011262000b325762000b31620008c2565b5b815162000b4484826020860162000aa6565b91505092915050565b600080fd5b600067ffffffffffffffff82111562000b705762000b6f620008d8565b5b62000b7b82620008c7565b9050602081019050919050565b60005b8381101562000ba857808201518184015260208101905062000b8b565b60008484015250505050565b600062000bcb62000bc58462000b52565b6200093d565b90508281526020810184848401111562000bea5762000be962000b4d565b5b62000bf784828562000b88565b509392505050565b600082601f83011262000c175762000c16620008c2565b5b815162000c2984826020860162000bb4565b91505092915050565b60008060008060008060c0878903121562000c525762000c5162000853565b5b600062000c6289828a01620008ab565b965050602062000c7589828a01620008ab565b955050604087015167ffffffffffffffff81111562000c995762000c9862000858565b5b62000ca789828a0162000a04565b945050606087015167ffffffffffffffff81111562000ccb5762000cca62000858565b5b62000cd989828a0162000b1a565b935050608087015167ffffffffffffffff81111562000cfd5762000cfc62000858565b5b62000d0b89828a0162000bff565b92505060a087015167ffffffffffffffff81111562000d2f5762000d2e62000858565b5b62000d3d89828a0162000bff565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d9d57607f821691505b60208210810362000db35762000db262000d55565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000e1d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000dde565b62000e29868362000dde565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000e7662000e7062000e6a8462000e41565b62000e4b565b62000e41565b9050919050565b6000819050919050565b62000e928362000e55565b62000eaa62000ea18262000e7d565b84845462000deb565b825550505050565b600090565b62000ec162000eb2565b62000ece81848462000e87565b505050565b5b8181101562000ef65762000eea60008262000eb7565b60018101905062000ed4565b5050565b601f82111562000f455762000f0f8162000db9565b62000f1a8462000dce565b8101602085101562000f2a578190505b62000f4262000f398562000dce565b83018262000ed3565b50505b505050565b600082821c905092915050565b600062000f6a6000198460080262000f4a565b1980831691505092915050565b600062000f85838362000f57565b9150826002028217905092915050565b62000fa08262000d4a565b67ffffffffffffffff81111562000fbc5762000fbb620008d8565b5b62000fc8825462000d84565b62000fd582828562000efa565b600060209050601f8311600181146200100d576000841562000ff8578287015190505b62001004858262000f77565b86555062001074565b601f1984166200101d8662000db9565b60005b82811015620010475784890151825560018201915060208501945060208101905062001020565b8683101562001067578489015162001063601f89168262000f57565b8355505b6001600288020188555050505b505050505050565b60006020828403121562001095576200109462000853565b5b6000620010a584828501620008ab565b91505092915050565b620010b9816200087d565b82525050565b6000604082019050620010d66000830185620010ae565b620010e56020830184620010ae565b9392505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062001135601f83620010ec565b91506200114282620010fd565b602082019050919050565b60006020820190508181036000830152620011688162001126565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620011ab8262000e41565b9150620011b88362000e41565b9250828201905080821115620011d357620011d26200116f565b5b92915050565b620011e48162000e41565b82525050565b6000602082019050620012016000830184620011d9565b92915050565b60805160a05160c05160e051614392620012876000396000818161296001528181612b1601528181612b6901528181612bea01528181612cf70152612e7d015260008181610d060152610fc801526000612f880152600081816129d301528181612a0601528181612db501528181613074015261309b01526143926000f3fe60806040526004361061021e5760003560e01c8063715018a611610123578063b62496f5116100ab578063e2f456051161006f578063e2f456051461080a578063f0f4426014610835578063f2ecd8f61461085e578063f2fde38b1461089b578063fde83a34146108c457610225565b8063b62496f514610713578063ba22abc314610750578063c024666814610779578063d7c94efd146107a2578063dd62ed3e146107cd57610225565b806395d89b41116100f257806395d89b411461061a57806398118cb4146106455780639a7a23d614610670578063a457c2d714610699578063a9059cbb146106d657610225565b8063715018a61461058457806379cc67901461059b5780637f6bf20a146105c45780638da5cb5b146105ef57610225565b8063313ce567116101a657806342966c681161017557806342966c681461048b57806349bd5a5e146104b45780634fbee193146104df57806361d027b31461051c57806370a082311461054757610225565b8063313ce567146103cf57806339509351146103fa5780633ba246b61461043757806340c10f191461046257610225565b806318160ddd116101ed57806318160ddd146102e85780631a8145bb14610313578063224290851461033e57806323b872dd146103675780632bc54702146103a457610225565b806306fdde031461022a578063095ea7b3146102555780630c44a69e1461029257806313114a9d146102bd57610225565b3661022557005b600080fd5b34801561023657600080fd5b5061023f6108ef565b60405161024c91906131fa565b60405180910390f35b34801561026157600080fd5b5061027c600480360381019061027791906132b5565b610981565b6040516102899190613310565b60405180910390f35b34801561029e57600080fd5b506102a761099f565b6040516102b4919061333a565b60405180910390f35b3480156102c957600080fd5b506102d26109a5565b6040516102df919061333a565b60405180910390f35b3480156102f457600080fd5b506102fd6109ab565b60405161030a919061333a565b60405180910390f35b34801561031f57600080fd5b506103286109b5565b604051610335919061333a565b60405180910390f35b34801561034a57600080fd5b5061036560048036038101906103609190613355565b6109bb565b005b34801561037357600080fd5b5061038e600480360381019061038991906133a8565b610ad7565b60405161039b9190613310565b60405180910390f35b3480156103b057600080fd5b506103b9610bcf565b6040516103c6919061333a565b60405180910390f35b3480156103db57600080fd5b506103e4610bd4565b6040516103f19190613417565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c91906132b5565b610bdd565b60405161042e9190613310565b60405180910390f35b34801561044357600080fd5b5061044c610c89565b604051610459919061333a565b60405180910390f35b34801561046e57600080fd5b50610489600480360381019061048491906132b5565b610c8f565b005b34801561049757600080fd5b506104b260048036038101906104ad9190613432565b610cf7565b005b3480156104c057600080fd5b506104c9610d04565b6040516104d6919061346e565b60405180910390f35b3480156104eb57600080fd5b5061050660048036038101906105019190613489565b610d28565b6040516105139190613310565b60405180910390f35b34801561052857600080fd5b50610531610d7e565b60405161053e919061346e565b60405180910390f35b34801561055357600080fd5b5061056e60048036038101906105699190613489565b610da4565b60405161057b919061333a565b60405180910390f35b34801561059057600080fd5b50610599610dec565b005b3480156105a757600080fd5b506105c260048036038101906105bd91906132b5565b610e74565b005b3480156105d057600080fd5b506105d9610e82565b6040516105e6919061333a565b60405180910390f35b3480156105fb57600080fd5b50610604610e88565b604051610611919061346e565b60405180910390f35b34801561062657600080fd5b5061062f610eb2565b60405161063c91906131fa565b60405180910390f35b34801561065157600080fd5b5061065a610f44565b604051610667919061333a565b60405180910390f35b34801561067c57600080fd5b50610697600480360381019061069291906134e2565b610f4a565b005b3480156106a557600080fd5b506106c060048036038101906106bb91906132b5565b61102c565b6040516106cd9190613310565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f891906132b5565b611117565b60405161070a9190613310565b60405180910390f35b34801561071f57600080fd5b5061073a60048036038101906107359190613489565b611135565b6040516107479190613310565b60405180910390f35b34801561075c57600080fd5b5061077760048036038101906107729190613432565b611155565b005b34801561078557600080fd5b506107a0600480360381019061079b91906134e2565b6111f7565b005b3480156107ae57600080fd5b506107b761131c565b6040516107c4919061333a565b60405180910390f35b3480156107d957600080fd5b506107f460048036038101906107ef9190613522565b611322565b604051610801919061333a565b60405180910390f35b34801561081657600080fd5b5061081f6113a9565b60405161082c919061333a565b60405180910390f35b34801561084157600080fd5b5061085c60048036038101906108579190613489565b6113d2565b005b34801561086a57600080fd5b5061088560048036038101906108809190613432565b6114f8565b604051610892919061346e565b60405180910390f35b3480156108a757600080fd5b506108c260048036038101906108bd9190613489565b611537565b005b3480156108d057600080fd5b506108d961162e565b6040516108e6919061333a565b60405180910390f35b6060600380546108fe90613591565b80601f016020809104026020016040519081016040528092919081815260200182805461092a90613591565b80156109775780601f1061094c57610100808354040283529160200191610977565b820191906000526020600020905b81548152906001019060200180831161095a57829003601f168201915b5050505050905090565b600061099561098e611634565b848461163c565b6001905092915050565b60135481565b600c5481565b6000600254905090565b60115481565b6109c3611634565b73ffffffffffffffffffffffffffffffffffffffff166109e1610e88565b73ffffffffffffffffffffffffffffffffffffffff1614610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e9061360e565b60405180910390fd5b82600d8190555081600e8190555080600f819055506064600f54600e54600d54610a61919061365d565b610a6b919061365d565b610a75919061365d565b600c819055506064600f541115610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab8906136dd565b60405180910390fd5b6101f4600c541115610ad257600080fd5b505050565b6000610ae4848484611805565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610b2f611634565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba69061376f565b60405180910390fd5b610bc385610bbb611634565b85840361163c565b60019150509392505050565b606481565b60006009905090565b6000610c7f610bea611634565b848460016000610bf8611634565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c7a919061365d565b61163c565b6001905092915050565b600d5481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ce957600080fd5b610cf38282611dd3565b5050565b610d013382611f32565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610df4611634565b73ffffffffffffffffffffffffffffffffffffffff16610e12610e88565b73ffffffffffffffffffffffffffffffffffffffff1614610e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5f9061360e565b60405180910390fd5b610e726000612108565b565b610e7e82826121ce565b5050565b60105481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ec190613591565b80601f0160208091040260200160405190810160405280929190818152602001828054610eed90613591565b8015610f3a5780601f10610f0f57610100808354040283529160200191610f3a565b820191906000526020600020905b815481529060010190602001808311610f1d57829003601f168201915b5050505050905090565b600e5481565b610f52611634565b73ffffffffffffffffffffffffffffffffffffffff16610f70610e88565b73ffffffffffffffffffffffffffffffffffffffff1614610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd9061360e565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361101e57600080fd5b6110288282612201565b5050565b6000806001600061103b611634565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156110f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ef90613801565b60405180910390fd5b61110c611103611634565b8585840361163c565b600191505092915050565b600061112b611124611634565b8484611805565b6001905092915050565b60156020528060005260406000206000915054906101000a900460ff1681565b61115d611634565b73ffffffffffffffffffffffffffffffffffffffff1661117b610e88565b73ffffffffffffffffffffffffffffffffffffffff16146111d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c89061360e565b60405180910390fd5b60018110156111df57600080fd5b60328111156111ed57600080fd5b80600b8190555050565b6111ff611634565b73ffffffffffffffffffffffffffffffffffffffff1661121d610e88565b73ffffffffffffffffffffffffffffffffffffffff1614611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061360e565b60405180910390fd5b80601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516113109190613310565b60405180910390a25050565b600f5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000612710600b546113b96109ab565b6113c39190613821565b6113cd9190613892565b905090565b6113da611634565b73ffffffffffffffffffffffffffffffffffffffff166113f8610e88565b73ffffffffffffffffffffffffffffffffffffffff161461144e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114459061360e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114a957600080fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506114f58160016111f7565b50565b6006818154811061150857600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61153f611634565b73ffffffffffffffffffffffffffffffffffffffff1661155d610e88565b73ffffffffffffffffffffffffffffffffffffffff16146115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa9061360e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990613935565b60405180910390fd5b61162b81612108565b50565b60125481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a2906139c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171190613a59565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117f8919061333a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186b90613aeb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118da90613b7d565b60405180910390fd5b600081036118fc576118f7838360006122a2565b611dce565b600061190730610da4565b905060006119136113a9565b82101590508080156119325750600960149054906101000a900460ff16155b80156119885750601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156119de5750601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611a345750601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611a78576001600960146101000a81548160ff021916908315150217905550611a5c612521565b6000600960146101000a81548160ff0219169083151502179055505b6000600960149054906101000a900460ff16159050601460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611b2e5750601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611b3857600090505b60008115611dbe57601560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611be15750601560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8015611bef57506000600c54115b15611d9a57612710600c5486611c059190613821565b611c0f9190613892565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b242e7cf326040518263ffffffff1660e01b8152600401611c6c919061346e565b602060405180830381865afa158015611c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cad9190613bb2565b15611cce576004600382611cc19190613821565b611ccb9190613892565b90505b600c54600e5482611cdf9190613821565b611ce99190613892565b60116000828254611cfa919061365d565b92505081905550600c54600f5482611d129190613821565b611d1c9190613892565b60126000828254611d2d919061365d565b92505081905550600c54600d5482611d459190613821565b611d4f9190613892565b60106000828254611d60919061365d565b92505081905550600c54606482611d779190613821565b611d819190613892565b60136000828254611d92919061365d565b925050819055505b6000811115611daf57611dae8730836122a2565b5b8085611dbb9190613bdf565b94505b611dc98787876122a2565b505050505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3990613c5f565b60405180910390fd5b611e4e600083836128b4565b8060026000828254611e60919061365d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eb5919061365d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f1a919061333a565b60405180910390a3611f2e600083836128b9565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9890613cf1565b60405180910390fd5b611fad826000836128b4565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a90613d83565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461208a9190613bdf565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516120ef919061333a565b60405180910390a3612103836000846128b9565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000816121db8433611322565b6121e59190613bdf565b90506121f283338361163c565b6121fc8383611f32565b505050565b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230890613aeb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612380576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237790613b7d565b60405180910390fd5b61238b8383836128b4565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240890613e15565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a4919061365d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612508919061333a565b60405180910390a361251b8484846128b9565b50505050565b600061252c30610da4565b90506000601354601254601054601154612546919061365d565b612550919061365d565b61255a919061365d565b905060008083148061256c5750600082145b15612579575050506128b2565b60006002836011548661258c9190613821565b6125969190613892565b6125a09190613892565b9050600081856125b09190613bdf565b90506000806125bf83876128be565b91509150600060026011546125d49190613892565b876125df9190613bdf565b601254846125ed9190613821565b6125f79190613892565b90506000600260115461260a9190613892565b886126159190613bdf565b601354856126239190613821565b61262d9190613892565b905060008382848761263f9190613bdf565b6126499190613bdf565b6126539190613bdf565b9050600060118190555060006010819055506000601281905550600060138190555061267d610e88565b73ffffffffffffffffffffffffffffffffffffffff16836040516126a090613e66565b60006040518083038185875af1925050503d80600081146126dd576040519150601f19603f3d011682016040523d82523d6000602084013e6126e2565b606091505b5050809850506000871180156126f85750600081115b1561274557612707878261306e565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561868260115460405161273c93929190613e7b565b60405180910390a15b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d89190613ec7565b90508073ffffffffffffffffffffffffffffffffffffffff16476040516127fe90613e66565b60006040518083038185875af1925050503d806000811461283b576040519150601f19603f3d011682016040523d82523d6000602084013e612840565b606091505b5050809950508073ffffffffffffffffffffffffffffffffffffffff16632b5335c36040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561288e57600080fd5b505af11580156128a2573d6000803e3d6000fd5b5050505050505050505050505050505b565b505050565b505050565b6000806000600267ffffffffffffffff8111156128de576128dd613ef4565b5b60405190808252806020026020018201604052801561290c5781602001602082028036833780820191505090505b509050308160008151811061292457612923613f23565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061299357612992613f23565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a04307f00000000000000000000000000000000000000000000000000000000000000006001886129ff919061365d565b61163c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478660008430426040518663ffffffff1660e01b8152600401612a66959493929190614055565b600060405180830381600087803b158015612a8057600080fd5b505af1158015612a94573d6000803e3d6000fd5b505050504792506002601154612aaa9190613892565b84612ab59190613bdf565b60105484612ac39190613821565b612acd9190613892565b915060006006600a5481548110612ae757612ae6613f23565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612cae577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015612bcf57600080fd5b505af1158015612be3573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401612c659291906140af565b6020604051808303816000875af1158015612c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca89190613bb2565b50613027565b60006007600a5481548110612cc657612cc5613f23565b5b90600052602060002090600a91828204019190066003029054906101000a900462ffffff1662ffffff1603612e6d577f000000000000000000000000000000000000000000000000000000000000000082600081518110612d2a57612d29613f23565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508082600181518110612d7957612d78613f23565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b6f9de9584600085600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401612e3694939291906140d8565b6000604051808303818588803b158015612e4f57600080fd5b505af1158015612e63573d6000803e3d6000fd5b5050505050613026565b60006040518061010001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020016007600a5481548110612ee957612ee8613f23565b5b90600052602060002090600a91828204019190066003029054906101000a900462ffffff1662ffffff168152602001600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200142815260200185815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663414bf38985836040518363ffffffff1660e01b8152600401612fe09190614202565b60206040518083038185885af1158015612ffe573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130239190614233565b50505b5b60016006805490506130399190613bdf565b600a540361304e576000600a81905550613065565b600a6000815461305d90614260565b919050819055505b50509250929050565b613099307f00000000000000000000000000000000000000000000000000000000000000008461163c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401613120969594939291906142a8565b60606040518083038185885af115801561313e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906131639190614309565b5050505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131a4578082015181840152602081019050613189565b60008484015250505050565b6000601f19601f8301169050919050565b60006131cc8261316a565b6131d68185613175565b93506131e6818560208601613186565b6131ef816131b0565b840191505092915050565b6000602082019050818103600083015261321481846131c1565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061324c82613221565b9050919050565b61325c81613241565b811461326757600080fd5b50565b60008135905061327981613253565b92915050565b6000819050919050565b6132928161327f565b811461329d57600080fd5b50565b6000813590506132af81613289565b92915050565b600080604083850312156132cc576132cb61321c565b5b60006132da8582860161326a565b92505060206132eb858286016132a0565b9150509250929050565b60008115159050919050565b61330a816132f5565b82525050565b60006020820190506133256000830184613301565b92915050565b6133348161327f565b82525050565b600060208201905061334f600083018461332b565b92915050565b60008060006060848603121561336e5761336d61321c565b5b600061337c868287016132a0565b935050602061338d868287016132a0565b925050604061339e868287016132a0565b9150509250925092565b6000806000606084860312156133c1576133c061321c565b5b60006133cf8682870161326a565b93505060206133e08682870161326a565b92505060406133f1868287016132a0565b9150509250925092565b600060ff82169050919050565b613411816133fb565b82525050565b600060208201905061342c6000830184613408565b92915050565b6000602082840312156134485761344761321c565b5b6000613456848285016132a0565b91505092915050565b61346881613241565b82525050565b6000602082019050613483600083018461345f565b92915050565b60006020828403121561349f5761349e61321c565b5b60006134ad8482850161326a565b91505092915050565b6134bf816132f5565b81146134ca57600080fd5b50565b6000813590506134dc816134b6565b92915050565b600080604083850312156134f9576134f861321c565b5b60006135078582860161326a565b9250506020613518858286016134cd565b9150509250929050565b600080604083850312156135395761353861321c565b5b60006135478582860161326a565b92505060206135588582860161326a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135a957607f821691505b6020821081036135bc576135bb613562565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135f8602083613175565b9150613603826135c2565b602082019050919050565b60006020820190508181036000830152613627816135eb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136688261327f565b91506136738361327f565b925082820190508082111561368b5761368a61362e565b5b92915050565b7f5465616d20666565203c3d203125000000000000000000000000000000000000600082015250565b60006136c7600e83613175565b91506136d282613691565b602082019050919050565b600060208201905081810360008301526136f6816136ba565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613759602883613175565b9150613764826136fd565b604082019050919050565b600060208201905081810360008301526137888161374c565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006137eb602583613175565b91506137f68261378f565b604082019050919050565b6000602082019050818103600083015261381a816137de565b9050919050565b600061382c8261327f565b91506138378361327f565b92508282026138458161327f565b9150828204841483151761385c5761385b61362e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061389d8261327f565b91506138a88361327f565b9250826138b8576138b7613863565b5b828204905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061391f602683613175565b915061392a826138c3565b604082019050919050565b6000602082019050818103600083015261394e81613912565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006139b1602483613175565b91506139bc82613955565b604082019050919050565b600060208201905081810360008301526139e0816139a4565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a43602283613175565b9150613a4e826139e7565b604082019050919050565b60006020820190508181036000830152613a7281613a36565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613ad5602583613175565b9150613ae082613a79565b604082019050919050565b60006020820190508181036000830152613b0481613ac8565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613b67602383613175565b9150613b7282613b0b565b604082019050919050565b60006020820190508181036000830152613b9681613b5a565b9050919050565b600081519050613bac816134b6565b92915050565b600060208284031215613bc857613bc761321c565b5b6000613bd684828501613b9d565b91505092915050565b6000613bea8261327f565b9150613bf58361327f565b9250828203905081811115613c0d57613c0c61362e565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613c49601f83613175565b9150613c5482613c13565b602082019050919050565b60006020820190508181036000830152613c7881613c3c565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cdb602183613175565b9150613ce682613c7f565b604082019050919050565b60006020820190508181036000830152613d0a81613cce565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d6d602283613175565b9150613d7882613d11565b604082019050919050565b60006020820190508181036000830152613d9c81613d60565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613dff602683613175565b9150613e0a82613da3565b604082019050919050565b60006020820190508181036000830152613e2e81613df2565b9050919050565b600081905092915050565b50565b6000613e50600083613e35565b9150613e5b82613e40565b600082019050919050565b6000613e7182613e43565b9150819050919050565b6000606082019050613e90600083018661332b565b613e9d602083018561332b565b613eaa604083018461332b565b949350505050565b600081519050613ec181613253565b92915050565b600060208284031215613edd57613edc61321c565b5b6000613eeb84828501613eb2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b6000613f81613f7c613f7784613f52565b613f5c565b61327f565b9050919050565b613f9181613f66565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613fcc81613241565b82525050565b6000613fde8383613fc3565b60208301905092915050565b6000602082019050919050565b600061400282613f97565b61400c8185613fa2565b935061401783613fb3565b8060005b8381101561404857815161402f8882613fd2565b975061403a83613fea565b92505060018101905061401b565b5085935050505092915050565b600060a08201905061406a600083018861332b565b6140776020830187613f88565b81810360408301526140898186613ff7565b9050614098606083018561345f565b6140a5608083018461332b565b9695505050505050565b60006040820190506140c4600083018561345f565b6140d1602083018461332b565b9392505050565b60006080820190506140ed6000830187613f88565b81810360208301526140ff8186613ff7565b905061410e604083018561345f565b61411b606083018461332b565b95945050505050565b600062ffffff82169050919050565b61413c81614124565b82525050565b61414b8161327f565b82525050565b61415a81613221565b82525050565b610100820160008201516141776000850182613fc3565b50602082015161418a6020850182613fc3565b50604082015161419d6040850182614133565b5060608201516141b06060850182613fc3565b5060808201516141c36080850182614142565b5060a08201516141d660a0850182614142565b5060c08201516141e960c0850182614142565b5060e08201516141fc60e0850182614151565b50505050565b6000610100820190506142186000830184614160565b92915050565b60008151905061422d81613289565b92915050565b6000602082840312156142495761424861321c565b5b60006142578482850161421e565b91505092915050565b600061426b8261327f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361429d5761429c61362e565b5b600182019050919050565b600060c0820190506142bd600083018961345f565b6142ca602083018861332b565b6142d76040830187613f88565b6142e46060830186613f88565b6142f1608083018561345f565b6142fe60a083018461332b565b979650505050505050565b6000806000606084860312156143225761432161321c565b5b60006143308682870161421e565b93505060206143418682870161421e565b92505060406143528682870161421e565b915050925092509256fea2646970667358221220603c15ab85d00aabce809e97713724c4fd001bcc83ae4e7a5336c9b0b799d8d764736f6c634300081300330000000000000000000000003230aa07f66c5c30ff7e01d1554c6095d916815d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000020000000000000000000000002890df158d76e584877a1d17a85fea3aeeb85aa6000000000000000000000000aaee1a9723aadb7afa2810263653a34ba2c21c7a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000546756d6f67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000546554d4f47000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061021e5760003560e01c8063715018a611610123578063b62496f5116100ab578063e2f456051161006f578063e2f456051461080a578063f0f4426014610835578063f2ecd8f61461085e578063f2fde38b1461089b578063fde83a34146108c457610225565b8063b62496f514610713578063ba22abc314610750578063c024666814610779578063d7c94efd146107a2578063dd62ed3e146107cd57610225565b806395d89b41116100f257806395d89b411461061a57806398118cb4146106455780639a7a23d614610670578063a457c2d714610699578063a9059cbb146106d657610225565b8063715018a61461058457806379cc67901461059b5780637f6bf20a146105c45780638da5cb5b146105ef57610225565b8063313ce567116101a657806342966c681161017557806342966c681461048b57806349bd5a5e146104b45780634fbee193146104df57806361d027b31461051c57806370a082311461054757610225565b8063313ce567146103cf57806339509351146103fa5780633ba246b61461043757806340c10f191461046257610225565b806318160ddd116101ed57806318160ddd146102e85780631a8145bb14610313578063224290851461033e57806323b872dd146103675780632bc54702146103a457610225565b806306fdde031461022a578063095ea7b3146102555780630c44a69e1461029257806313114a9d146102bd57610225565b3661022557005b600080fd5b34801561023657600080fd5b5061023f6108ef565b60405161024c91906131fa565b60405180910390f35b34801561026157600080fd5b5061027c600480360381019061027791906132b5565b610981565b6040516102899190613310565b60405180910390f35b34801561029e57600080fd5b506102a761099f565b6040516102b4919061333a565b60405180910390f35b3480156102c957600080fd5b506102d26109a5565b6040516102df919061333a565b60405180910390f35b3480156102f457600080fd5b506102fd6109ab565b60405161030a919061333a565b60405180910390f35b34801561031f57600080fd5b506103286109b5565b604051610335919061333a565b60405180910390f35b34801561034a57600080fd5b5061036560048036038101906103609190613355565b6109bb565b005b34801561037357600080fd5b5061038e600480360381019061038991906133a8565b610ad7565b60405161039b9190613310565b60405180910390f35b3480156103b057600080fd5b506103b9610bcf565b6040516103c6919061333a565b60405180910390f35b3480156103db57600080fd5b506103e4610bd4565b6040516103f19190613417565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c91906132b5565b610bdd565b60405161042e9190613310565b60405180910390f35b34801561044357600080fd5b5061044c610c89565b604051610459919061333a565b60405180910390f35b34801561046e57600080fd5b50610489600480360381019061048491906132b5565b610c8f565b005b34801561049757600080fd5b506104b260048036038101906104ad9190613432565b610cf7565b005b3480156104c057600080fd5b506104c9610d04565b6040516104d6919061346e565b60405180910390f35b3480156104eb57600080fd5b5061050660048036038101906105019190613489565b610d28565b6040516105139190613310565b60405180910390f35b34801561052857600080fd5b50610531610d7e565b60405161053e919061346e565b60405180910390f35b34801561055357600080fd5b5061056e60048036038101906105699190613489565b610da4565b60405161057b919061333a565b60405180910390f35b34801561059057600080fd5b50610599610dec565b005b3480156105a757600080fd5b506105c260048036038101906105bd91906132b5565b610e74565b005b3480156105d057600080fd5b506105d9610e82565b6040516105e6919061333a565b60405180910390f35b3480156105fb57600080fd5b50610604610e88565b604051610611919061346e565b60405180910390f35b34801561062657600080fd5b5061062f610eb2565b60405161063c91906131fa565b60405180910390f35b34801561065157600080fd5b5061065a610f44565b604051610667919061333a565b60405180910390f35b34801561067c57600080fd5b50610697600480360381019061069291906134e2565b610f4a565b005b3480156106a557600080fd5b506106c060048036038101906106bb91906132b5565b61102c565b6040516106cd9190613310565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f891906132b5565b611117565b60405161070a9190613310565b60405180910390f35b34801561071f57600080fd5b5061073a60048036038101906107359190613489565b611135565b6040516107479190613310565b60405180910390f35b34801561075c57600080fd5b5061077760048036038101906107729190613432565b611155565b005b34801561078557600080fd5b506107a0600480360381019061079b91906134e2565b6111f7565b005b3480156107ae57600080fd5b506107b761131c565b6040516107c4919061333a565b60405180910390f35b3480156107d957600080fd5b506107f460048036038101906107ef9190613522565b611322565b604051610801919061333a565b60405180910390f35b34801561081657600080fd5b5061081f6113a9565b60405161082c919061333a565b60405180910390f35b34801561084157600080fd5b5061085c60048036038101906108579190613489565b6113d2565b005b34801561086a57600080fd5b5061088560048036038101906108809190613432565b6114f8565b604051610892919061346e565b60405180910390f35b3480156108a757600080fd5b506108c260048036038101906108bd9190613489565b611537565b005b3480156108d057600080fd5b506108d961162e565b6040516108e6919061333a565b60405180910390f35b6060600380546108fe90613591565b80601f016020809104026020016040519081016040528092919081815260200182805461092a90613591565b80156109775780601f1061094c57610100808354040283529160200191610977565b820191906000526020600020905b81548152906001019060200180831161095a57829003601f168201915b5050505050905090565b600061099561098e611634565b848461163c565b6001905092915050565b60135481565b600c5481565b6000600254905090565b60115481565b6109c3611634565b73ffffffffffffffffffffffffffffffffffffffff166109e1610e88565b73ffffffffffffffffffffffffffffffffffffffff1614610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e9061360e565b60405180910390fd5b82600d8190555081600e8190555080600f819055506064600f54600e54600d54610a61919061365d565b610a6b919061365d565b610a75919061365d565b600c819055506064600f541115610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab8906136dd565b60405180910390fd5b6101f4600c541115610ad257600080fd5b505050565b6000610ae4848484611805565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610b2f611634565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba69061376f565b60405180910390fd5b610bc385610bbb611634565b85840361163c565b60019150509392505050565b606481565b60006009905090565b6000610c7f610bea611634565b848460016000610bf8611634565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c7a919061365d565b61163c565b6001905092915050565b600d5481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ce957600080fd5b610cf38282611dd3565b5050565b610d013382611f32565b50565b7f000000000000000000000000db98950d58c62b8299192300d47294f20c09384781565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610df4611634565b73ffffffffffffffffffffffffffffffffffffffff16610e12610e88565b73ffffffffffffffffffffffffffffffffffffffff1614610e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5f9061360e565b60405180910390fd5b610e726000612108565b565b610e7e82826121ce565b5050565b60105481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ec190613591565b80601f0160208091040260200160405190810160405280929190818152602001828054610eed90613591565b8015610f3a5780601f10610f0f57610100808354040283529160200191610f3a565b820191906000526020600020905b815481529060010190602001808311610f1d57829003601f168201915b5050505050905090565b600e5481565b610f52611634565b73ffffffffffffffffffffffffffffffffffffffff16610f70610e88565b73ffffffffffffffffffffffffffffffffffffffff1614610fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbd9061360e565b60405180910390fd5b7f000000000000000000000000db98950d58c62b8299192300d47294f20c09384773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361101e57600080fd5b6110288282612201565b5050565b6000806001600061103b611634565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156110f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ef90613801565b60405180910390fd5b61110c611103611634565b8585840361163c565b600191505092915050565b600061112b611124611634565b8484611805565b6001905092915050565b60156020528060005260406000206000915054906101000a900460ff1681565b61115d611634565b73ffffffffffffffffffffffffffffffffffffffff1661117b610e88565b73ffffffffffffffffffffffffffffffffffffffff16146111d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c89061360e565b60405180910390fd5b60018110156111df57600080fd5b60328111156111ed57600080fd5b80600b8190555050565b6111ff611634565b73ffffffffffffffffffffffffffffffffffffffff1661121d610e88565b73ffffffffffffffffffffffffffffffffffffffff1614611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061360e565b60405180910390fd5b80601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516113109190613310565b60405180910390a25050565b600f5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000612710600b546113b96109ab565b6113c39190613821565b6113cd9190613892565b905090565b6113da611634565b73ffffffffffffffffffffffffffffffffffffffff166113f8610e88565b73ffffffffffffffffffffffffffffffffffffffff161461144e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114459061360e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114a957600080fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506114f58160016111f7565b50565b6006818154811061150857600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61153f611634565b73ffffffffffffffffffffffffffffffffffffffff1661155d610e88565b73ffffffffffffffffffffffffffffffffffffffff16146115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa9061360e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990613935565b60405180910390fd5b61162b81612108565b50565b60125481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a2906139c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171190613a59565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117f8919061333a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186b90613aeb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118da90613b7d565b60405180910390fd5b600081036118fc576118f7838360006122a2565b611dce565b600061190730610da4565b905060006119136113a9565b82101590508080156119325750600960149054906101000a900460ff16155b80156119885750601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156119de5750601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611a345750601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611a78576001600960146101000a81548160ff021916908315150217905550611a5c612521565b6000600960146101000a81548160ff0219169083151502179055505b6000600960149054906101000a900460ff16159050601460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611b2e5750601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611b3857600090505b60008115611dbe57601560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611be15750601560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8015611bef57506000600c54115b15611d9a57612710600c5486611c059190613821565b611c0f9190613892565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b242e7cf326040518263ffffffff1660e01b8152600401611c6c919061346e565b602060405180830381865afa158015611c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cad9190613bb2565b15611cce576004600382611cc19190613821565b611ccb9190613892565b90505b600c54600e5482611cdf9190613821565b611ce99190613892565b60116000828254611cfa919061365d565b92505081905550600c54600f5482611d129190613821565b611d1c9190613892565b60126000828254611d2d919061365d565b92505081905550600c54600d5482611d459190613821565b611d4f9190613892565b60106000828254611d60919061365d565b92505081905550600c54606482611d779190613821565b611d819190613892565b60136000828254611d92919061365d565b925050819055505b6000811115611daf57611dae8730836122a2565b5b8085611dbb9190613bdf565b94505b611dc98787876122a2565b505050505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3990613c5f565b60405180910390fd5b611e4e600083836128b4565b8060026000828254611e60919061365d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eb5919061365d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f1a919061333a565b60405180910390a3611f2e600083836128b9565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9890613cf1565b60405180910390fd5b611fad826000836128b4565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a90613d83565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461208a9190613bdf565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516120ef919061333a565b60405180910390a3612103836000846128b9565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000816121db8433611322565b6121e59190613bdf565b90506121f283338361163c565b6121fc8383611f32565b505050565b80601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230890613aeb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612380576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237790613b7d565b60405180910390fd5b61238b8383836128b4565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240890613e15565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a4919061365d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612508919061333a565b60405180910390a361251b8484846128b9565b50505050565b600061252c30610da4565b90506000601354601254601054601154612546919061365d565b612550919061365d565b61255a919061365d565b905060008083148061256c5750600082145b15612579575050506128b2565b60006002836011548661258c9190613821565b6125969190613892565b6125a09190613892565b9050600081856125b09190613bdf565b90506000806125bf83876128be565b91509150600060026011546125d49190613892565b876125df9190613bdf565b601254846125ed9190613821565b6125f79190613892565b90506000600260115461260a9190613892565b886126159190613bdf565b601354856126239190613821565b61262d9190613892565b905060008382848761263f9190613bdf565b6126499190613bdf565b6126539190613bdf565b9050600060118190555060006010819055506000601281905550600060138190555061267d610e88565b73ffffffffffffffffffffffffffffffffffffffff16836040516126a090613e66565b60006040518083038185875af1925050503d80600081146126dd576040519150601f19603f3d011682016040523d82523d6000602084013e6126e2565b606091505b5050809850506000871180156126f85750600081115b1561274557612707878261306e565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561868260115460405161273c93929190613e7b565b60405180910390a15b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663412753586040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d89190613ec7565b90508073ffffffffffffffffffffffffffffffffffffffff16476040516127fe90613e66565b60006040518083038185875af1925050503d806000811461283b576040519150601f19603f3d011682016040523d82523d6000602084013e612840565b606091505b5050809950508073ffffffffffffffffffffffffffffffffffffffff16632b5335c36040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561288e57600080fd5b505af11580156128a2573d6000803e3d6000fd5b5050505050505050505050505050505b565b505050565b505050565b6000806000600267ffffffffffffffff8111156128de576128dd613ef4565b5b60405190808252806020026020018201604052801561290c5781602001602082028036833780820191505090505b509050308160008151811061292457612923613f23565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061299357612992613f23565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a04307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001886129ff919061365d565b61163c565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478660008430426040518663ffffffff1660e01b8152600401612a66959493929190614055565b600060405180830381600087803b158015612a8057600080fd5b505af1158015612a94573d6000803e3d6000fd5b505050504792506002601154612aaa9190613892565b84612ab59190613bdf565b60105484612ac39190613821565b612acd9190613892565b915060006006600a5481548110612ae757612ae6613f23565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612cae577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015612bcf57600080fd5b505af1158015612be3573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401612c659291906140af565b6020604051808303816000875af1158015612c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca89190613bb2565b50613027565b60006007600a5481548110612cc657612cc5613f23565b5b90600052602060002090600a91828204019190066003029054906101000a900462ffffff1662ffffff1603612e6d577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc282600081518110612d2a57612d29613f23565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508082600181518110612d7957612d78613f23565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663b6f9de9584600085600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401612e3694939291906140d8565b6000604051808303818588803b158015612e4f57600080fd5b505af1158015612e63573d6000803e3d6000fd5b5050505050613026565b60006040518061010001604052807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020016007600a5481548110612ee957612ee8613f23565b5b90600052602060002090600a91828204019190066003029054906101000a900462ffffff1662ffffff168152602001600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200142815260200185815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090507f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1663414bf38985836040518363ffffffff1660e01b8152600401612fe09190614202565b60206040518083038185885af1158015612ffe573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130239190614233565b50505b5b60016006805490506130399190613bdf565b600a540361304e576000600a81905550613065565b600a6000815461305d90614260565b919050819055505b50509250929050565b613099307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461163c565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401613120969594939291906142a8565b60606040518083038185885af115801561313e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906131639190614309565b5050505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131a4578082015181840152602081019050613189565b60008484015250505050565b6000601f19601f8301169050919050565b60006131cc8261316a565b6131d68185613175565b93506131e6818560208601613186565b6131ef816131b0565b840191505092915050565b6000602082019050818103600083015261321481846131c1565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061324c82613221565b9050919050565b61325c81613241565b811461326757600080fd5b50565b60008135905061327981613253565b92915050565b6000819050919050565b6132928161327f565b811461329d57600080fd5b50565b6000813590506132af81613289565b92915050565b600080604083850312156132cc576132cb61321c565b5b60006132da8582860161326a565b92505060206132eb858286016132a0565b9150509250929050565b60008115159050919050565b61330a816132f5565b82525050565b60006020820190506133256000830184613301565b92915050565b6133348161327f565b82525050565b600060208201905061334f600083018461332b565b92915050565b60008060006060848603121561336e5761336d61321c565b5b600061337c868287016132a0565b935050602061338d868287016132a0565b925050604061339e868287016132a0565b9150509250925092565b6000806000606084860312156133c1576133c061321c565b5b60006133cf8682870161326a565b93505060206133e08682870161326a565b92505060406133f1868287016132a0565b9150509250925092565b600060ff82169050919050565b613411816133fb565b82525050565b600060208201905061342c6000830184613408565b92915050565b6000602082840312156134485761344761321c565b5b6000613456848285016132a0565b91505092915050565b61346881613241565b82525050565b6000602082019050613483600083018461345f565b92915050565b60006020828403121561349f5761349e61321c565b5b60006134ad8482850161326a565b91505092915050565b6134bf816132f5565b81146134ca57600080fd5b50565b6000813590506134dc816134b6565b92915050565b600080604083850312156134f9576134f861321c565b5b60006135078582860161326a565b9250506020613518858286016134cd565b9150509250929050565b600080604083850312156135395761353861321c565b5b60006135478582860161326a565b92505060206135588582860161326a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135a957607f821691505b6020821081036135bc576135bb613562565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135f8602083613175565b9150613603826135c2565b602082019050919050565b60006020820190508181036000830152613627816135eb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136688261327f565b91506136738361327f565b925082820190508082111561368b5761368a61362e565b5b92915050565b7f5465616d20666565203c3d203125000000000000000000000000000000000000600082015250565b60006136c7600e83613175565b91506136d282613691565b602082019050919050565b600060208201905081810360008301526136f6816136ba565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613759602883613175565b9150613764826136fd565b604082019050919050565b600060208201905081810360008301526137888161374c565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006137eb602583613175565b91506137f68261378f565b604082019050919050565b6000602082019050818103600083015261381a816137de565b9050919050565b600061382c8261327f565b91506138378361327f565b92508282026138458161327f565b9150828204841483151761385c5761385b61362e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061389d8261327f565b91506138a88361327f565b9250826138b8576138b7613863565b5b828204905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061391f602683613175565b915061392a826138c3565b604082019050919050565b6000602082019050818103600083015261394e81613912565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006139b1602483613175565b91506139bc82613955565b604082019050919050565b600060208201905081810360008301526139e0816139a4565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a43602283613175565b9150613a4e826139e7565b604082019050919050565b60006020820190508181036000830152613a7281613a36565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613ad5602583613175565b9150613ae082613a79565b604082019050919050565b60006020820190508181036000830152613b0481613ac8565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613b67602383613175565b9150613b7282613b0b565b604082019050919050565b60006020820190508181036000830152613b9681613b5a565b9050919050565b600081519050613bac816134b6565b92915050565b600060208284031215613bc857613bc761321c565b5b6000613bd684828501613b9d565b91505092915050565b6000613bea8261327f565b9150613bf58361327f565b9250828203905081811115613c0d57613c0c61362e565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613c49601f83613175565b9150613c5482613c13565b602082019050919050565b60006020820190508181036000830152613c7881613c3c565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cdb602183613175565b9150613ce682613c7f565b604082019050919050565b60006020820190508181036000830152613d0a81613cce565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d6d602283613175565b9150613d7882613d11565b604082019050919050565b60006020820190508181036000830152613d9c81613d60565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613dff602683613175565b9150613e0a82613da3565b604082019050919050565b60006020820190508181036000830152613e2e81613df2565b9050919050565b600081905092915050565b50565b6000613e50600083613e35565b9150613e5b82613e40565b600082019050919050565b6000613e7182613e43565b9150819050919050565b6000606082019050613e90600083018661332b565b613e9d602083018561332b565b613eaa604083018461332b565b949350505050565b600081519050613ec181613253565b92915050565b600060208284031215613edd57613edc61321c565b5b6000613eeb84828501613eb2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b6000613f81613f7c613f7784613f52565b613f5c565b61327f565b9050919050565b613f9181613f66565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613fcc81613241565b82525050565b6000613fde8383613fc3565b60208301905092915050565b6000602082019050919050565b600061400282613f97565b61400c8185613fa2565b935061401783613fb3565b8060005b8381101561404857815161402f8882613fd2565b975061403a83613fea565b92505060018101905061401b565b5085935050505092915050565b600060a08201905061406a600083018861332b565b6140776020830187613f88565b81810360408301526140898186613ff7565b9050614098606083018561345f565b6140a5608083018461332b565b9695505050505050565b60006040820190506140c4600083018561345f565b6140d1602083018461332b565b9392505050565b60006080820190506140ed6000830187613f88565b81810360208301526140ff8186613ff7565b905061410e604083018561345f565b61411b606083018461332b565b95945050505050565b600062ffffff82169050919050565b61413c81614124565b82525050565b61414b8161327f565b82525050565b61415a81613221565b82525050565b610100820160008201516141776000850182613fc3565b50602082015161418a6020850182613fc3565b50604082015161419d6040850182614133565b5060608201516141b06060850182613fc3565b5060808201516141c36080850182614142565b5060a08201516141d660a0850182614142565b5060c08201516141e960c0850182614142565b5060e08201516141fc60e0850182614151565b50505050565b6000610100820190506142186000830184614160565b92915050565b60008151905061422d81613289565b92915050565b6000602082840312156142495761424861321c565b5b60006142578482850161421e565b91505092915050565b600061426b8261327f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361429d5761429c61362e565b5b600182019050919050565b600060c0820190506142bd600083018961345f565b6142ca602083018861332b565b6142d76040830187613f88565b6142e46060830186613f88565b6142f1608083018561345f565b6142fe60a083018461332b565b979650505050505050565b6000806000606084860312156143225761432161321c565b5b60006143308682870161421e565b93505060206143418682870161421e565b92505060406143528682870161421e565b915050925092509256fea2646970667358221220603c15ab85d00aabce809e97713724c4fd001bcc83ae4e7a5336c9b0b799d8d764736f6c63430008130033

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

0000000000000000000000003230aa07f66c5c30ff7e01d1554c6095d916815d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000020000000000000000000000002890df158d76e584877a1d17a85fea3aeeb85aa6000000000000000000000000aaee1a9723aadb7afa2810263653a34ba2c21c7a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000546756d6f67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000546554d4f47000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _qwaFactory (address): 0x3230AA07F66c5c30FF7e01D1554c6095D916815D
Arg [1] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : _backingTokens (address[]): 0x2890dF158D76E584877a1D17A85FEA3aeeB85aa6,0xaaeE1A9723aaDB7afA2810263653A34bA2C21C7a
Arg [3] : _backingTokensV3Fee (uint24[]): 10000,0
Arg [4] : _name (string): Fumog
Arg [5] : _symbol (string): FUMOG

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 0000000000000000000000003230aa07f66c5c30ff7e01d1554c6095d916815d
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [5] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [7] : 0000000000000000000000002890df158d76e584877a1d17a85fea3aeeb85aa6
Arg [8] : 000000000000000000000000aaee1a9723aadb7afa2810263653a34ba2c21c7a
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [10] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [13] : 46756d6f67000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [15] : 46554d4f47000000000000000000000000000000000000000000000000000000


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.